typekro 0.38.2 → 0.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.d.ts +29 -2
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.d.ts.map +1 -1
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.js +298 -46
- package/dist/factories/clickstack/compositions/clickstack-bootstrap.js.map +1 -1
- package/dist/factories/clickstack/hyperdx-oidc/index.d.ts +2 -2
- package/dist/factories/clickstack/hyperdx-oidc/index.d.ts.map +1 -1
- package/dist/factories/clickstack/hyperdx-oidc/index.js +25 -8
- package/dist/factories/clickstack/hyperdx-oidc/index.js.map +1 -1
- package/dist/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.d.ts.map +1 -1
- package/dist/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.js +4 -4
- package/dist/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.js.map +1 -1
- package/dist/factories/clickstack/types.d.ts +106 -1
- package/dist/factories/clickstack/types.d.ts.map +1 -1
- package/dist/factories/clickstack/types.js +123 -1
- package/dist/factories/clickstack/types.js.map +1 -1
- package/dist/factories/clickstack/utils/helm-values-mapper.d.ts +71 -2
- package/dist/factories/clickstack/utils/helm-values-mapper.d.ts.map +1 -1
- package/dist/factories/clickstack/utils/helm-values-mapper.js +112 -111
- package/dist/factories/clickstack/utils/helm-values-mapper.js.map +1 -1
- package/dist/factories/clickstack/utils/team-defaults.d.ts +87 -0
- package/dist/factories/clickstack/utils/team-defaults.d.ts.map +1 -0
- package/dist/factories/clickstack/utils/team-defaults.js +462 -0
- package/dist/factories/clickstack/utils/team-defaults.js.map +1 -0
- package/package.json +2 -1
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* The bundled HyperDX OIDC plugin (CommonJS), base64-encoded. Typed `string`
|
|
5
5
|
* on purpose: a literal type would copy the whole bundle into the `.d.ts`.
|
|
6
6
|
*/
|
|
7
|
-
export const HYPERDX_OIDC_PLUGIN_BASE64 = 'LyohIFR5cGVLcm8gSHlwZXJEWCBPSURDIHBsdWdpbiDigJQgaHR0cHM6Ly9naXRodWIuY29tL3llaHVkYWNvaGVuL3R5cGVrcm8gKEFwYWNoZS0yLjApCiAqIEJ1bmRsZXMgb2F1dGg0d2ViYXBpIChodHRwczovL2dpdGh1Yi5jb20vcGFudmEvb2F1dGg0d2ViYXBpKToKICogVGhlIE1JVCBMaWNlbnNlIChNSVQpCiAqIAogKiBDb3B5cmlnaHQgKGMpIDIwMjIgRmlsaXAgU2tva2FuCiAqIAogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICogCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAogKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKiAKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAqIFNPRlRXQVJFLgogKi8KdmFyIEQwPU9iamVjdC5jcmVhdGU7dmFye2dldFByb3RvdHlwZU9mOkcwLGRlZmluZVByb3BlcnR5Om4xLGdldE93blByb3BlcnR5TmFtZXM6VjB9PU9iamVjdDt2YXIgTTA9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBVMCgkKXtyZXR1cm4gdGhpc1skXX12YXIgTDAsTjAsYjA9KCQsWCxRKT0+e3ZhciBaPSQhPW51bGwmJnR5cGVvZiAkPT09Im9iamVjdCI7aWYoWil7dmFyIHo9WD9MMD8/PW5ldyBXZWFrTWFwOk4wPz89bmV3IFdlYWtNYXAsVz16LmdldCgkKTtpZihXKXJldHVybiBXfVE9JCE9bnVsbD9EMChHMCgkKSk6e307bGV0IEo9WHx8ISR8fCEkLl9fZXNNb2R1bGU/bjEoUSwiZGVmYXVsdCIse3ZhbHVlOiQsZW51bWVyYWJsZTohMH0pOlE7Zm9yKGxldCBIIG9mIFYwKCQpKWlmKCFNMC5jYWxsKEosSCkpbjEoSixILHtnZXQ6VTAuYmluZCgkLEgpLGVudW1lcmFibGU6ITB9KTtpZihaKXouc2V0KCQsSik7cmV0dXJuIEp9O3ZhciB6MD1yZXF1aXJlKCJub2RlOmZzIiksSjA9YjAocmVxdWlyZSgibm9kZTptb2R1bGUiKSksYjE9cmVxdWlyZSgibm9kZTpwYXRoIik7dmFyIGU9cmVxdWlyZSgibm9kZTpjcnlwdG8iKSxvMT1yZXF1aXJlKCJub2RlOmZzIiksUzA9IlRZUEVLUk9fSERYX09JRENfQk9PVFNUUkFQX0VNQUlMIixQMD0iVFlQRUtST19IRFhfT0lEQ19CT09UU1RSQVBfUEFTU1dPUkRfRklMRSI7ZnVuY3Rpb24gdDEoJCl7bGV0IFg9JFtTMF0/LnRyaW0oKT8/IiIsUT0kW1AwXT8udHJpbSgpPz8iIjtpZihYLmxlbmd0aD09PTB8fFEubGVuZ3RoPT09MClyZXR1cm47cmV0dXJue2VtYWlsOlgscGFzc3dvcmRGaWxlOlF9fWZ1bmN0aW9uIFAxKCQpe2xldCBYO3RyeXtYPW8xLnJlYWRGaWxlU3luYygkLCJ1dGY4Iil9Y2F0Y2h7cmV0dXJufXJldHVybiBYLmxlbmd0aD09PTA/dm9pZCAwOlh9ZnVuY3Rpb24gQzEoJCl7cmV0dXJuICQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cLyskLywiIil9ZnVuY3Rpb24gQzAoJCxYKXtsZXQgUT0oWik9PmUuY3JlYXRlSGFzaCgic2hhMjU2IikudXBkYXRlKFosInV0ZjgiKS5kaWdlc3QoKTtyZXR1cm4gZS50aW1pbmdTYWZlRXF1YWwoUSgkKSxRKFgpKX1mdW5jdGlvbiBUMCgkLFgsUT1QMSl7aWYodHlwZW9mICQhPT0ib2JqZWN0Inx8JD09PW51bGwpcmV0dXJuITE7bGV0e2VtYWlsOloscGFzc3dvcmQ6en09JDtpZih0eXBlb2YgWiE9PSJzdHJpbmcifHx0eXBlb2YgeiE9PSJzdHJpbmciKXJldHVybiExO2xldCBXPVEoWC5wYXNzd29yZEZpbGUpO2lmKFc9PT12b2lkIDApcmV0dXJuITE7bGV0IEo9QzAoeixXKTtyZXR1cm4gWi50b0xvd2VyQ2FzZSgpPT09WC5lbWFpbC50b0xvd2VyQ2FzZSgpJiZKfWFzeW5jIGZ1bmN0aW9uIHMxKCQsWCxRKXtsZXQgWj1YLmJvb3RzdHJhcDtpZihYLmNyZWF0ZVRlYW18fFo9PT12b2lkIDApcmV0dXJuITE7aWYoJC5tZXRob2QhPT0iUE9TVCJ8fEMxKCQucGF0aCkhPT0iL3JlZ2lzdGVyL3Bhc3N3b3JkIilyZXR1cm4hMTtpZihhd2FpdCBRLnRlYW1FeGlzdHMoKSlyZXR1cm4hMTtyZXR1cm4gVDAoJC5ib2R5LFosUS5yZWFkUGFzc3dvcmQpfXZhciB0JD1yZXF1aXJlKCJub2RlOmNyeXB0byIpLHMkPXJlcXVpcmUoIm5vZGU6ZnMiKSxyJD1yZXF1aXJlKCJub2RlOm1vZHVsZSIpLGUkPXJlcXVpcmUoIm5vZGU6cGF0aCIpO2Z1bmN0aW9uICQxKC4uLiQpe2ZvcihsZXQgWCBvZiAkKXtpZihYPT09dm9pZCAwfHxYLnRyaW0oKT09PSIiKWNvbnRpbnVlO2xldCBRO3RyeXtRPW5ldyBVUkwoWC50cmltKCkpfWNhdGNoe2NvbnRpbnVlfWlmKFEucHJvdG9jb2whPT0iaHR0cHM6IiYmUS5wcm90b2NvbCE9PSJodHRwOiIpY29udGludWU7aWYoUS51c2VybmFtZSE9PSIifHxRLnBhc3N3b3JkIT09IiJ8fFEuc2VhcmNoIT09IiJ8fFEuaGFzaCE9PSIiKWNvbnRpbnVlO3JldHVybmAke1Eub3JpZ2lufSR7US5wYXRobmFtZS5yZXBsYWNlKC9cLyskLywiIil9YH1yZXR1cm4iIn1mdW5jdGlvbiBfMCgkKXtmb3IobGV0IFg9MDtYPCQubGVuZ3RoO1grKyl7bGV0IFE9JC5jaGFyQ29kZUF0KFgpO2lmKFE8PTMyfHxRPT09MTI3KXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHUoJCl7cmV0dXJuICQuc3RhcnRzV2l0aCgiLyIpJiYhJC5zdGFydHNXaXRoKCIvLyIpJiYhJC5pbmNsdWRlcygiXFwiKSYmIV8wKCQpfWZ1bmN0aW9uIFgxKCQsWCl7cmV0dXJuYCR7JH0ke3UoWCk/WDoiLyJ9YH1mdW5jdGlvbiBUMSgkLFgsUSl7bGV0IFo9UT09PSIvIj8iIjpgP3JldHVyblRvPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFEpfWA7cmV0dXJuYCR7JH0vJHtlbmNvZGVVUklDb21wb25lbnQoWCl9JHtafWB9Y2xhc3MgQyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCQpe3N1cGVyKCQpO3RoaXMubmFtZT0iT2lkY0NvbmZpZ0Vycm9yIn19dmFyIFIwPS9eW2EtejAtOV1bYS16MC05LV17MCw2Mn0kLyxxMD0vXihcZCspXHMqKG1zfHN8bXxofGQpJC8sSTA9e21zOjEsczoxMDAwLG06NjAwMDAsaDozNjAwMDAwLGQ6ODY0MDAwMDB9O2Z1bmN0aW9uIGYwKCQsWCl7aWYodHlwZW9mICQ9PT0ibnVtYmVyIiYmTnVtYmVyLmlzRmluaXRlKCQpJiYkPj0wKXJldHVybiAkKjEwMDA7aWYodHlwZW9mICQ9PT0ic3RyaW5nIil7bGV0IFE9cTAuZXhlYygkLnRyaW0oKSk7aWYoUSlyZXR1cm4gTnVtYmVyKFFbMV0pKkkwW1FbMl1dfXRocm93IG5ldyBDKGAke1h9IG11c3QgYmUgYSBkdXJhdGlvbiBsaWtlICIxMmgiLCAiMzBtIiBvciAiN2QiLCBvciBhIG51bWJlciBvZiBzZWNvbmRzIChnb3QgJHtKU09OLnN0cmluZ2lmeSgkKX0pYCl9ZnVuY3Rpb24gUTEoJCl7cmV0dXJuIHR5cGVvZiAkPT09Im9iamVjdCImJiQhPT1udWxsJiYhQXJyYXkuaXNBcnJheSgkKX1mdW5jdGlvbiBkKCQsWCxRKXtsZXQgWj0kW1hdO2lmKHR5cGVvZiBaIT09InN0cmluZyJ8fFoudHJpbSgpLmxlbmd0aD09PTApdGhyb3cgbmV3IEMoYCR7UX0uJHtYfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApO3JldHVybiBafWZ1bmN0aW9uIHQoJCxYLFEsWil7bGV0IHo9JFtYXTtpZih6PT09dm9pZCAwKXJldHVybiBaO2lmKHR5cGVvZiB6IT09InN0cmluZyJ8fHoudHJpbSgpLmxlbmd0aD09PTApdGhyb3cgbmV3IEMoYCR7UX0uJHtYfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHNldGApO3JldHVybiB6fWZ1bmN0aW9uIHMoJCxYLFEsWil7bGV0IHo9JFtYXTtpZih6PT09dm9pZCAwKXJldHVybiBaO2lmKHR5cGVvZiB6IT09ImJvb2xlYW4iKXRocm93IG5ldyBDKGAke1F9LiR7WH0gbXVzdCBiZSBhIGJvb2xlYW5gKTtyZXR1cm4gen1mdW5jdGlvbiBfMSgkLFgpe2lmKCQ9PT12b2lkIDApcmV0dXJuW107aWYoIUFycmF5LmlzQXJyYXkoJCl8fCQuc29tZSgoUSk9PnR5cGVvZiBRIT09InN0cmluZyJ8fFEubGVuZ3RoPT09MCkpdGhyb3cgbmV3IEMoYCR7WH0gbXVzdCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgc3RyaW5nc2ApO3JldHVybiAkfWZ1bmN0aW9uIFoxKCQsWCxRKXtsZXQgWj1PYmplY3Qua2V5cygkKS5maWx0ZXIoKHopPT4hWC5pbmNsdWRlcyh6KSk7aWYoWi5sZW5ndGg+MCl0aHJvdyBuZXcgQyhgJHtRfSBoYXMgdW5rbm93biBrZXkocykgJHtaLm1hcCgoeik9PkpTT04uc3RyaW5naWZ5KHopKS5qb2luKCIsICIpfTsgYWxsb3dlZDogJHtYLmpvaW4oIiwgIil9YCl9ZnVuY3Rpb24gcjEoJCxYLFEpe2xldCBaO3RyeXtaPW5ldyBVUkwoJCl9Y2F0Y2h7dGhyb3cgbmV3IEMoYCR7WH0gbXVzdCBiZSBhbiBhYnNvbHV0ZSBVUkwgKGdvdCAke0pTT04uc3RyaW5naWZ5KCQpfSlgKX1pZihaLnByb3RvY29sIT09Imh0dHBzOiImJiEoUSYmWi5wcm90b2NvbD09PSJodHRwOiIpKXRocm93IG5ldyBDKGAke1h9IG11c3QgdXNlIGh0dHBzIChnb3QgJHtKU09OLnN0cmluZ2lmeSgkKX0pYCk7cmV0dXJuICQucmVwbGFjZSgvXC8rJC8sIiIpfXZhciBPMD1bImlkIiwiZGlzcGxheU5hbWUiLCJpc3N1ZXIiLCJjbGllbnRJZCIsImNsaWVudFNlY3JldCIsInRva2VuRW5kcG9pbnRBdXRoTWV0aG9kIiwic2NvcGVzIiwiY2xhaW1zIiwiYWxsb3ciLCJyZXF1aXJlVmVyaWZpZWRFbWFpbCIsImxpbmtFeGlzdGluZ1VzZXJzQnlFbWFpbCIsImNyZWF0ZVVzZXJzIl07ZnVuY3Rpb24gQTAoJCxYLFEpe2xldCBaPWBwcm92aWRlcnNbJHtYfV1gO2lmKCFRMSgkKSl0aHJvdyBuZXcgQyhgJHtafSBtdXN0IGJlIGFuIG9iamVjdGApO1oxKCQsTzAsWik7bGV0IHo9ZCgkLCJpZCIsWik7aWYoIVIwLnRlc3QoeikpdGhyb3cgbmV3IEMoYCR7Wn0uaWQgbXVzdCBiZSBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzIGFuZCBkYXNoZXMsIHN0YXJ0aW5nIHdpdGggYSBsZXR0ZXIgb3IgZGlnaXQgKGdvdCAke0pTT04uc3RyaW5naWZ5KHopfSlgKTtsZXQgVz0kLnRva2VuRW5kcG9pbnRBdXRoTWV0aG9kPz8iY2xpZW50X3NlY3JldF9iYXNpYyI7aWYoVyE9PSJjbGllbnRfc2VjcmV0X2Jhc2ljIiYmVyE9PSJjbGllbnRfc2VjcmV0X3Bvc3QiKXRocm93IG5ldyBDKGAke1p9LnRva2VuRW5kcG9pbnRBdXRoTWV0aG9kIG11c3QgYmUgImNsaWVudF9zZWNyZXRfYmFzaWMiIG9yICJjbGllbnRfc2VjcmV0X3Bvc3QiYCk7bGV0IEo9JC5zY29wZXM9PT12b2lkIDA/WyJvcGVuaWQiLCJlbWFpbCIsInByb2ZpbGUiXTpfMSgkLnNjb3BlcyxgJHtafS5zY29wZXNgKTtpZighSi5pbmNsdWRlcygib3BlbmlkIikpdGhyb3cgbmV3IEMoYCR7Wn0uc2NvcGVzIG11c3QgaW5jbHVkZSAib3BlbmlkImApO2xldCBIPSQuY2xhaW1zPz97fTtpZighUTEoSCkpdGhyb3cgbmV3IEMoYCR7Wn0uY2xhaW1zIG11c3QgYmUgYW4gb2JqZWN0YCk7WjEoSCxbImVtYWlsIiwiZ3JvdXBzIiwibmFtZSJdLGAke1p9LmNsYWltc2ApO2xldCBCPXtlbWFpbDp0KEgsImVtYWlsIixgJHtafS5jbGFpbXNgLCJlbWFpbCIpLGdyb3Vwczp0KEgsImdyb3VwcyIsYCR7Wn0uY2xhaW1zYCwiZ3JvdXBzIiksbmFtZTp0KEgsIm5hbWUiLGAke1p9LmNsYWltc2AsIm5hbWUiKX07aWYoIVExKCQuYWxsb3cpKXRocm93IG5ldyBDKGAke1p9LmFsbG93IGlzIHJlcXVpcmVkOiBzZXQgYWxsb3cuZ3JvdXBzIGFuZC9vciBhbGxvdy5lbWFpbERvbWFpbnMuIFdpdGhvdXQgYSBydWxlLCBldmVyeSBhY2NvdW50IHRoZSBwcm92aWRlciBjYW4gYXV0aGVudGljYXRlIHdvdWxkIGdldCBpbnRvIEh5cGVyRFguYCk7WjEoJC5hbGxvdyxbImdyb3VwcyIsImVtYWlsRG9tYWlucyJdLGAke1p9LmFsbG93YCk7bGV0IFk9e2dyb3VwczpfMSgkLmFsbG93Lmdyb3VwcyxgJHtafS5hbGxvdy5ncm91cHNgKSxlbWFpbERvbWFpbnM6XzEoJC5hbGxvdy5lbWFpbERvbWFpbnMsYCR7Wn0uYWxsb3cuZW1haWxEb21haW5zYCkubWFwKChWKT0+Vi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15ALywiIikpfTtpZihZLmdyb3Vwcy5sZW5ndGg9PT0wJiZZLmVtYWlsRG9tYWlucy5sZW5ndGg9PT0wKXRocm93IG5ldyBDKGAke1p9LmFsbG93IG11c3Qgc2V0IGF0IGxlYXN0IG9uZSBvZiBncm91cHMgb3IgZW1haWxEb21haW5zOyBhbiBlbXB0eSBydWxlIHdvdWxkIGFkbWl0IGV2ZXJ5IGFjY291bnQgdGhlIHByb3ZpZGVyIGNhbiBhdXRoZW50aWNhdGUuYCk7bGV0IEY9cygkLCJyZXF1aXJlVmVyaWZpZWRFbWFpbCIsWiwhMCksTD1zKCQsImxpbmtFeGlzdGluZ1VzZXJzQnlFbWFpbCIsWixGKTtpZihMJiYhRil0aHJvdyBuZXcgQyhgJHtafS5saW5rRXhpc3RpbmdVc2Vyc0J5RW1haWwgY2Fubm90IGJlIHRydWUgd2hlbiByZXF1aXJlVmVyaWZpZWRFbWFpbCBpcyBmYWxzZTogYW4gdW52ZXJpZmllZCBlbWFpbCBpcyBvbmx5IGEgY2xhaW0sIHNvIGxpbmtpbmcgYnkgaXQgd291bGQgbGV0IGFueW9uZSB3aG8gY2FuIHNldCB0aGVpciBlbWFpbCBhdCB0aGUgcHJvdmlkZXIgdGFrZSBvdmVyIHRoZSBIeXBlckRYIGFjY291bnQgdGhhdCBoYXMgaXQuYCk7cmV0dXJue2lkOnosZGlzcGxheU5hbWU6dCgkLCJkaXNwbGF5TmFtZSIsWix6KSxpc3N1ZXI6cjEoZCgkLCJpc3N1ZXIiLFopLGAke1p9Lmlzc3VlcmAsUSksY2xpZW50SWQ6ZCgkLCJjbGllbnRJZCIsWiksY2xpZW50U2VjcmV0OmQoJCwiY2xpZW50U2VjcmV0IixaKSx0b2tlbkVuZHBvaW50QXV0aE1ldGhvZDpXLHNjb3BlczpKLGNsYWltczpCLGFsbG93OlkscmVxdWlyZVZlcmlmaWVkRW1haWw6RixsaW5rRXhpc3RpbmdVc2Vyc0J5RW1haWw6TCxjcmVhdGVVc2VyczpzKCQsImNyZWF0ZVVzZXJzIixaLCEwKX19ZnVuY3Rpb24geDAoJCxYKXtsZXQgUT1kKCQsInJlZGlyZWN0QmFzZVVybCIsImNvbmZpZ3VyYXRpb24iKTtyMShRLCJjb25maWd1cmF0aW9uLnJlZGlyZWN0QmFzZVVybCIsWCk7bGV0IFo9bmV3IFVSTChRKTtpZihaLnVzZXJuYW1lIT09IiJ8fFoucGFzc3dvcmQhPT0iInx8US5pbmNsdWRlcygiPyIpfHxRLmluY2x1ZGVzKCIjIikpdGhyb3cgbmV3IEMoImNvbmZpZ3VyYXRpb24ucmVkaXJlY3RCYXNlVXJsIG11c3Qgbm90IGNvbnRhaW4gY3JlZGVudGlhbHMsIGEgcXVlcnkgb3IgYSBmcmFnbWVudCIpO3JldHVybmAke1oub3JpZ2lufSR7Wi5wYXRobmFtZS5yZXBsYWNlKC9cLyskLywiIil9YH12YXIgdjA9WyJwcm92aWRlcnMiLCJwYXNzd29yZExvZ2luIiwicGFzc3dvcmRMb2dpblBhdGgiLCJtYXhTZXNzaW9uQWdlIiwicmVkaXJlY3RCYXNlVXJsIiwiYXBpUGF0aFByZWZpeCIsInRlYW1JZCIsImFsbG93SW5zZWN1cmVIdHRwIl0sRTA9Ii9sb2dpbiI7ZnVuY3Rpb24gUjEoJCxYKXtpZigkPy5wYXNzd29yZExvZ2luPT09ITEpcmV0dXJuO3JldHVybiAkPy5wYXNzd29yZExvZ2luUGF0aD8/WD8/RTB9ZnVuY3Rpb24gcTEoJCl7bGV0IFg7dHJ5e1g9SlNPTi5wYXJzZSgkKX1jYXRjaChZKXtsZXQgRj0vcG9zaXRpb24gKFxkKykvLmV4ZWMoWS5tZXNzYWdlKT8uWzFdO3Rocm93IG5ldyBDKGBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZCBKU09OJHtGPT09dm9pZCAwPyIiOmAgKG5lYXIgY2hhcmFjdGVyICR7Rn0pYH1gKX1pZighUTEoWCkpdGhyb3cgbmV3IEMoImNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhIEpTT04gb2JqZWN0Iik7WjEoWCx2MCwiY29uZmlndXJhdGlvbiIpO2xldCBRPXMoWCwiYWxsb3dJbnNlY3VyZUh0dHAiLCJjb25maWd1cmF0aW9uIiwhMSk7aWYoIUFycmF5LmlzQXJyYXkoWC5wcm92aWRlcnMpKXRocm93IG5ldyBDKCJjb25maWd1cmF0aW9uLnByb3ZpZGVycyBtdXN0IGJlIGFuIGFycmF5Iik7bGV0IFo9WC5wcm92aWRlcnMubWFwKChZLEYpPT5BMChZLEYsUSkpLHo9bmV3IFNldDtmb3IobGV0IFkgb2YgWil7aWYoei5oYXMoWS5pZCkpdGhyb3cgbmV3IEMoYHByb3ZpZGVyIGlkICR7SlNPTi5zdHJpbmdpZnkoWS5pZCl9IGlzIHVzZWQgdHdpY2VgKTt6LmFkZChZLmlkKX1sZXQgVz10KFgsImFwaVBhdGhQcmVmaXgiLCJjb25maWd1cmF0aW9uIiwiL2FwaSIpO2lmKCFXLnN0YXJ0c1dpdGgoIi8iKSl0aHJvdyBuZXcgQygnY29uZmlndXJhdGlvbi5hcGlQYXRoUHJlZml4IG11c3Qgc3RhcnQgd2l0aCAiLyInKTtsZXQgSj1YLnRlYW1JZD09PXZvaWQgMD92b2lkIDA6ZChYLCJ0ZWFtSWQiLCJjb25maWd1cmF0aW9uIik7aWYoSiE9PXZvaWQgMCYmIS9eWzAtOWEtZl17MjR9JC8udGVzdChKKSl0aHJvdyBuZXcgQygiY29uZmlndXJhdGlvbi50ZWFtSWQgbXVzdCBiZSBhIEh5cGVyRFggdGVhbSBpZCAoMjQgaGV4YWRlY2ltYWwgY2hhcmFjdGVycykiKTtsZXQgSD1YLnJlZGlyZWN0QmFzZVVybD09PXZvaWQgMD92b2lkIDA6eDAoWCxRKSxCPVgucGFzc3dvcmRMb2dpblBhdGg9PT12b2lkIDA/dm9pZCAwOmQoWCwicGFzc3dvcmRMb2dpblBhdGgiLCJjb25maWd1cmF0aW9uIik7aWYoQiE9PXZvaWQgMCYmIXUoQikpdGhyb3cgbmV3IEMoYGNvbmZpZ3VyYXRpb24ucGFzc3dvcmRMb2dpblBhdGggbXVzdCBiZSBhIHBhdGggb24gSHlwZXJEWCdzIG93biBvcmlnaW4sIHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgIi8iIChubyAiLy8iLCBiYWNrc2xhc2gsIHdoaXRlc3BhY2Ugb3IgY29udHJvbCBjaGFyYWN0ZXIpYCk7cmV0dXJue3Byb3ZpZGVyczpaLHBhc3N3b3JkTG9naW46cyhYLCJwYXNzd29yZExvZ2luIiwiY29uZmlndXJhdGlvbiIsITApLC4uLkIhPT12b2lkIDAmJntwYXNzd29yZExvZ2luUGF0aDpCfSxtYXhTZXNzaW9uQWdlTXM6WC5tYXhTZXNzaW9uQWdlPT09dm9pZCAwPzQzMjAwMDAwOmYwKFgubWF4U2Vzc2lvbkFnZSwiY29uZmlndXJhdGlvbi5tYXhTZXNzaW9uQWdlIiksYXBpUGF0aFByZWZpeDpXLnJlcGxhY2UoL1wvKyQvLCIiKSwuLi5IIT09dm9pZCAwJiZ7cmVkaXJlY3RCYXNlVXJsOkh9LC4uLkohPT12b2lkIDAmJnt0ZWFtSWQ6Sn0sYWxsb3dJbnNlY3VyZUh0dHA6UX19ZnVuY3Rpb24gajAoJCl7aWYoQXJyYXkuaXNBcnJheSgkKSlyZXR1cm4gJC5maWx0ZXIoKFgpPT50eXBlb2YgWD09PSJzdHJpbmciKTtpZih0eXBlb2YgJD09PSJzdHJpbmciJiYkLmxlbmd0aD4wKXJldHVyblskXTtyZXR1cm5bXX1mdW5jdGlvbiB5MCgkKXtyZXR1cm4gJD09PSEwfHwkPT09InRydWUifWZ1bmN0aW9uICQkKCQsWCl7bGV0IFE9WC5zdWI7aWYodHlwZW9mIFEhPT0ic3RyaW5nInx8US5sZW5ndGg9PT0wKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoic3ViamVjdE1pc3NpbmcifTtsZXQgWj1YWyQuY2xhaW1zLmVtYWlsXTtpZih0eXBlb2YgWiE9PSJzdHJpbmcifHxaLnRyaW0oKS5sZW5ndGg9PT0wKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoiZW1haWxNaXNzaW5nIn07aWYoIS9eW1x4MjEtXHg3ZV0rJC8udGVzdChaLnRyaW0oKSkpcmV0dXJue2FsbG93ZWQ6ITEscmVhc29uOiJlbWFpbEludmFsaWQifTtsZXQgej1aLnRyaW0oKS50b0xvd2VyQ2FzZSgpLFc9ei5sYXN0SW5kZXhPZigiQCIpO2lmKFc8PTB8fFc9PT16Lmxlbmd0aC0xKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoiZW1haWxNaXNzaW5nIn07aWYoJC5yZXF1aXJlVmVyaWZpZWRFbWFpbCYmIXkwKFguZW1haWxfdmVyaWZpZWQpKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoiZW1haWxOb3RWZXJpZmllZCJ9O2xldCBKPWowKFhbJC5jbGFpbXMuZ3JvdXBzXSk7aWYoJC5hbGxvdy5ncm91cHMubGVuZ3RoPjAmJiFKLnNvbWUoKFkpPT4kLmFsbG93Lmdyb3Vwcy5pbmNsdWRlcyhZKSkpcmV0dXJue2FsbG93ZWQ6ITEscmVhc29uOiJncm91cE5vdEFsbG93ZWQifTtsZXQgSD16LnNsaWNlKFcrMSk7aWYoJC5hbGxvdy5lbWFpbERvbWFpbnMubGVuZ3RoPjAmJiEkLmFsbG93LmVtYWlsRG9tYWlucy5pbmNsdWRlcyhIKSlyZXR1cm57YWxsb3dlZDohMSxyZWFzb246ImVtYWlsRG9tYWluTm90QWxsb3dlZCJ9O2xldCBCPVhbJC5jbGFpbXMubmFtZV07cmV0dXJue2FsbG93ZWQ6ITAsaWRlbnRpdHk6e3Byb3ZpZGVyOiQuaWQsc3ViamVjdDpRLGVtYWlsOnosbmFtZTp0eXBlb2YgQj09PSJzdHJpbmciJiZCLnRyaW0oKS5sZW5ndGg+MD9CLnRyaW0oKTp6LGdyb3VwczpKfX19Y2xhc3MgcCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCl7c3VwZXIoInRoZSBhY2NvdW50IGlzIGFscmVhZHkgbGlua2VkIHRvIGFub3RoZXIgc2lnbi1pbiIpO3RoaXMubmFtZT0iTGlua0NvbmZsaWN0RXJyb3IifX1hc3luYyBmdW5jdGlvbiBYJCgkLFgsUSl7dHJ5e3JldHVybiBhd2FpdCBlMSgkLFgsUSl9Y2F0Y2goWil7aWYoIShaIGluc3RhbmNlb2YgcCkpdGhyb3cgWjt0cnl7cmV0dXJuIGF3YWl0IGUxKCQsWCxRKX1jYXRjaCh6KXtpZih6IGluc3RhbmNlb2YgcClyZXR1cm57ZGVuaWVkOiJlbWFpbEluVXNlIn07dGhyb3cgen19fWFzeW5jIGZ1bmN0aW9uIGUxKCQsWCxRKXtsZXQgWj1hd2FpdCAkLmZpbmRMaW5rZWRVc2VySWQoUS5wcm92aWRlcixRLnN1YmplY3QpO2lmKFohPT1udWxsKXtpZihhd2FpdCAkLnVzZXJFeGlzdHMoWikpcmV0dXJuIGF3YWl0ICQudG91Y2goUS5wcm92aWRlcixRLnN1YmplY3QpLHt1c2VySWQ6WixvdXRjb21lOiJsaW5rZWQifTthd2FpdCAkLnVubGluayhRLnByb3ZpZGVyLFEuc3ViamVjdCl9bGV0IHo9YXdhaXQgJC5maW5kVXNlcklkQnlFbWFpbChRLmVtYWlsKTtpZih6IT09bnVsbCl7aWYoWC5saW5rRXhpc3RpbmdVc2Vyc0J5RW1haWwmJiFhd2FpdCAkLnVzZXJIYXNBbnlMaW5rKHopKXJldHVybiBhd2FpdCAkLmxpbmsoUSx6KSx7dXNlcklkOnosb3V0Y29tZToibGlua2VkQnlFbWFpbCJ9O3JldHVybntkZW5pZWQ6ImVtYWlsSW5Vc2UifX1pZighWC5jcmVhdGVVc2VycylyZXR1cm57ZGVuaWVkOiJub0FjY291bnQifTtsZXQgVz1hd2FpdCAkLmNyZWF0ZVVzZXIoUS5lbWFpbCxRLm5hbWUpO3JldHVybiBhd2FpdCAkLmxpbmsoUSxXKSx7dXNlcklkOlcsb3V0Y29tZToiY3JlYXRlZCJ9fXZhciBJMTtpZih0eXBlb2YgbmF2aWdhdG9yPiJ1Inx8IW5hdmlnYXRvci51c2VyQWdlbnQ/LnN0YXJ0c1dpdGg/LigiTW96aWxsYS81LjAgIikpSTE9Im9hdXRoNHdlYmFwaS92My44LjgiO2Z1bmN0aW9uIEIxKCQsWCl7aWYoJD09bnVsbClyZXR1cm4hMTt0cnl7cmV0dXJuICQgaW5zdGFuY2VvZiBYfHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoJClbU3ltYm9sLnRvU3RyaW5nVGFnXT09PVgucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ119Y2F0Y2h7cmV0dXJuITF9fXZhciBxPSJFUlJfSU5WQUxJRF9BUkdfVkFMVUUiLEE9IkVSUl9JTlZBTElEX0FSR19UWVBFIjtmdW5jdGlvbiBTKCQsWCxRKXtsZXQgWj1UeXBlRXJyb3IoJCx7Y2F1c2U6UX0pO3JldHVybiBPYmplY3QuYXNzaWduKFose2NvZGU6WH0pLFp9dmFyIEsxPVN5bWJvbCgpLHcwPVN5bWJvbCgpLGcwPVN5bWJvbCgpLFkkPVN5bWJvbCgpLGgwPVN5bWJvbCgpLFEkPVN5bWJvbCgpLFI1PVN5bWJvbCgpLGswPW5ldyBUZXh0RW5jb2RlcixtMD1uZXcgVGV4dERlY29kZXI7ZnVuY3Rpb24gZygkKXtpZih0eXBlb2YgJD09PSJzdHJpbmciKXJldHVybiBrMC5lbmNvZGUoJCk7cmV0dXJuIG0wLmRlY29kZSgkKX12YXIgZjE7aWYoVWludDhBcnJheS5wcm90b3R5cGUudG9CYXNlNjQpZjE9KCQpPT57aWYoJCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSQ9bmV3IFVpbnQ4QXJyYXkoJCk7cmV0dXJuICQudG9CYXNlNjQoe2FscGhhYmV0OiJiYXNlNjR1cmwiLG9taXRQYWRkaW5nOiEwfSl9O2Vsc2UgZjE9KFgpPT57aWYoWCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKVg9bmV3IFVpbnQ4QXJyYXkoWCk7bGV0IFE9W107Zm9yKGxldCBaPTA7WjxYLmJ5dGVMZW5ndGg7Wis9MzI3NjgpUS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxYLnN1YmFycmF5KFosWiszMjc2OCkpKTtyZXR1cm4gYnRvYShRLmpvaW4oIiIpKS5yZXBsYWNlKC89L2csIiIpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIil9O3ZhciBPMTtpZihVaW50OEFycmF5LmZyb21CYXNlNjQpTzE9KCQpPT57dHJ5e3JldHVybiBVaW50OEFycmF5LmZyb21CYXNlNjQoJCx7YWxwaGFiZXQ6ImJhc2U2NHVybCJ9KX1jYXRjaChYKXt0aHJvdyBTKCJUaGUgaW5wdXQgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIixxLFgpfX07ZWxzZSBPMT0oJCk9Pnt0cnl7bGV0IFg9YXRvYigkLnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpLnJlcGxhY2UoL1xzL2csIiIpKSxRPW5ldyBVaW50OEFycmF5KFgubGVuZ3RoKTtmb3IobGV0IFo9MDtaPFgubGVuZ3RoO1orKylRW1pdPVguY2hhckNvZGVBdChaKTtyZXR1cm4gUX1jYXRjaChYKXt0aHJvdyBTKCJUaGUgaW5wdXQgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIixxLFgpfX07ZnVuY3Rpb24gaigkKXtpZih0eXBlb2YgJD09PSJzdHJpbmciKXJldHVybiBPMSgkKTtyZXR1cm4gZjEoJCl9Y2xhc3MgZiBleHRlbmRzIEVycm9ye2NvZGU7Y29uc3RydWN0b3IoJCxYKXtzdXBlcigkLFgpO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPXk4LEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPy4odGhpcyx0aGlzLmNvbnN0cnVjdG9yKX19Y2xhc3MgSCQgZXh0ZW5kcyBFcnJvcntjb2RlO2NvbnN0cnVjdG9yKCQsWCl7c3VwZXIoJCxYKTtpZih0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFg/LmNvZGUpdGhpcy5jb2RlPVg/LmNvZGU7RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/Lih0aGlzLHRoaXMuY29uc3RydWN0b3IpfX1mdW5jdGlvbiBEKCQsWCxRKXtyZXR1cm4gbmV3IEgkKCQse2NvZGU6WCxjYXVzZTpRfSl9YXN5bmMgZnVuY3Rpb24gdTAoJCl7bGV0IFg7c3dpdGNoKCQua3R5KXtjYXNlIkVDIjpYPXtjcnY6JC5jcnYsa3R5OiQua3R5LHg6JC54LHk6JC55fTticmVhaztjYXNlIk9LUCI6WD17Y3J2OiQuY3J2LGt0eTokLmt0eSx4OiQueH07YnJlYWs7Y2FzZSJBS1AiOlg9e2FsZzokLmFsZyxrdHk6JC5rdHkscHViOiQucHVifTticmVhaztjYXNlIlJTQSI6WD17ZTokLmUsa3R5OiQua3R5LG46JC5ufTticmVhaztkZWZhdWx0OnRocm93IG5ldyBmKCJ1bnN1cHBvcnRlZCBKV0sga2V5IHR5cGUiLHtjYXVzZTokfSl9cmV0dXJuIGooYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLGcoSlNPTi5zdHJpbmdpZnkoWCkpKSl9ZnVuY3Rpb24gQiQoJCxYKXtpZighKCQgaW5zdGFuY2VvZiBDcnlwdG9LZXkpKXRocm93IFMoYCR7WH0gbXVzdCBiZSBhIENyeXB0b0tleWAsQSl9ZnVuY3Rpb24gZDAoJCxYKXtpZihCJCgkLFgpLCQudHlwZSE9PSJwcml2YXRlIil0aHJvdyBTKGAke1h9IG11c3QgYmUgYSBwcml2YXRlIENyeXB0b0tleWAscSl9ZnVuY3Rpb24gYzAoJCxYKXtpZihCJCgkLFgpLCQudHlwZSE9PSJwdWJsaWMiKXRocm93IFMoYCR7WH0gbXVzdCBiZSBhIHB1YmxpYyBDcnlwdG9LZXlgLHEpfWZ1bmN0aW9uIHoxKCQpe2lmKCQ9PT1udWxsfHx0eXBlb2YgJCE9PSJvYmplY3QifHxBcnJheS5pc0FycmF5KCQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIEskKCQpe2lmKEIxKCQsSGVhZGVycykpJD1PYmplY3QuZnJvbUVudHJpZXMoJC5lbnRyaWVzKCkpO2xldCBYPW5ldyBIZWFkZXJzKCQ/P3t9KTtpZihJMSYmIVguaGFzKCJ1c2VyLWFnZW50IikpWC5zZXQoInVzZXItYWdlbnQiLEkxKTtpZihYLmhhcygiYXV0aG9yaXphdGlvbiIpKXRocm93IFMoJyJvcHRpb25zLmhlYWRlcnMiIG11c3Qgbm90IGluY2x1ZGUgdGhlICJhdXRob3JpemF0aW9uIiBoZWFkZXIgbmFtZScscSk7cmV0dXJuIFh9ZnVuY3Rpb24gRiQoJCxYKXtpZihYIT09dm9pZCAwKXtpZih0eXBlb2YgWD09PSJmdW5jdGlvbiIpWD1YKCQuaHJlZik7aWYoIShYIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpKXRocm93IFMoJyJvcHRpb25zLnNpZ25hbCIgbXVzdCByZXR1cm4gb3IgYmUgYW4gaW5zdGFuY2Ugb2YgQWJvcnRTaWduYWwnLEEpO3JldHVybiBYfXJldHVybn1mdW5jdGlvbiBEJCgkKXtpZigkLmluY2x1ZGVzKCIvLyIpKXJldHVybiAkLnJlcGxhY2UoIi8vIiwiLyIpO3JldHVybiAkfWZ1bmN0aW9uIGwwKCQsWCxRPSExKXtpZigkLnBhdGhuYW1lPT09Ii8iKSQucGF0aG5hbWU9WDtlbHNlICQucGF0aG5hbWU9RCQoYCR7WH0vJHtRPyQucGF0aG5hbWU6JC5wYXRobmFtZS5yZXBsYWNlKC8oXC8pJC8sIiIpfWApO3JldHVybiAkfWZ1bmN0aW9uIHAwKCQsWCl7cmV0dXJuICQucGF0aG5hbWU9RCQoYCR7JC5wYXRobmFtZX0vJHtYfWApLCR9YXN5bmMgZnVuY3Rpb24gaTAoJCxYLFEsWil7aWYoISgkIGluc3RhbmNlb2YgVVJMKSl0aHJvdyBTKGAiJHtYfSIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBVUkxgLEEpO1QkKCQsWj8uW0sxXSE9PSEwKTtsZXQgej1RKG5ldyBVUkwoJC5ocmVmKSksVz1LJChaPy5oZWFkZXJzKTtyZXR1cm4gVy5zZXQoImFjY2VwdCIsImFwcGxpY2F0aW9uL2pzb24iKSwoWj8uW1kkXXx8ZmV0Y2gpKHouaHJlZix7Ym9keTp2b2lkIDAsaGVhZGVyczpPYmplY3QuZnJvbUVudHJpZXMoVy5lbnRyaWVzKCkpLG1ldGhvZDoiR0VUIixyZWRpcmVjdDoibWFudWFsIixzaWduYWw6RiQoeixaPy5zaWduYWwpfSl9YXN5bmMgZnVuY3Rpb24gRyQoJCxYKXtyZXR1cm4gaTAoJCwiaXNzdWVySWRlbnRpZmllciIsKFEpPT57c3dpdGNoKFg/LmFsZ29yaXRobSl7Y2FzZSB2b2lkIDA6Y2FzZSJvaWRjIjpwMChRLCIud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbiIpO2JyZWFrO2Nhc2Uib2F1dGgyIjpsMChRLCIud2VsbC1rbm93bi9vYXV0aC1hdXRob3JpemF0aW9uLXNlcnZlciIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgUygnIm9wdGlvbnMuYWxnb3JpdGhtIiBtdXN0IGJlICJvaWRjIiAoZGVmYXVsdCksIG9yICJvYXV0aDIiJyxxKX1yZXR1cm4gUX0sWCl9ZnVuY3Rpb24gSjEoJCxYLFEsWix6KXt0cnl7aWYodHlwZW9mICQhPT0ibnVtYmVyInx8IU51bWJlci5pc0Zpbml0ZSgkKSl0aHJvdyBTKGAke1F9IG11c3QgYmUgYSBudW1iZXJgLEEseik7aWYoJD4wKXJldHVybjtpZihYKXtpZigkIT09MCl0aHJvdyBTKGAke1F9IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyYCxxLHopO3JldHVybn10aHJvdyBTKGAke1F9IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJgLHEseil9Y2F0Y2goVyl7aWYoWil0aHJvdyBEKFcubWVzc2FnZSxaLHopO3Rocm93IFd9fWZ1bmN0aW9uIFIoJCxYLFEsWil7dHJ5e2lmKHR5cGVvZiAkIT09InN0cmluZyIpdGhyb3cgUyhgJHtYfSBtdXN0IGJlIGEgc3RyaW5nYCxBLFopO2lmKCQubGVuZ3RoPT09MCl0aHJvdyBTKGAke1h9IG11c3Qgbm90IGJlIGVtcHR5YCxxLFopfWNhdGNoKHope2lmKFEpdGhyb3cgRCh6Lm1lc3NhZ2UsUSxaKTt0aHJvdyB6fX1hc3luYyBmdW5jdGlvbiBWJCgkLFgpe2xldCBRPSQ7aWYoIShRIGluc3RhbmNlb2YgVVJMKSYmUSE9PVckKXRocm93IFMoJyJleHBlY3RlZElzc3VlcklkZW50aWZpZXIiIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVVJMJyxBKTtpZighQjEoWCxSZXNwb25zZSkpdGhyb3cgUygnInJlc3BvbnNlIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlJyxBKTtpZihYLnN0YXR1cyE9PTIwMCl0aHJvdyBEKCcicmVzcG9uc2UiIGlzIG5vdCBhIGNvbmZvcm0gQXV0aG9yaXphdGlvbiBTZXJ2ZXIgTWV0YWRhdGEgcmVzcG9uc2UgKHVuZXhwZWN0ZWQgSFRUUCBzdGF0dXMgY29kZSknLHkkLFgpO2cxKFgpO2xldCBaPWF3YWl0IGckKFgpO2lmKFIoWi5pc3N1ZXIsJyJyZXNwb25zZSIgYm9keSAiaXNzdWVyIiBwcm9wZXJ0eScsTix7Ym9keTpafSksUSE9PVckJiZuZXcgVVJMKFouaXNzdWVyKS5ocmVmIT09US5ocmVmKXRocm93IEQoJyJyZXNwb25zZSIgYm9keSAiaXNzdWVyIiBwcm9wZXJ0eSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWUnLG04LHtleHBlY3RlZDpRLmhyZWYsYm9keTpaLGF0dHJpYnV0ZToiaXNzdWVyIn0pO3JldHVybiBafWZ1bmN0aW9uIE0kKCQpe24wKCQsImFwcGxpY2F0aW9uL2pzb24iKX1mdW5jdGlvbiBhMCgkLC4uLlgpe2xldCBRPScicmVzcG9uc2UiIGNvbnRlbnQtdHlwZSBtdXN0IGJlICc7aWYoWC5sZW5ndGg+Mil7bGV0IFo9WC5wb3AoKTtRKz1gJHtYLmpvaW4oIiwgIil9LCBvciAke1p9YH1lbHNlIGlmKFgubGVuZ3RoPT09MilRKz1gJHtYWzBdfSBvciAke1hbMV19YDtlbHNlIFErPVhbMF07cmV0dXJuIEQoUSxnOCwkKX1mdW5jdGlvbiBuMCgkLFgpe2lmKEw4KCQpIT09WCl0aHJvdyBhMCgkLFgpfWZ1bmN0aW9uIEYxKCl7cmV0dXJuIGooY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgzMikpKX1mdW5jdGlvbiBVJCgpe3JldHVybiBGMSgpfWZ1bmN0aW9uIEwkKCl7cmV0dXJuIEYxKCl9ZnVuY3Rpb24gTiQoKXtyZXR1cm4gRjEoKX1hc3luYyBmdW5jdGlvbiBiJCgkKXtyZXR1cm4gUigkLCJjb2RlVmVyaWZpZXIiKSxqKGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IixnKCQpKSl9ZnVuY3Rpb24gbzAoJCl7c3dpdGNoKCQuYWxnb3JpdGhtLmhhc2gubmFtZSl7Y2FzZSJTSEEtMjU2IjpyZXR1cm4iUFMyNTYiO2Nhc2UiU0hBLTM4NCI6cmV0dXJuIlBTMzg0IjtjYXNlIlNIQS01MTIiOnJldHVybiJQUzUxMiI7ZGVmYXVsdDp0aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgUnNhSGFzaGVkS2V5QWxnb3JpdGhtIGhhc2ggbmFtZSIse2NhdXNlOiR9KX19ZnVuY3Rpb24gdDAoJCl7c3dpdGNoKCQuYWxnb3JpdGhtLmhhc2gubmFtZSl7Y2FzZSJTSEEtMjU2IjpyZXR1cm4iUlMyNTYiO2Nhc2UiU0hBLTM4NCI6cmV0dXJuIlJTMzg0IjtjYXNlIlNIQS01MTIiOnJldHVybiJSUzUxMiI7ZGVmYXVsdDp0aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgUnNhSGFzaGVkS2V5QWxnb3JpdGhtIGhhc2ggbmFtZSIse2NhdXNlOiR9KX19ZnVuY3Rpb24gczAoJCl7c3dpdGNoKCQuYWxnb3JpdGhtLm5hbWVkQ3VydmUpe2Nhc2UiUC0yNTYiOnJldHVybiJFUzI1NiI7Y2FzZSJQLTM4NCI6cmV0dXJuIkVTMzg0IjtjYXNlIlAtNTIxIjpyZXR1cm4iRVM1MTIiO2RlZmF1bHQ6dGhyb3cgbmV3IGYoInVuc3VwcG9ydGVkIEVjS2V5QWxnb3JpdGhtIG5hbWVkQ3VydmUiLHtjYXVzZTokfSl9fWZ1bmN0aW9uIHIwKCQpe3N3aXRjaCgkLmFsZ29yaXRobS5uYW1lKXtjYXNlIlJTQS1QU1MiOnJldHVybiBvMCgkKTtjYXNlIlJTQVNTQS1QS0NTMS12MV81IjpyZXR1cm4gdDAoJCk7Y2FzZSJFQ0RTQSI6cmV0dXJuIHMwKCQpO2Nhc2UiRWQyNTUxOSI6Y2FzZSJNTC1EU0EtNDQiOmNhc2UiTUwtRFNBLTY1IjpjYXNlIk1MLURTQS04NyI6cmV0dXJuICQuYWxnb3JpdGhtLm5hbWU7Y2FzZSJFZERTQSI6cmV0dXJuIkVkMjU1MTkiO2RlZmF1bHQ6dGhyb3cgbmV3IGYoInVuc3VwcG9ydGVkIENyeXB0b0tleSBhbGdvcml0aG0gbmFtZSIse2NhdXNlOiR9KX19ZnVuY3Rpb24gRTEoJCl7bGV0IFg9JD8uW3cwXTtyZXR1cm4gdHlwZW9mIFg9PT0ibnVtYmVyIiYmTnVtYmVyLmlzRmluaXRlKFgpP1g6MH1mdW5jdGlvbiBTJCgkKXtsZXQgWD0kPy5bZzBdO3JldHVybiB0eXBlb2YgWD09PSJudW1iZXIiJiZOdW1iZXIuaXNGaW5pdGUoWCkmJk1hdGguc2lnbihYKSE9PS0xP1g6MzB9ZnVuY3Rpb24gajEoKXtyZXR1cm4gTWF0aC5mbG9vcihEYXRlLm5vdygpLzEwMDApfWZ1bmN0aW9uIHkxKCQpe2lmKHR5cGVvZiAkIT09Im9iamVjdCJ8fCQ9PT1udWxsKXRocm93IFMoJyJhcyIgbXVzdCBiZSBhbiBvYmplY3QnLEEpO1IoJC5pc3N1ZXIsJyJhcy5pc3N1ZXIiJyl9ZnVuY3Rpb24gdzEoJCl7aWYodHlwZW9mICQhPT0ib2JqZWN0Inx8JD09PW51bGwpdGhyb3cgUygnImNsaWVudCIgbXVzdCBiZSBhbiBvYmplY3QnLEEpO1IoJC5jbGllbnRfaWQsJyJjbGllbnQuY2xpZW50X2lkIicpfWZ1bmN0aW9uIFokKCQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoJCkucmVwbGFjZSgvKD86Wy1fLiF+KicoKV18JTIwKS9nLChYKT0+e3N3aXRjaChYKXtjYXNlIi0iOmNhc2UiXyI6Y2FzZSIuIjpjYXNlIiEiOmNhc2UifiI6Y2FzZSIqIjpjYXNlIiciOmNhc2UiKCI6Y2FzZSIpIjpyZXR1cm5gJSR7WC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWA7Y2FzZSIlMjAiOnJldHVybiIrIjtkZWZhdWx0OnRocm93IEVycm9yKCl9fSl9ZnVuY3Rpb24gUCQoJCl7cmV0dXJuIFIoJCwnImNsaWVudFNlY3JldCInKSwoWCxRLFoseik9PntaLnNldCgiY2xpZW50X2lkIixRLmNsaWVudF9pZCksWi5zZXQoImNsaWVudF9zZWNyZXQiLCQpfX1mdW5jdGlvbiBDJCgkKXtyZXR1cm4gUigkLCciY2xpZW50U2VjcmV0IicpLChYLFEsWix6KT0+e2xldCBXPVokKFEuY2xpZW50X2lkKSxKPVokKCQpLEg9YnRvYShgJHtXfToke0p9YCk7ei5zZXQoImF1dGhvcml6YXRpb24iLGBCYXNpYyAke0h9YCl9fWFzeW5jIGZ1bmN0aW9uIGUwKCQsWCxRKXtpZighUS51c2FnZXMuaW5jbHVkZXMoInNpZ24iKSl0aHJvdyBTKCdDcnlwdG9LZXkgaW5zdGFuY2VzIHVzZWQgZm9yIHNpZ25pbmcgYXNzZXJ0aW9ucyBtdXN0IGluY2x1ZGUgInNpZ24iIGluIHRoZWlyICJ1c2FnZXMiJyxxKTtsZXQgWj1gJHtqKGcoSlNPTi5zdHJpbmdpZnkoJCkpKX0uJHtqKGcoSlNPTi5zdHJpbmdpZnkoWCkpKX1gLHo9aihhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24obDgoUSksUSxnKFopKSk7cmV0dXJuYCR7Wn0uJHt6fWB9dmFyIEExO2FzeW5jIGZ1bmN0aW9uICQ4KCQsWCl7bGV0e2t0eTpRLGU6WixuOnoseDpXLHk6SixjcnY6SCxwdWI6Qn09YXdhaXQgY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoImp3ayIsJCksWT17a3R5OlEsZTpaLG46eix4OlcseTpKLGNydjpILHB1YjpCfTtpZihRPT09IkFLUCIpWS5hbGc9WDtyZXR1cm4gQTEuc2V0KCQsWSksWX1hc3luYyBmdW5jdGlvbiBYOCgkLFgpe3JldHVybiBBMXx8PW5ldyBXZWFrTWFwLEExLmdldCgkKXx8JDgoJCxYKX12YXIgUTg9VVJMLnBhcnNlPygkLFgpPT5VUkwucGFyc2UoJCxYKTooJCxYKT0+e3RyeXtyZXR1cm4gbmV3IFVSTCgkLFgpfWNhdGNoe3JldHVybiBudWxsfX07ZnVuY3Rpb24gVCQoJCxYKXtpZihYJiYkLnByb3RvY29sIT09Imh0dHBzOiIpdGhyb3cgRCgib25seSByZXF1ZXN0cyB0byBIVFRQUyBhcmUgYWxsb3dlZCIsaDgsJCk7aWYoJC5wcm90b2NvbCE9PSJodHRwczoiJiYkLnByb3RvY29sIT09Imh0dHA6Iil0aHJvdyBEKCJvbmx5IEhUVFAgYW5kIEhUVFBTIHJlcXVlc3RzIGFyZSBhbGxvd2VkIixrOCwkKX1mdW5jdGlvbiB6JCgkLFgsUSxaKXtsZXQgejtpZih0eXBlb2YgJCE9PSJzdHJpbmcifHwhKHo9UTgoJCkpKXRocm93IEQoYGF1dGhvcml6YXRpb24gc2VydmVyIG1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCAke1E/YCJhcy5tdGxzX2VuZHBvaW50X2FsaWFzZXMuJHtYfSJgOmAiYXMuJHtYfSJgfWAsJD09PXZvaWQgMD91ODpkOCx7YXR0cmlidXRlOlE/YG10bHNfZW5kcG9pbnRfYWxpYXNlcy4ke1h9YDpYfSk7cmV0dXJuIFQkKHosWiksen1mdW5jdGlvbiBaOCgkLFgsUSxaKXtpZihRJiYkLm10bHNfZW5kcG9pbnRfYWxpYXNlcyYmWCBpbiAkLm10bHNfZW5kcG9pbnRfYWxpYXNlcylyZXR1cm4geiQoJC5tdGxzX2VuZHBvaW50X2FsaWFzZXNbWF0sWCxRLFopO3JldHVybiB6JCgkW1hdLFgsUSxaKX1jbGFzcyB6OHsjWDsjUTsjWjsjSjsjVzsjJDsjejtjb25zdHJ1Y3RvcigkLFgsUSl7aWYoZDAoWD8ucHJpdmF0ZUtleSwnIkRQb1AucHJpdmF0ZUtleSInKSxjMChYPy5wdWJsaWNLZXksJyJEUG9QLnB1YmxpY0tleSInKSwhWC5wdWJsaWNLZXkuZXh0cmFjdGFibGUpdGhyb3cgUygnIkRQb1AucHVibGljS2V5LmV4dHJhY3RhYmxlIiBtdXN0IGJlIHRydWUnLHEpO3RoaXMuI1c9UT8uW2gwXSx0aGlzLiNKPUUxKCQpLHRoaXMuI1E9WC5wcml2YXRlS2V5LHRoaXMuI1o9WC5wdWJsaWNLZXksRzEuYWRkKHRoaXMpfSNZKCQpe3RoaXMuIyR8fD1uZXcgTWFwO2xldCBYPXRoaXMuIyQuZ2V0KCQpO2lmKFgpdGhpcy4jJC5kZWxldGUoJCksdGhpcy4jJC5zZXQoJCxYKTtyZXR1cm4gWH0jSCgkLFgpe2lmKHRoaXMuIyR8fD1uZXcgTWFwLHRoaXMuIyQuZGVsZXRlKCQpLHRoaXMuIyQuc2l6ZT09PTEwMCl0aGlzLiMkLmRlbGV0ZSh0aGlzLiMkLmtleXMoKS5uZXh0KCkudmFsdWUpO3RoaXMuIyQuc2V0KCQsWCl9YXN5bmMgY2FsY3VsYXRlVGh1bWJwcmludCgpe2lmKCF0aGlzLiN6KXtsZXQgJD1hd2FpdCBjcnlwdG8uc3VidGxlLmV4cG9ydEtleSgiandrIix0aGlzLiNaKTt0aGlzLiN6fHw9YXdhaXQgdTAoJCl9cmV0dXJuIHRoaXMuI3p9YXN5bmMgYWRkUHJvb2YoJCxYLFEsWil7bGV0IHo9cjAodGhpcy4jUSk7dGhpcy4jWHx8PXthbGc6eix0eXA6ImRwb3Arand0Iixqd2s6YXdhaXQgWDgodGhpcy4jWix6KX07bGV0IFc9dGhpcy4jWSgkLm9yaWdpbiksSD17aWF0OmoxKCkrdGhpcy4jSixqdGk6RjEoKSxodG06USxub25jZTpXLGh0dTpgJHskLm9yaWdpbn0keyQucGF0aG5hbWV9YCxhdGg6Wj9qKGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IixnKFopKSk6dm9pZCAwfTt0aGlzLiNXPy4odGhpcy4jWCxIKSxYLnNldCgiZHBvcCIsYXdhaXQgZTAodGhpcy4jWCxILHRoaXMuI1EpKX1jYWNoZU5vbmNlKCQsWCl7dHJ5e2xldCBRPSQuaGVhZGVycy5nZXQoImRwb3Atbm9uY2UiKTtpZihRKXRoaXMuI0goWC5vcmlnaW4sUSl9Y2F0Y2h7fX19Y2xhc3MgXyQgZXh0ZW5kcyBFcnJvcntjYXVzZTtjb2RlO2Vycm9yO3N0YXR1cztlcnJvcl9kZXNjcmlwdGlvbjtyZXNwb25zZTtjb25zdHJ1Y3RvcigkLFgpe3N1cGVyKCQsWCk7dGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSx0aGlzLmNvZGU9ajgsdGhpcy5jYXVzZT1YLmNhdXNlLHRoaXMuZXJyb3I9WC5jYXVzZS5lcnJvcix0aGlzLnN0YXR1cz1YLnJlc3BvbnNlLnN0YXR1cyx0aGlzLmVycm9yX2Rlc2NyaXB0aW9uPVguY2F1c2UuZXJyb3JfZGVzY3JpcHRpb24sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlc3BvbnNlIix7ZW51bWVyYWJsZTohMSx2YWx1ZTpYLnJlc3BvbnNlfSksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/Lih0aGlzLHRoaXMuY29uc3RydWN0b3IpfX1jbGFzcyBSJCBleHRlbmRzIEVycm9ye2NhdXNlO2NvZGU7ZXJyb3I7ZXJyb3JfZGVzY3JpcHRpb247Y29uc3RydWN0b3IoJCxYKXtzdXBlcigkLFgpO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPXc4LHRoaXMuY2F1c2U9WC5jYXVzZSx0aGlzLmVycm9yPVguY2F1c2UuZ2V0KCJlcnJvciIpLHRoaXMuZXJyb3JfZGVzY3JpcHRpb249WC5jYXVzZS5nZXQoImVycm9yX2Rlc2NyaXB0aW9uIik/P3ZvaWQgMCxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT8uKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcil9fWNsYXNzIHEkIGV4dGVuZHMgRXJyb3J7Y2F1c2U7Y29kZTtyZXNwb25zZTtzdGF0dXM7Y29uc3RydWN0b3IoJCxYKXtzdXBlcigkLFgpO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPUU4LHRoaXMuY2F1c2U9WC5jYXVzZSx0aGlzLnN0YXR1cz1YLnJlc3BvbnNlLnN0YXR1cyx0aGlzLnJlc3BvbnNlPVgucmVzcG9uc2UsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlc3BvbnNlIix7ZW51bWVyYWJsZTohMX0pLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPy4odGhpcyx0aGlzLmNvbnN0cnVjdG9yKX19dmFyIFcxPSJbYS16QS1aMC05ISMkJSZcXCdcXCpcXCtcXC1cXC5cXF5fYFxcfH5dKyIsSjg9IlthLXpBLVowLTlcXC1cXC5fXFx+XFwrXFwvXSs9ezAsMn0iLFc4PSciKCg/OlteIlxcXFxdfFxcXFxbXFxzXFxTXSkqKSInLFk4PSIoIitXMSsiKVxccyo9XFxzKiIrVzgsSDg9IigiK1cxKyIpXFxzKj1cXHMqKCIrVzErIikiLEI4PW5ldyBSZWdFeHAoIl5bLFxcc10qKCIrVzErIikiKSxLOD1uZXcgUmVnRXhwKCJeWyxcXHNdKiIrWTgrIlssXFxzXSooLiopIiksRjg9bmV3IFJlZ0V4cCgiXlssXFxzXSoiK0g4KyJbLFxcc10qKC4qKSIpLEQ4PW5ldyBSZWdFeHAoIl4oIitKOCsiKSg/OiR8WyxcXHNdKSguKikiKTtmdW5jdGlvbiBHOCgkKXtpZighQjEoJCxSZXNwb25zZSkpdGhyb3cgUygnInJlc3BvbnNlIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlJyxBKTtsZXQgWD0kLmhlYWRlcnMuZ2V0KCJ3d3ctYXV0aGVudGljYXRlIik7aWYoWD09PW51bGwpcmV0dXJuO2xldCBRPVtdLFo9WDt3aGlsZShaKXtsZXQgej1aLm1hdGNoKEI4KSxXPXo/LlsiMSJdLnRvTG93ZXJDYXNlKCk7aWYoIVcpcmV0dXJuO2xldCBKPVouc3Vic3RyaW5nKHpbMF0ubGVuZ3RoKTtpZihKJiYhSi5tYXRjaCgvXltccyxdLykpcmV0dXJuO2xldCBIPUoubWF0Y2goL15ccysoLiopJC8pLEI9ISFIO1o9SD9IWzFdOnZvaWQgMDtsZXQgWT17fSxGO2lmKEIpd2hpbGUoWil7bGV0IFYsUDtpZih6PVoubWF0Y2goSzgpKXtpZihbLFYsUCxaXT16LFAuaW5jbHVkZXMoIlxcIikpUD1QLnJlcGxhY2UoL1xcKFtcc1xTXSkvZywiJDEiKTtZW1YudG9Mb3dlckNhc2UoKV09UDtjb250aW51ZX1pZih6PVoubWF0Y2goRjgpKXtbLFYsUCxaXT16LFlbVi50b0xvd2VyQ2FzZSgpXT1QO2NvbnRpbnVlfWlmKHo9Wi5tYXRjaChEOCkpe2lmKE9iamVjdC5rZXlzKFkpLmxlbmd0aClicmVhaztbLEYsWl09ejticmVha31yZXR1cm59ZWxzZSBaPUp8fHZvaWQgMDtsZXQgTD17c2NoZW1lOlcscGFyYW1ldGVyczpZfTtpZihGKUwudG9rZW42OD1GO1EucHVzaChMKX1pZighUS5sZW5ndGgpcmV0dXJuO3JldHVybiBRfWFzeW5jIGZ1bmN0aW9uIFY4KCQpe2lmKCQuc3RhdHVzPjM5OSYmJC5zdGF0dXM8NTAwKXtnMSgkKSxNJCgkKTt0cnl7bGV0IFg9YXdhaXQgJC5jbG9uZSgpLmpzb24oKTtpZih6MShYKSYmdHlwZW9mIFguZXJyb3I9PT0ic3RyaW5nIiYmWC5lcnJvci5sZW5ndGgpcmV0dXJuIFh9Y2F0Y2h7fX1yZXR1cm59YXN5bmMgZnVuY3Rpb24gTTgoJCxYLFEpe2lmKCQuc3RhdHVzIT09WCl7UDgoJCk7bGV0IFo7aWYoWj1hd2FpdCBWOCgkKSl0aHJvdyBhd2FpdCAkLmJvZHk/LmNhbmNlbCgpLG5ldyBfJCgic2VydmVyIHJlc3BvbmRlZCB3aXRoIGFuIGVycm9yIGluIHRoZSByZXNwb25zZSBib2R5Iix7Y2F1c2U6WixyZXNwb25zZTokfSk7dGhyb3cgRChgInJlc3BvbnNlIiBpcyBub3QgYSBjb25mb3JtICR7UX0gcmVzcG9uc2UgKHVuZXhwZWN0ZWQgSFRUUCBzdGF0dXMgY29kZSlgLHkkLCQpfX1mdW5jdGlvbiBVOCgkKXtpZighRzEuaGFzKCQpKXRocm93IFMoJyJvcHRpb25zLkRQb1AiIGlzIG5vdCBhIHZhbGlkIERQb1BIYW5kbGUnLHEpfXZhciBxNT1TeW1ib2woKTtmdW5jdGlvbiBMOCgkKXtyZXR1cm4gJC5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIik/LnNwbGl0KCI7IilbMF19YXN5bmMgZnVuY3Rpb24gTjgoJCxYLFEsWix6LFcsSil7cmV0dXJuIGF3YWl0IFEoJCxYLHosVyksVy5zZXQoImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IiksKEo/LltZJF18fGZldGNoKShaLmhyZWYse2JvZHk6eixoZWFkZXJzOk9iamVjdC5mcm9tRW50cmllcyhXLmVudHJpZXMoKSksbWV0aG9kOiJQT1NUIixyZWRpcmVjdDoibWFudWFsIixzaWduYWw6RiQoWixKPy5zaWduYWwpfSl9YXN5bmMgZnVuY3Rpb24gYjgoJCxYLFEsWix6LFcpe2xldCBKPVo4KCQsInRva2VuX2VuZHBvaW50IixYLnVzZV9tdGxzX2VuZHBvaW50X2FsaWFzZXMsVz8uW0sxXSE9PSEwKTt6LnNldCgiZ3JhbnRfdHlwZSIsWik7bGV0IEg9SyQoVz8uaGVhZGVycyk7aWYoSC5zZXQoImFjY2VwdCIsImFwcGxpY2F0aW9uL2pzb24iKSxXPy5EUG9QIT09dm9pZCAwKVU4KFcuRFBvUCksYXdhaXQgVy5EUG9QLmFkZFByb29mKEosSCwiUE9TVCIpO2xldCBCPWF3YWl0IE44KCQsWCxRLEoseixILFcpO3JldHVybiBXPy5EUG9QPy5jYWNoZU5vbmNlKEIsSiksQn12YXIgSSQ9bmV3IFdlYWtNYXAsUzg9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gRDEoJCl7aWYoISQuaWRfdG9rZW4pcmV0dXJuO2xldCBYPUkkLmdldCgkKTtpZighWCl0aHJvdyBTKCcicmVmIiB3YXMgYWxyZWFkeSBnYXJiYWdlIGNvbGxlY3RlZCBvciBkaWQgbm90IHJlc29sdmUgZnJvbSB0aGUgcHJvcGVyIHNvdXJjZXMnLHEpO3JldHVybiBYfWFzeW5jIGZ1bmN0aW9uIGYkKCQsWCxRLFoseixXKXtpZih5MSgkKSx3MShYKSwhQjEoUSxSZXNwb25zZSkpdGhyb3cgUygnInJlc3BvbnNlIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlJyxBKTthd2FpdCBNOChRLDIwMCwiVG9rZW4gRW5kcG9pbnQiKSxnMShRKTtsZXQgSj1hd2FpdCBnJChRKTtpZihSKEouYWNjZXNzX3Rva2VuLCcicmVzcG9uc2UiIGJvZHkgImFjY2Vzc190b2tlbiIgcHJvcGVydHknLE4se2JvZHk6Sn0pLFIoSi50b2tlbl90eXBlLCcicmVzcG9uc2UiIGJvZHkgInRva2VuX3R5cGUiIHByb3BlcnR5JyxOLHtib2R5Okp9KSxKLnRva2VuX3R5cGU9Si50b2tlbl90eXBlLnRvTG93ZXJDYXNlKCksSi5leHBpcmVzX2luIT09dm9pZCAwKXtsZXQgSD10eXBlb2YgSi5leHBpcmVzX2luIT09Im51bWJlciI/cGFyc2VGbG9hdChKLmV4cGlyZXNfaW4pOkouZXhwaXJlc19pbjtKMShILCEwLCcicmVzcG9uc2UiIGJvZHkgImV4cGlyZXNfaW4iIHByb3BlcnR5JyxOLHtib2R5Okp9KSxKLmV4cGlyZXNfaW49SH1pZihKLnJlZnJlc2hfdG9rZW4hPT12b2lkIDApUihKLnJlZnJlc2hfdG9rZW4sJyJyZXNwb25zZSIgYm9keSAicmVmcmVzaF90b2tlbiIgcHJvcGVydHknLE4se2JvZHk6Sn0pO2lmKEouc2NvcGUhPT12b2lkIDAmJnR5cGVvZiBKLnNjb3BlIT09InN0cmluZyIpdGhyb3cgRCgnInJlc3BvbnNlIiBib2R5ICJzY29wZSIgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZycsTix7Ym9keTpKfSk7aWYoSi5pZF90b2tlbiE9PXZvaWQgMCl7UihKLmlkX3Rva2VuLCcicmVzcG9uc2UiIGJvZHkgImlkX3Rva2VuIiBwcm9wZXJ0eScsTix7Ym9keTpKfSk7bGV0IEg9W107aWYoWC5yZXF1aXJlX2F1dGhfdGltZT09PSEwKUgucHVzaCgiYXV0aF90aW1lIik7aWYoWC5kZWZhdWx0X21heF9hZ2UhPT12b2lkIDApSjEoWC5kZWZhdWx0X21heF9hZ2UsITAsJyJjbGllbnQuZGVmYXVsdF9tYXhfYWdlIicpLEgucHVzaCgiYXV0aF90aW1lIik7aWYoWj8ubGVuZ3RoKUgucHVzaCguLi5aKTtsZXR7Y2xhaW1zOkIsand0Oll9PWF3YWl0IGY4KCQsWCxKLmlkX3Rva2VuLEgseik7QTgoWCxCKSxPOChCKSxTOC5zZXQoUSxZKSxJJC5zZXQoSixCKX1pZihXPy5bSi50b2tlbl90eXBlXSE9PXZvaWQgMClXW0oudG9rZW5fdHlwZV0oUSxKKTtlbHNlIGlmKEoudG9rZW5fdHlwZSE9PSJkcG9wIiYmSi50b2tlbl90eXBlIT09ImJlYXJlciIpdGhyb3cgbmV3IGYoInVuc3VwcG9ydGVkIGB0b2tlbl90eXBlYCB2YWx1ZSIse2NhdXNlOntib2R5Okp9fSk7cmV0dXJuIEp9ZnVuY3Rpb24gUDgoJCl7bGV0IFg7aWYoWD1HOCgkKSl0aHJvdyBuZXcgcSQoInNlcnZlciByZXNwb25kZWQgd2l0aCBhIGNoYWxsZW5nZSBpbiB0aGUgV1dXLUF1dGhlbnRpY2F0ZSBIVFRQIEhlYWRlciIse2NhdXNlOlgscmVzcG9uc2U6JH0pfWZ1bmN0aW9uIEM4KCQsWCl7aWYoQXJyYXkuaXNBcnJheShYLmNsYWltcy5hdWQpKXtpZighWC5jbGFpbXMuYXVkLmluY2x1ZGVzKCQpKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhdWQiIChhdWRpZW5jZSkgY2xhaW0gdmFsdWUnLGkse2V4cGVjdGVkOiQsY2xhaW1zOlguY2xhaW1zLGNsYWltOiJhdWQifSl9ZWxzZSBpZihYLmNsYWltcy5hdWQhPT0kKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhdWQiIChhdWRpZW5jZSkgY2xhaW0gdmFsdWUnLGkse2V4cGVjdGVkOiQsY2xhaW1zOlguY2xhaW1zLGNsYWltOiJhdWQifSk7cmV0dXJuIFh9ZnVuY3Rpb24gVDgoJCxYKXtsZXQgUT0kW284XT8uKFgpPz8kLmlzc3VlcjtpZihYLmNsYWltcy5pc3MhPT1RKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJpc3MiIChpc3N1ZXIpIGNsYWltIHZhbHVlJyxpLHtleHBlY3RlZDpRLGNsYWltczpYLmNsYWltcyxjbGFpbToiaXNzIn0pO3JldHVybiBYfXZhciBHMT1uZXcgV2Vha1NldDtmdW5jdGlvbiBfOCgkKXtyZXR1cm4gRzEuYWRkKCQpLCR9dmFyIFI4PVN5bWJvbCgpO2FzeW5jIGZ1bmN0aW9uIE8kKCQsWCxRLFoseixXLEope2lmKHkxKCQpLHcxKFgpLCFHMS5oYXMoWikpdGhyb3cgUygnImNhbGxiYWNrUGFyYW1ldGVycyIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBVUkxTZWFyY2hQYXJhbXMgb2J0YWluZWQgZnJvbSAidmFsaWRhdGVBdXRoUmVzcG9uc2UoKSIsIG9yICJ2YWxpZGF0ZUp3dEF1dGhSZXNwb25zZSgpJyxxKTtSKHosJyJyZWRpcmVjdFVyaSInKTtsZXQgSD1jKFosImNvZGUiKTtpZighSCl0aHJvdyBEKCdubyBhdXRob3JpemF0aW9uIGNvZGUgaW4gImNhbGxiYWNrUGFyYW1ldGVycyInLE4pO2xldCBCPW5ldyBVUkxTZWFyY2hQYXJhbXMoSj8uYWRkaXRpb25hbFBhcmFtZXRlcnMpO2lmKEIuc2V0KCJyZWRpcmVjdF91cmkiLHopLEIuc2V0KCJjb2RlIixIKSxXIT09UjgpUihXLCciY29kZVZlcmlmaWVyIicpLEIuc2V0KCJjb2RlX3ZlcmlmaWVyIixXKTtyZXR1cm4gYjgoJCxYLFEsImF1dGhvcml6YXRpb25fY29kZSIsQixKKX12YXIgQSQ9e2F1ZDoiYXVkaWVuY2UiLGNfaGFzaDoiY29kZSBoYXNoIixjbGllbnRfaWQ6ImNsaWVudCBpZCIsZXhwOiJleHBpcmF0aW9uIHRpbWUiLGlhdDoiaXNzdWVkIGF0Iixpc3M6Imlzc3VlciIsanRpOiJqd3QgaWQiLG5vbmNlOiJub25jZSIsc19oYXNoOiJzdGF0ZSBoYXNoIixzdWI6InN1YmplY3QiLGF0aDoiYWNjZXNzIHRva2VuIGhhc2giLGh0bToiaHR0cCBtZXRob2QiLGh0dToiaHR0cCB1cmkiLGNuZjoiY29uZmlybWF0aW9uIixhdXRoX3RpbWU6ImF1dGhlbnRpY2F0aW9uIHRpbWUifTtmdW5jdGlvbiBxOCgkLFgpe2ZvcihsZXQgUSBvZiAkKWlmKFguY2xhaW1zW1FdPT09dm9pZCAwKXRocm93IEQoYEpXVCAiJHtRfSIgKCR7QSRbUV19KSBjbGFpbSBtaXNzaW5nYCxOLHtjbGFpbXM6WC5jbGFpbXN9KTtyZXR1cm4gWH1mdW5jdGlvbiBJOCgkLFgpe2lmKHR5cGVvZiBYLmNsYWltc1skXSE9PSJzdHJpbmciKXRocm93IEQoYHVuZXhwZWN0ZWQgSldUICIkeyR9IiAoJHtBJFskXX0pIGNsYWltIHR5cGVgLE4se2NsYWltczpYLmNsYWltc30pO3JldHVybiBYfWZ1bmN0aW9uIGY4KCQsWCxRLFoseil7cmV0dXJuIHA4KFEsaTguYmluZCh2b2lkIDAsWC5pZF90b2tlbl9zaWduZWRfcmVzcG9uc2VfYWxnLCQuaWRfdG9rZW5fc2lnbmluZ19hbGdfdmFsdWVzX3N1cHBvcnRlZCwiUlMyNTYiKSxFMShYKSxTJChYKSx6KS50aGVuKHE4LmJpbmQodm9pZCAwLFsiYXVkIiwiZXhwIiwiaWF0IiwiaXNzIiwic3ViIiwuLi5aXSkpLnRoZW4oVDguYmluZCh2b2lkIDAsJCkpLnRoZW4oQzguYmluZCh2b2lkIDAsWC5jbGllbnRfaWQpKS50aGVuKEk4LmJpbmQodm9pZCAwLCJzdWIiKSl9ZnVuY3Rpb24geCQoJCxYKXtpZihYPT09SDEpcmV0dXJuIFg7bGV0IFE9WD09PXZvaWQgMDtpZihRKVg9JC5kZWZhdWx0X21heF9hZ2U7aWYoWD09PXZvaWQgMClyZXR1cm4gSDE7cmV0dXJuIEoxKFgsITAsUT8nImNsaWVudC5kZWZhdWx0X21heF9hZ2UiJzonIm1heEFnZSIgYXJndW1lbnQnKSxYfWZ1bmN0aW9uIE84KCQpe2lmKCQuYXV0aF90aW1lIT09dm9pZCAwKUoxKCQuYXV0aF90aW1lLCEwLCdJRCBUb2tlbiAiYXV0aF90aW1lIiAoYXV0aGVudGljYXRpb24gdGltZSknLE4se2NsYWltczokfSl9ZnVuY3Rpb24gdiQoJCxYLFEpe2lmKFE9PT1IMSlyZXR1cm47bGV0IFo9ajEoKStFMSgkKSx6PVMkKCQpO2lmKFguYXV0aF90aW1lK1E8Wi16KXRocm93IEQoInRvbyBtdWNoIHRpbWUgaGFzIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgRW5kLVVzZXIgYXV0aGVudGljYXRpb24iLHYxLHtjbGFpbXM6WCxub3c6Wix0b2xlcmFuY2U6eixjbGFpbToiYXV0aF90aW1lIn0pfWZ1bmN0aW9uIEUkKCQsWCl7bGV0IFE9WD09PVkxP3ZvaWQgMDpYO2lmKCQubm9uY2UhPT1RKXRocm93IEQoJ3VuZXhwZWN0ZWQgSUQgVG9rZW4gIm5vbmNlIiBjbGFpbSB2YWx1ZScsaSx7ZXhwZWN0ZWQ6USxjbGFpbXM6JCxjbGFpbToibm9uY2UifSl9ZnVuY3Rpb24gQTgoJCxYKXtpZihBcnJheS5pc0FycmF5KFguYXVkKSYmWC5hdWQubGVuZ3RoIT09MSl7aWYoWC5henA9PT12b2lkIDApdGhyb3cgRCgnSUQgVG9rZW4gImF1ZCIgKGF1ZGllbmNlKSBjbGFpbSBpbmNsdWRlcyBhZGRpdGlvbmFsIHVudHJ1c3RlZCBhdWRpZW5jZXMnLGkse2NsYWltczpYLGNsYWltOiJhdWQifSk7aWYoWC5henAhPT0kLmNsaWVudF9pZCl0aHJvdyBEKCd1bmV4cGVjdGVkIElEIFRva2VuICJhenAiIChhdXRob3JpemVkIHBhcnR5KSBjbGFpbSB2YWx1ZScsaSx7ZXhwZWN0ZWQ6JC5jbGllbnRfaWQsY2xhaW1zOlgsY2xhaW06ImF6cCJ9KX19dmFyIFkxPVN5bWJvbCgpLEgxPVN5bWJvbCgpO2FzeW5jIGZ1bmN0aW9uIGokKCQsWCxRLFope2lmKHR5cGVvZiBaPy5leHBlY3RlZE5vbmNlPT09InN0cmluZyJ8fHR5cGVvZiBaPy5tYXhBZ2U9PT0ibnVtYmVyInx8Wj8ucmVxdWlyZUlkVG9rZW4pcmV0dXJuIHg4KCQsWCxRLFouZXhwZWN0ZWROb25jZSxaLm1heEFnZSxaW1EkXSxaLnJlY29nbml6ZWRUb2tlblR5cGVzKTtyZXR1cm4gdjgoJCxYLFEsWj8ubWF4QWdlLFo/LltRJF0sWj8ucmVjb2duaXplZFRva2VuVHlwZXMpfWFzeW5jIGZ1bmN0aW9uIHg4KCQsWCxRLFoseixXLEope2xldCBIPVtdO3N3aXRjaChaKXtjYXNlIHZvaWQgMDpaPVkxO2JyZWFrO2Nhc2UgWTE6YnJlYWs7ZGVmYXVsdDpSKFosJyJleHBlY3RlZE5vbmNlIiBhcmd1bWVudCcpLEgucHVzaCgibm9uY2UiKX1pZih6PXgkKFgseikseiE9PUgxKUgucHVzaCgiYXV0aF90aW1lIik7bGV0IEI9YXdhaXQgZiQoJCxYLFEsSCxXLEopO1IoQi5pZF90b2tlbiwnInJlc3BvbnNlIiBib2R5ICJpZF90b2tlbiIgcHJvcGVydHknLE4se2JvZHk6Qn0pO2xldCBZPUQxKEIpO3JldHVybiB2JChYLFkseiksRSQoWSxaKSxCfWFzeW5jIGZ1bmN0aW9uIHY4KCQsWCxRLFoseixXKXtsZXQgSj1hd2FpdCBmJCgkLFgsUSx2b2lkIDAseixXKSxIPUQxKEopO2lmKEgpdiQoWCxILHgkKFgsWikpLEUkKEgsWTEpO3JldHVybiBKfXZhciBFOD0iT0FVVEhfV1dXX0FVVEhFTlRJQ0FURV9DSEFMTEVOR0UiLGo4PSJPQVVUSF9SRVNQT05TRV9CT0RZX0VSUk9SIix5OD0iT0FVVEhfVU5TVVBQT1JURURfT1BFUkFUSU9OIix3OD0iT0FVVEhfQVVUSE9SSVpBVElPTl9SRVNQT05TRV9FUlJPUiI7dmFyIHgxPSJPQVVUSF9QQVJTRV9FUlJPUiIsTj0iT0FVVEhfSU5WQUxJRF9SRVNQT05TRSI7dmFyIGc4PSJPQVVUSF9SRVNQT05TRV9JU19OT1RfSlNPTiIseSQ9Ik9BVVRIX1JFU1BPTlNFX0lTX05PVF9DT05GT1JNIixoOD0iT0FVVEhfSFRUUF9SRVFVRVNUX0ZPUkJJRERFTiIsazg9Ik9BVVRIX1JFUVVFU1RfUFJPVE9DT0xfRk9SQklEREVOIix2MT0iT0FVVEhfSldUX1RJTUVTVEFNUF9DSEVDS19GQUlMRUQiLGk9Ik9BVVRIX0pXVF9DTEFJTV9DT01QQVJJU09OX0ZBSUxFRCIsbTg9Ik9BVVRIX0pTT05fQVRUUklCVVRFX0NPTVBBUklTT05fRkFJTEVEIjt2YXIgdTg9Ik9BVVRIX01JU1NJTkdfU0VSVkVSX01FVEFEQVRBIixkOD0iT0FVVEhfSU5WQUxJRF9TRVJWRVJfTUVUQURBVEEiO2Z1bmN0aW9uIGcxKCQpe2lmKCQuYm9keVVzZWQpdGhyb3cgUygnInJlc3BvbnNlIiBib2R5IGhhcyBiZWVuIHVzZWQgYWxyZWFkeScscSl9ZnVuY3Rpb24gSiQoJCl7bGV0e2FsZ29yaXRobTpYfT0kO2lmKHR5cGVvZiBYLm1vZHVsdXNMZW5ndGghPT0ibnVtYmVyInx8WC5tb2R1bHVzTGVuZ3RoPDIwNDgpdGhyb3cgbmV3IGYoYHVuc3VwcG9ydGVkICR7WC5uYW1lfSBtb2R1bHVzTGVuZ3RoYCx7Y2F1c2U6JH0pfWZ1bmN0aW9uIGM4KCQpe2xldHthbGdvcml0aG06WH09JDtzd2l0Y2goWC5uYW1lZEN1cnZlKXtjYXNlIlAtMjU2IjpyZXR1cm4iU0hBLTI1NiI7Y2FzZSJQLTM4NCI6cmV0dXJuIlNIQS0zODQiO2Nhc2UiUC01MjEiOnJldHVybiJTSEEtNTEyIjtkZWZhdWx0OnRocm93IG5ldyBmKCJ1bnN1cHBvcnRlZCBFQ0RTQSBuYW1lZEN1cnZlIix7Y2F1c2U6JH0pfX1mdW5jdGlvbiBsOCgkKXtzd2l0Y2goJC5hbGdvcml0aG0ubmFtZSl7Y2FzZSJFQ0RTQSI6cmV0dXJue25hbWU6JC5hbGdvcml0aG0ubmFtZSxoYXNoOmM4KCQpfTtjYXNlIlJTQS1QU1MiOnN3aXRjaChKJCgkKSwkLmFsZ29yaXRobS5oYXNoLm5hbWUpe2Nhc2UiU0hBLTI1NiI6Y2FzZSJTSEEtMzg0IjpjYXNlIlNIQS01MTIiOnJldHVybntuYW1lOiQuYWxnb3JpdGhtLm5hbWUsc2FsdExlbmd0aDpwYXJzZUludCgkLmFsZ29yaXRobS5oYXNoLm5hbWUuc2xpY2UoLTMpLDEwKT4+M307ZGVmYXVsdDp0aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgUlNBLVBTUyBoYXNoIG5hbWUiLHtjYXVzZTokfSl9Y2FzZSJSU0FTU0EtUEtDUzEtdjFfNSI6cmV0dXJuIEokKCQpLCQuYWxnb3JpdGhtLm5hbWU7Y2FzZSJNTC1EU0EtNDQiOmNhc2UiTUwtRFNBLTY1IjpjYXNlIk1MLURTQS04NyI6Y2FzZSJFZDI1NTE5IjpyZXR1cm4gJC5hbGdvcml0aG0ubmFtZX10aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgQ3J5cHRvS2V5IGFsZ29yaXRobSBuYW1lIix7Y2F1c2U6JH0pfWFzeW5jIGZ1bmN0aW9uIHA4KCQsWCxRLFoseil7bGV0ezA6VywxOkosbGVuZ3RoOkh9PSQuc3BsaXQoIi4iKTtpZihIPT09NSlpZih6IT09dm9pZCAwKSQ9YXdhaXQgeigkKSx7MDpXLDE6SixsZW5ndGg6SH09JC5zcGxpdCgiLiIpO2Vsc2UgdGhyb3cgbmV3IGYoIkpXRSBkZWNyeXB0aW9uIGlzIG5vdCBjb25maWd1cmVkIix7Y2F1c2U6JH0pO2lmKEghPT0zKXRocm93IEQoIkludmFsaWQgSldUIixOLCQpO2xldCBCO3RyeXtCPUpTT04ucGFyc2UoZyhqKFcpKSl9Y2F0Y2goTCl7dGhyb3cgRCgiZmFpbGVkIHRvIHBhcnNlIEpXVCBIZWFkZXIgYm9keSBhcyBiYXNlNjR1cmwgZW5jb2RlZCBKU09OIix4MSxMKX1pZighejEoQikpdGhyb3cgRCgiSldUIEhlYWRlciBtdXN0IGJlIGEgdG9wIGxldmVsIG9iamVjdCIsTiwkKTtpZihYKEIpLEIuY3JpdCE9PXZvaWQgMCl0aHJvdyBuZXcgZignbm8gSldUICJjcml0IiBoZWFkZXIgcGFyYW1ldGVyIGV4dGVuc2lvbnMgYXJlIHN1cHBvcnRlZCcse2NhdXNlOntoZWFkZXI6Qn19KTtsZXQgWTt0cnl7WT1KU09OLnBhcnNlKGcoaihKKSkpfWNhdGNoKEwpe3Rocm93IEQoImZhaWxlZCB0byBwYXJzZSBKV1QgUGF5bG9hZCBib2R5IGFzIGJhc2U2NHVybCBlbmNvZGVkIEpTT04iLHgxLEwpfWlmKCF6MShZKSl0aHJvdyBEKCJKV1QgUGF5bG9hZCBtdXN0IGJlIGEgdG9wIGxldmVsIG9iamVjdCIsTiwkKTtsZXQgRj1qMSgpK1E7aWYoWS5leHAhPT12b2lkIDApe2lmKHR5cGVvZiBZLmV4cCE9PSJudW1iZXIiKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJleHAiIChleHBpcmF0aW9uIHRpbWUpIGNsYWltIHR5cGUnLE4se2NsYWltczpZfSk7aWYoWS5leHA8PUYtWil0aHJvdyBEKCd1bmV4cGVjdGVkIEpXVCAiZXhwIiAoZXhwaXJhdGlvbiB0aW1lKSBjbGFpbSB2YWx1ZSwgZXhwaXJhdGlvbiBpcyBwYXN0IGN1cnJlbnQgdGltZXN0YW1wJyx2MSx7Y2xhaW1zOlksbm93OkYsdG9sZXJhbmNlOlosY2xhaW06ImV4cCJ9KX1pZihZLmlhdCE9PXZvaWQgMCl7aWYodHlwZW9mIFkuaWF0IT09Im51bWJlciIpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImlhdCIgKGlzc3VlZCBhdCkgY2xhaW0gdHlwZScsTix7Y2xhaW1zOll9KX1pZihZLmlzcyE9PXZvaWQgMCl7aWYodHlwZW9mIFkuaXNzIT09InN0cmluZyIpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImlzcyIgKGlzc3VlcikgY2xhaW0gdHlwZScsTix7Y2xhaW1zOll9KX1pZihZLm5iZiE9PXZvaWQgMCl7aWYodHlwZW9mIFkubmJmIT09Im51bWJlciIpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgIm5iZiIgKG5vdCBiZWZvcmUpIGNsYWltIHR5cGUnLE4se2NsYWltczpZfSk7aWYoWS5uYmY+RitaKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJuYmYiIChub3QgYmVmb3JlKSBjbGFpbSB2YWx1ZScsdjEse2NsYWltczpZLG5vdzpGLHRvbGVyYW5jZTpaLGNsYWltOiJuYmYifSl9aWYoWS5hdWQhPT12b2lkIDApe2lmKHR5cGVvZiBZLmF1ZCE9PSJzdHJpbmciJiYhQXJyYXkuaXNBcnJheShZLmF1ZCkpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImF1ZCIgKGF1ZGllbmNlKSBjbGFpbSB0eXBlJyxOLHtjbGFpbXM6WX0pfXJldHVybntoZWFkZXI6QixjbGFpbXM6WSxqd3Q6JH19ZnVuY3Rpb24gaTgoJCxYLFEsWil7aWYoJCE9PXZvaWQgMCl7aWYodHlwZW9mICQ9PT0ic3RyaW5nIj9aLmFsZyE9PSQ6ISQuaW5jbHVkZXMoWi5hbGcpKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhbGciIGhlYWRlciBwYXJhbWV0ZXInLE4se2hlYWRlcjpaLGV4cGVjdGVkOiQscmVhc29uOiJjbGllbnQgY29uZmlndXJhdGlvbiJ9KTtyZXR1cm59aWYoQXJyYXkuaXNBcnJheShYKSl7aWYoIVguaW5jbHVkZXMoWi5hbGcpKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhbGciIGhlYWRlciBwYXJhbWV0ZXInLE4se2hlYWRlcjpaLGV4cGVjdGVkOlgscmVhc29uOiJhdXRob3JpemF0aW9uIHNlcnZlciBtZXRhZGF0YSJ9KTtyZXR1cm59aWYoUSE9PXZvaWQgMCl7aWYodHlwZW9mIFE9PT0ic3RyaW5nIj9aLmFsZyE9PVE6dHlwZW9mIFE9PT0iZnVuY3Rpb24iPyFRKFouYWxnKTohUS5pbmNsdWRlcyhaLmFsZykpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImFsZyIgaGVhZGVyIHBhcmFtZXRlcicsTix7aGVhZGVyOlosZXhwZWN0ZWQ6USxyZWFzb246ImRlZmF1bHQgdmFsdWUifSk7cmV0dXJufXRocm93IEQoJ21pc3NpbmcgY2xpZW50IG9yIHNlcnZlciBjb25maWd1cmF0aW9uIHRvIHZlcmlmeSB1c2VkIEpXVCAiYWxnIiBoZWFkZXIgcGFyYW1ldGVyJyx2b2lkIDAse2NsaWVudDokLGlzc3VlcjpYLGZhbGxiYWNrOlF9KX1mdW5jdGlvbiBjKCQsWCl7bGV0ezA6USxsZW5ndGg6Wn09JC5nZXRBbGwoWCk7aWYoWj4xKXRocm93IEQoYCIke1h9IiBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZCBvbmx5IG9uY2VgLE4pO3JldHVybiBRfXZhciBhOD1TeW1ib2woKSxuOD1TeW1ib2woKTtmdW5jdGlvbiB3JCgkLFgsUSxaKXtpZih5MSgkKSx3MShYKSxRIGluc3RhbmNlb2YgVVJMKVE9US5zZWFyY2hQYXJhbXM7aWYoIShRIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSl0aHJvdyBTKCcicGFyYW1ldGVycyIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBVUkxTZWFyY2hQYXJhbXMsIG9yIFVSTCcsQSk7aWYoYyhRLCJyZXNwb25zZSIpKXRocm93IEQoJyJwYXJhbWV0ZXJzIiBjb250YWlucyBhIEpBUk0gcmVzcG9uc2UsIHVzZSB2YWxpZGF0ZUp3dEF1dGhSZXNwb25zZSgpIGluc3RlYWQgb2YgdmFsaWRhdGVBdXRoUmVzcG9uc2UoKScsTix7cGFyYW1ldGVyczpRfSk7bGV0IHo9YyhRLCJpc3MiKSxXPWMoUSwic3RhdGUiKTtpZigheiYmJC5hdXRob3JpemF0aW9uX3Jlc3BvbnNlX2lzc19wYXJhbWV0ZXJfc3VwcG9ydGVkKXRocm93IEQoJ3Jlc3BvbnNlIHBhcmFtZXRlciAiaXNzIiAoaXNzdWVyKSBtaXNzaW5nJyxOLHtwYXJhbWV0ZXJzOlF9KTtpZih6JiZ6IT09JC5pc3N1ZXIpdGhyb3cgRCgndW5leHBlY3RlZCAiaXNzIiAoaXNzdWVyKSByZXNwb25zZSBwYXJhbWV0ZXIgdmFsdWUnLE4se2V4cGVjdGVkOiQuaXNzdWVyLHBhcmFtZXRlcnM6UX0pO3N3aXRjaChaKXtjYXNlIHZvaWQgMDpjYXNlIG44OmlmKFchPT12b2lkIDApdGhyb3cgRCgndW5leHBlY3RlZCAic3RhdGUiIHJlc3BvbnNlIHBhcmFtZXRlciBlbmNvdW50ZXJlZCcsTix7ZXhwZWN0ZWQ6dm9pZCAwLHBhcmFtZXRlcnM6UX0pO2JyZWFrO2Nhc2UgYTg6YnJlYWs7ZGVmYXVsdDppZihSKFosJyJleHBlY3RlZFN0YXRlIiBhcmd1bWVudCcpLFchPT1aKXRocm93IEQoVz09PXZvaWQgMD8ncmVzcG9uc2UgcGFyYW1ldGVyICJzdGF0ZSIgbWlzc2luZyc6J3VuZXhwZWN0ZWQgInN0YXRlIiByZXNwb25zZSBwYXJhbWV0ZXIgdmFsdWUnLE4se2V4cGVjdGVkOloscGFyYW1ldGVyczpRfSl9aWYoYyhRLCJlcnJvciIpKXRocm93IG5ldyBSJCgiYXV0aG9yaXphdGlvbiByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgaXMgYW4gZXJyb3IiLHtjYXVzZTpRfSk7bGV0IEg9YyhRLCJpZF90b2tlbiIpLEI9YyhRLCJ0b2tlbiIpO2lmKEghPT12b2lkIDB8fEIhPT12b2lkIDApdGhyb3cgbmV3IGYoImltcGxpY2l0IGFuZCBoeWJyaWQgZmxvd3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4gXzgobmV3IFVSTFNlYXJjaFBhcmFtcyhRKSl9YXN5bmMgZnVuY3Rpb24gZyQoJCxYPU0kKXtsZXQgUTt0cnl7UT1hd2FpdCAkLmpzb24oKX1jYXRjaChaKXt0aHJvdyBYKCQpLEQoJ2ZhaWxlZCB0byBwYXJzZSAicmVzcG9uc2UiIGJvZHkgYXMgSlNPTicseDEsWil9aWYoIXoxKFEpKXRocm93IEQoJyJyZXNwb25zZSIgYm9keSBtdXN0IGJlIGEgdG9wIGxldmVsIG9iamVjdCcsTix7Ym9keTpRfSk7cmV0dXJuIFF9dmFyIFckPVN5bWJvbCgpLG84PVN5bWJvbCgpO3ZhciBWMT02MDAwMDAsczg9ODY0MDAwMDAscjg9MTUwMDA7Y2xhc3MgSSBleHRlbmRzIEVycm9ye3JlYXNvbjtjb25zdHJ1Y3RvcigkLFgpe3N1cGVyKFgpO3RoaXMucmVhc29uPSQ7dGhpcy5uYW1lPSJPaWRjRmxvd0Vycm9yIn19Y2xhc3MgaDF7Y29uZmlnO3JlZGlyZWN0VXJpO2FsbG93SW5zZWN1cmVIdHRwO21ldGFkYXRhO21ldGFkYXRhRmV0Y2hlZEF0PTA7bGFzdERpc2NvdmVyeUZhaWx1cmVBdD0wO2NvbnN0cnVjdG9yKCQsWCxRKXt0aGlzLmNvbmZpZz0kO3RoaXMucmVkaXJlY3RVcmk9WDt0aGlzLmFsbG93SW5zZWN1cmVIdHRwPVF9Z2V0IGNsaWVudCgpe3JldHVybntjbGllbnRfaWQ6dGhpcy5jb25maWcuY2xpZW50SWR9fWdldCBjbGllbnRBdXRoKCl7cmV0dXJuIHRoaXMuY29uZmlnLnRva2VuRW5kcG9pbnRBdXRoTWV0aG9kPT09ImNsaWVudF9zZWNyZXRfcG9zdCI/UCQodGhpcy5jb25maWcuY2xpZW50U2VjcmV0KTpDJCh0aGlzLmNvbmZpZy5jbGllbnRTZWNyZXQpfXJlcXVlc3RPcHRpb25zKCl7cmV0dXJuIHRoaXMuYWxsb3dJbnNlY3VyZUh0dHA/e1tLMV06ITB9Ont9fWFzeW5jIGF1dGhvcml6YXRpb25TZXJ2ZXIoKXtsZXQgJD1EYXRlLm5vdygpO2lmKHRoaXMubWV0YWRhdGEhPT12b2lkIDAmJiQtdGhpcy5tZXRhZGF0YUZldGNoZWRBdDxzOClyZXR1cm4gdGhpcy5tZXRhZGF0YTtpZih0aGlzLm1ldGFkYXRhPT09dm9pZCAwJiYkLXRoaXMubGFzdERpc2NvdmVyeUZhaWx1cmVBdDxyOCl0aHJvdyBuZXcgSSgicHJvdmlkZXJVbmF2YWlsYWJsZSIsYGRpc2NvdmVyeSBmb3IgcHJvdmlkZXIgJHt0aGlzLmNvbmZpZy5pZH0gZmFpbGVkIHJlY2VudGx5OyByZXRyeWluZyBzaG9ydGx5YCk7bGV0IFg9bmV3IFVSTCh0aGlzLmNvbmZpZy5pc3N1ZXIpLFE9RyQoWCx7YWxnb3JpdGhtOiJvaWRjIiwuLi50aGlzLnJlcXVlc3RPcHRpb25zKCl9KS50aGVuKChaKT0+ViQoWCxaKSk7dGhpcy5tZXRhZGF0YT1RLHRoaXMubWV0YWRhdGFGZXRjaGVkQXQ9JDt0cnl7cmV0dXJuIGF3YWl0IFF9Y2F0Y2goWil7dGhyb3cgdGhpcy5tZXRhZGF0YT12b2lkIDAsdGhpcy5sYXN0RGlzY292ZXJ5RmFpbHVyZUF0PURhdGUubm93KCksbmV3IEkoInByb3ZpZGVyVW5hdmFpbGFibGUiLGBkaXNjb3ZlcnkgZm9yIHByb3ZpZGVyICR7dGhpcy5jb25maWcuaWR9ICgke3RoaXMuY29uZmlnLmlzc3Vlcn0pIGZhaWxlZDogJHtaLm1lc3NhZ2V9YCl9fWFzeW5jIGJlZ2luKCQpe2xldCBYPWF3YWl0IHRoaXMuYXV0aG9yaXphdGlvblNlcnZlcigpO2lmKFguYXV0aG9yaXphdGlvbl9lbmRwb2ludD09PXZvaWQgMCl0aHJvdyBuZXcgSSgicHJvdmlkZXJNaXNjb25maWd1cmVkIixgcHJvdmlkZXIgJHt0aGlzLmNvbmZpZy5pZH0gaGFzIG5vIGF1dGhvcml6YXRpb25fZW5kcG9pbnRgKTtsZXQgUT1VJCgpLFo9e3Byb3ZpZGVyOnRoaXMuY29uZmlnLmlkLHN0YXRlOkwkKCksbm9uY2U6TiQoKSxjb2RlVmVyaWZpZXI6USxyZXR1cm5UbzokLGNyZWF0ZWRBdDpEYXRlLm5vdygpfSx6PW5ldyBVUkwoWC5hdXRob3JpemF0aW9uX2VuZHBvaW50KTtyZXR1cm4gei5zZWFyY2hQYXJhbXMuc2V0KCJjbGllbnRfaWQiLHRoaXMuY29uZmlnLmNsaWVudElkKSx6LnNlYXJjaFBhcmFtcy5zZXQoInJlZGlyZWN0X3VyaSIsdGhpcy5yZWRpcmVjdFVyaSksei5zZWFyY2hQYXJhbXMuc2V0KCJyZXNwb25zZV90eXBlIiwiY29kZSIpLHouc2VhcmNoUGFyYW1zLnNldCgic2NvcGUiLHRoaXMuY29uZmlnLnNjb3Blcy5qb2luKCIgIikpLHouc2VhcmNoUGFyYW1zLnNldCgic3RhdGUiLFouc3RhdGUpLHouc2VhcmNoUGFyYW1zLnNldCgibm9uY2UiLFoubm9uY2UpLHouc2VhcmNoUGFyYW1zLnNldCgiY29kZV9jaGFsbGVuZ2UiLGF3YWl0IGIkKFEpKSx6LnNlYXJjaFBhcmFtcy5zZXQoImNvZGVfY2hhbGxlbmdlX21ldGhvZCIsIlMyNTYiKSx7dXJsOnouaHJlZixwZW5kaW5nOlp9fWFzeW5jIGNvbXBsZXRlKCQsWCl7aWYoWC5wcm92aWRlciE9PXRoaXMuY29uZmlnLmlkKXRocm93IG5ldyBJKCJzdGF0ZU1pc21hdGNoIiwidGhlIHBlbmRpbmcgbG9naW4gYmVsb25ncyB0byBhIGRpZmZlcmVudCBwcm92aWRlciIpO2lmKERhdGUubm93KCktWC5jcmVhdGVkQXQ+VjEpdGhyb3cgbmV3IEkoImxvZ2luRXhwaXJlZCIsInRoZSBsb2dpbiB0b29rIHRvbyBsb25nOyBzdGFydCBhZ2FpbiIpO2xldCBRPWF3YWl0IHRoaXMuYXV0aG9yaXphdGlvblNlcnZlcigpLFo7dHJ5e1o9dyQoUSx0aGlzLmNsaWVudCwkLFguc3RhdGUpfWNhdGNoKEgpe3Rocm93IG5ldyBJKCJhdXRob3JpemF0aW9uRmFpbGVkIixILm1lc3NhZ2UpfWxldCB6PWF3YWl0IE8kKFEsdGhpcy5jbGllbnQsdGhpcy5jbGllbnRBdXRoLFosdGhpcy5yZWRpcmVjdFVyaSxYLmNvZGVWZXJpZmllcix0aGlzLnJlcXVlc3RPcHRpb25zKCkpLFc7dHJ5e1c9YXdhaXQgaiQoUSx0aGlzLmNsaWVudCx6LHtleHBlY3RlZE5vbmNlOlgubm9uY2UscmVxdWlyZUlkVG9rZW46ITB9KX1jYXRjaChIKXt0aHJvdyBuZXcgSSgidG9rZW5FeGNoYW5nZUZhaWxlZCIsSC5tZXNzYWdlKX1sZXQgSj1EMShXKTtpZihKPT09dm9pZCAwKXRocm93IG5ldyBJKCJ0b2tlbkV4Y2hhbmdlRmFpbGVkIiwibm8gSUQgdG9rZW4gaW4gdGhlIHRva2VuIHJlc3BvbnNlIik7cmV0dXJuIEp9fXZhciBlOD0yMDQ4O2Z1bmN0aW9uIE0xKCQpe3JldHVybiB0eXBlb2YgJD09PSJzdHJpbmciJiYkLmxlbmd0aDw9ZTgmJnUoJCk/JDoiLyJ9ZnVuY3Rpb24gYSgkKXtyZXR1cm4gJC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjMzk7Iil9dmFyICQ1PSJib2R5e2ZvbnQtZmFtaWx5OnN5c3RlbS11aSxzYW5zLXNlcmlmO2JhY2tncm91bmQ6IzExMTtjb2xvcjojZWVlO2Rpc3BsYXk6ZmxleDttaW4taGVpZ2h0OjEwMHZoO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjowfW1haW57bWF4LXdpZHRoOjI0cmVtO3dpZHRoOjEwMCU7cGFkZGluZzoycmVtfWgxe2ZvbnQtc2l6ZToxLjI1cmVtO21hcmdpbjowIDAgMS41cmVtfWEucHJvdmlkZXJ7ZGlzcGxheTpibG9jaztwYWRkaW5nOi43NXJlbSAxcmVtO21hcmdpbjouNXJlbSAwO2JvcmRlcjoxcHggc29saWQgIzQ0NDtib3JkZXItcmFkaXVzOi41cmVtO2NvbG9yOiNlZWU7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YS5wcm92aWRlcjpob3Zlcntib3JkZXItY29sb3I6Izg4OH1we2NvbG9yOiNiYmI7bGluZS1oZWlnaHQ6MS41fWF7Y29sb3I6IzhhYjRmOH0iO2Z1bmN0aW9uIGgkKCQsWCl7cmV0dXJuYDwhZG9jdHlwZSBodG1sPjxodG1sIGxhbmc9ImVuIj48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+PG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEiPjx0aXRsZT4ke2EoJCl9PC90aXRsZT48c3R5bGU+JHskNX08L3N0eWxlPjwvaGVhZD48Ym9keT48bWFpbj4ke1h9PC9tYWluPjwvYm9keT48L2h0bWw+YH1mdW5jdGlvbiBrJCgkLFgpe2xldCBRPSQubWFwKCh6KT0+YDxhIGNsYXNzPSJwcm92aWRlciIgaHJlZj0iJHthKHouaHJlZil9Ij4ke2Eoei5sYWJlbCl9PC9hPmApLmpvaW4oIiIpLFo9WD09PXZvaWQgMD8iIjpgPHA+PGEgaHJlZj0iJHthKFgpfSI+U2lnbiBpbiB3aXRoIGVtYWlsIGFuZCBwYXNzd29yZDwvYT48L3A+YDtyZXR1cm4gaCQoIlNpZ24gaW4gdG8gSHlwZXJEWCIsYDxoMT5TaWduIGluIHRvIEh5cGVyRFg8L2gxPiR7UX0ke1p9YCl9dmFyIFg1PXtzdWJqZWN0TWlzc2luZzoiVGhlIGlkZW50aXR5IHByb3ZpZGVyIGRpZCBub3QgcmV0dXJuIGEgdXNlciBpZGVudGlmaWVyLiIsZW1haWxNaXNzaW5nOiJUaGUgaWRlbnRpdHkgcHJvdmlkZXIgZGlkIG5vdCByZXR1cm4gYW4gZW1haWwgYWRkcmVzcyBmb3IgeW91ciBhY2NvdW50LiIsZW1haWxJbnZhbGlkOiJZb3VyIGVtYWlsIGFkZHJlc3MgY29udGFpbnMgY2hhcmFjdGVycyBIeXBlckRYIHNpZ24taW4gZG9lcyBub3QgYWNjZXB0LiIsZW1haWxJblVzZToiQSBIeXBlckRYIGFjY291bnQgd2l0aCB5b3VyIGVtYWlsIGFkZHJlc3MgYWxyZWFkeSBiZWxvbmdzIHRvIGFub3RoZXIgc2lnbi1pbi4gQXNrIGFuIGFkbWluaXN0cmF0b3IuIixpbnN0YW5jZU5vdFJlYWR5OiJIeXBlckRYIGlzIHN0aWxsIGJlaW5nIHNldCB1cC4gVHJ5IGFnYWluIGluIGEgbWludXRlLiIsc3RvcmVVbmF2YWlsYWJsZToiSHlwZXJEWCBzaWduLWluIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLiBUcnkgYWdhaW4gaW4gYSBtaW51dGUuIix1bmtub3duUHJvdmlkZXI6IlRoYXQgc2lnbi1pbiBwcm92aWRlciBpcyBub3QgY29uZmlndXJlZC4iLGVtYWlsTm90VmVyaWZpZWQ6IllvdXIgZW1haWwgYWRkcmVzcyBpcyBub3QgdmVyaWZpZWQgd2l0aCB0aGUgaWRlbnRpdHkgcHJvdmlkZXIuIixncm91cE5vdEFsbG93ZWQ6IllvdXIgYWNjb3VudCBpcyBub3QgaW4gYSBncm91cCB0aGF0IGlzIGFsbG93ZWQgdG8gdXNlIEh5cGVyRFguIixlbWFpbERvbWFpbk5vdEFsbG93ZWQ6IllvdXIgZW1haWwgYWRkcmVzcydzIGRvbWFpbiBpcyBub3QgYWxsb3dlZCB0byB1c2UgSHlwZXJEWC4iLG5vQWNjb3VudDoiVGhlcmUgaXMgbm8gSHlwZXJEWCBhY2NvdW50IGZvciB5b3UsIGFuZCB0aGlzIHByb3ZpZGVyIGRvZXMgbm90IGNyZWF0ZSBhY2NvdW50cy4iLHByb3ZpZGVyVW5hdmFpbGFibGU6IlRoZSBpZGVudGl0eSBwcm92aWRlciBjb3VsZCBub3QgYmUgcmVhY2hlZC4gVHJ5IGFnYWluIGluIGEgbW9tZW50LiIsbG9naW5FeHBpcmVkOiJUaGUgc2lnbi1pbiB0b29rIHRvbyBsb25nLiBTdGFydCBhZ2Fpbi4ifTtmdW5jdGlvbiBrMSgkLFgpe2xldCBRPVg1WyRdPz8iU2lnbi1pbiBmYWlsZWQuIjtyZXR1cm4gaCQoIlNpZ24taW4gZmFpbGVkIixgPGgxPlNpZ24taW4gZmFpbGVkPC9oMT48cD4ke2EoUSl9PC9wPjxwPjxhIGhyZWY9IiR7YShYKX0iPlRyeSBhZ2FpbjwvYT48L3A+YCl9dmFyIHI9cmVxdWlyZSgibm9kZTpjcnlwdG8iKTt2YXIgbSQ9MTAsdSQ9InR5cGVrcm9fb2lkY18iLFE1PTUxMjtmdW5jdGlvbiBkJCgkKXtsZXQgWD1uZXcgVVJMKCQsImh0dHA6Ly9wbGFjZWhvbGRlci5pbnZhbGlkIiksUT1YLnBhdGhuYW1lLnJlcGxhY2UoL1wvW14vXStcL2NhbGxiYWNrJC8sIiIpO3JldHVybntwYXRoOlE9PT0iIj8iLyI6USxzZWN1cmU6WC5wcm90b2NvbD09PSJodHRwczoifX1mdW5jdGlvbiBjJCgkKXtyZXR1cm5gJHt1JH0ke3IuY3JlYXRlSGFzaCgic2hhMjU2IikudXBkYXRlKCQpLmRpZ2VzdCgiYmFzZTY0dXJsIikuc2xpY2UoMCwyMil9YH1mdW5jdGlvbiBtMSgkKXtyZXR1cm4gci5jcmVhdGVIYXNoKCJzaGEyNTYiKS51cGRhdGUoJCkuZGlnZXN0KCJoZXgiKX1mdW5jdGlvbiBsJCgkKXtsZXQgWD1uZXcgTWFwO2lmKHR5cGVvZiAkIT09InN0cmluZyIpcmV0dXJuIFg7Zm9yKGxldCBRIG9mICQuc3BsaXQoIjsiKSl7bGV0IFo9US5pbmRleE9mKCI9Iik7aWYoWjw9MCljb250aW51ZTtsZXQgej1RLnNsaWNlKDAsWikudHJpbSgpO2lmKCFYLmhhcyh6KSlYLnNldCh6LFEuc2xpY2UoWisxKS50cmltKCkpfXJldHVybiBYfWZ1bmN0aW9uIHAkKCQsWCxRLFope3JldHVybmAkeyR9PSR7WH07IFBhdGg9JHtRLnBhdGh9OyBNYXgtQWdlPSR7Wn07IEh0dHBPbmx5OyBTYW1lU2l0ZT1MYXhgKyhRLnNlY3VyZT8iOyBTZWN1cmUiOiIiKX12YXIgaSQ9KCQsWCk9PnAkKCQsIiIsWCwwKTtmdW5jdGlvbiBaNSgkKXtsZXQgWD1uZXcgTWFwO2ZvcihsZXRbUSxaXW9mIGwkKCQpKWlmKFEuc3RhcnRzV2l0aCh1JCkmJlohPT0iIilYLnNldChtMShaKSxRKTtyZXR1cm4gWH1hc3luYyBmdW5jdGlvbiBhJCgkLFgsUSxaLHope2xldCBXPVtdLEo9WjUoWCk7aWYoSi5zaXplPj1tJCl7bGV0IEI9Wy4uLmF3YWl0ICQubGlzdEJ5QmluZGluZyhbLi4uSi5rZXlzKCldLG5ldyBEYXRlKHopKV0uc29ydCgoVixQKT0+Vi5jcmVhdGVkQXQtUC5jcmVhdGVkQXQpLFk9bmV3IFNldChCLm1hcCgoVik9PlYuYmluZGluZ0hhc2gpKSxGPVsuLi5KLmtleXMoKV0uZmlsdGVyKChWKT0+IVkuaGFzKFYpKSxMPUIuc2xpY2UoMCxNYXRoLm1heCgwLEIubGVuZ3RoLShtJC0xKSkpLm1hcCgoVik9PlYuYmluZGluZ0hhc2gpO2lmKEwubGVuZ3RoPjApYXdhaXQgJC5yZW1vdmVCeUJpbmRpbmcoTCk7Zm9yKGxldCBWIG9mWy4uLkYsLi4uTF0pVy5wdXNoKGkkKEouZ2V0KFYpLFopKX1sZXQgSD1yLnJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZygiYmFzZTY0dXJsIik7cmV0dXJuIGF3YWl0ICQuaW5zZXJ0KHsuLi5RLGJpbmRpbmdIYXNoOm0xKEgpLGV4cGlyZXNBdDpuZXcgRGF0ZShRLmNyZWF0ZWRBdCtWMSl9KSxXLnB1c2gocCQoYyQoUS5zdGF0ZSksSCxaLFYxLzEwMDApKSxXfWFzeW5jIGZ1bmN0aW9uIG4kKCQsWCxRLFoseixXKXtpZih0eXBlb2YgUSE9PSJzdHJpbmcifHxRLmxlbmd0aD09PTB8fFEubGVuZ3RoPlE1KXJldHVybntwZW5kaW5nOnZvaWQgMCxzZXRDb29raWVzOltdfTtsZXQgSj1jJChRKSxIPWwkKFgpLmdldChKKTtpZihIPT09dm9pZCAwKXJldHVybntwZW5kaW5nOnZvaWQgMCxzZXRDb29raWVzOltdfTtsZXQgQj1baSQoSix6KV07aWYoSD09PSIiKXJldHVybntwZW5kaW5nOnZvaWQgMCxzZXRDb29raWVzOkJ9O2xldCBZPXo1KGF3YWl0ICQudGFrZShRLG0xKEgpLFosbmV3IERhdGUoVykpKTtyZXR1cm57cGVuZGluZzpZIT09dm9pZCAwJiZZLnN0YXRlPT09USYmWS5wcm92aWRlcj09PVo/WTp2b2lkIDAsc2V0Q29va2llczpCfX1mdW5jdGlvbiB6NSgkKXtpZih0eXBlb2YgJCE9PSJvYmplY3QifHwkPT09bnVsbClyZXR1cm47bGV0IFg9JDtpZih0eXBlb2YgWC5wcm92aWRlciE9PSJzdHJpbmcifHx0eXBlb2YgWC5zdGF0ZSE9PSJzdHJpbmcifHx0eXBlb2YgWC5ub25jZSE9PSJzdHJpbmcifHx0eXBlb2YgWC5jb2RlVmVyaWZpZXIhPT0ic3RyaW5nInx8dHlwZW9mIFgucmV0dXJuVG8hPT0ic3RyaW5nInx8dHlwZW9mIFguY3JlYXRlZEF0IT09Im51bWJlciJ8fCFOdW1iZXIuaXNGaW5pdGUoWC5jcmVhdGVkQXQpKXJldHVybjtyZXR1cm57cHJvdmlkZXI6WC5wcm92aWRlcixzdGF0ZTpYLnN0YXRlLG5vbmNlOlgubm9uY2UsY29kZVZlcmlmaWVyOlguY29kZVZlcmlmaWVyLHJldHVyblRvOlgucmV0dXJuVG8sY3JlYXRlZEF0OlguY3JlYXRlZEF0fX12YXIgVTE9InR5cGVrcm8tb2lkYzoiLEo1PSJ0eXBla3JvX29pZGNfaWRlbnRpdGllcyIsVzU9InR5cGVrcm9fb2lkY19wZW5kaW5nX2xvZ2lucyIsWTU9InR5cGVrcm9fb2lkY19zdGF0ZSIsTDE9InRlYW0tY2xhaW0iLEg1PTE1MDAwLEI1PTYwMDAwO2Z1bmN0aW9uIHUxKCQpe3JldHVybiAkPy5jb2RlPT09MTEwMDB9ZnVuY3Rpb24gSzUoJCl7cmV0dXJuIEMxKCQucGF0aCl9dmFyIG8kPSJBdXRoZW50aWNhdGlvbiBtZXRob2QgcGFzc3dvcmQgaXMgbm90IGFsbG93ZWQgYnkgeW91ciB0ZWFtIGFkbWluLiI7ZnVuY3Rpb24gTjEoJCl7cmV0dXJuICQuZGVmYXVsdD8/JH1mdW5jdGlvbiAkMCgkKXtsZXQgWD1yJC5jcmVhdGVSZXF1aXJlKGUkLmpvaW4oJCwiaW5kZXguanMiKSksUT0oVik9PlgoViksWj1OMShRKCJwYXNzcG9ydCIpKSx6PU4xKFEoIi4vcm91dGVycy9hcGkvcm9vdC5qcyIpKSxXPU4xKFEoIi4vbW9kZWxzL3VzZXIuanMiKSksSj1OMShRKCIuL21vZGVscy90ZWFtLmpzIikpLEg9USgiLi9jb250cm9sbGVycy90ZWFtLmpzIiksQj1RKCIuL3NldHVwRGVmYXVsdHMuanMiKSxZPVEoIi4vY29uZmlnLmpzIiksTD1bWyJwYXNzcG9ydC51c2UiLHR5cGVvZiBaPy51c2U9PT0iZnVuY3Rpb24iXSxbInBhc3Nwb3J0LnVudXNlIix0eXBlb2YgWj8udW51c2U9PT0iZnVuY3Rpb24iXSxbInBhc3Nwb3J0LmF1dGhlbnRpY2F0ZSIsdHlwZW9mIFo/LmF1dGhlbnRpY2F0ZT09PSJmdW5jdGlvbiJdLFsicGFzc3BvcnQuX3N0cmF0ZWd5KCdsb2NhbCcpIix0eXBlb2YgWj8uX3N0cmF0ZWd5PT09ImZ1bmN0aW9uIiYmdHlwZW9mIFouX3N0cmF0ZWd5KCJsb2NhbCIpPy5hdXRoZW50aWNhdGU9PT0iZnVuY3Rpb24iXSxbInJvdXRlcnMvYXBpL3Jvb3Qgcm91dGVyIixBcnJheS5pc0FycmF5KHo/LnN0YWNrKSYmdHlwZW9mIHo/LmdldD09PSJmdW5jdGlvbiJdLFsibW9kZWxzL3VzZXIiLHR5cGVvZiBXPy5maW5kT25lPT09ImZ1bmN0aW9uIiYmdHlwZW9mIFc/LmNyZWF0ZT09PSJmdW5jdGlvbiImJnR5cGVvZiBXPy51cGRhdGVPbmU9PT0iZnVuY3Rpb24iXSxbIm1vZGVscy90ZWFtIix0eXBlb2YgSj8uZmluZD09PSJmdW5jdGlvbiJdLFsiY29udHJvbGxlcnMvdGVhbS5jcmVhdGVUZWFtIix0eXBlb2YgSC5jcmVhdGVUZWFtPT09ImZ1bmN0aW9uIl0sWyJzZXR1cERlZmF1bHRzLnNldHVwVGVhbURlZmF1bHRzIix0eXBlb2YgQi5zZXR1cFRlYW1EZWZhdWx0cz09PSJmdW5jdGlvbiJdLFsiY29uZmlnLkZST05URU5EX1VSTCIsdHlwZW9mIFkuRlJPTlRFTkRfVVJMPT09InN0cmluZyJ8fFkuRlJPTlRFTkRfVVJMPT09dm9pZCAwXV0uZmlsdGVyKChbLFZdKT0+IVYpLm1hcCgoW1ZdKT0+Vik7aWYoTC5sZW5ndGg+MCl0aHJvdyBFcnJvcihgSHlwZXJEWCBob29rIHBvaW50KHMpIG5vdCBmb3VuZDogJHtMLmpvaW4oIiwgIil9YCk7cmV0dXJue3Bhc3Nwb3J0Oloscm9vdFJvdXRlcjp6LFVzZXI6VyxUZWFtOkosY3JlYXRlVGVhbTpILmNyZWF0ZVRlYW0sc2V0dXBUZWFtRGVmYXVsdHM6Qi5zZXR1cFRlYW1EZWZhdWx0cyxmcm9udGVuZFVybDpTdHJpbmcoWS5GUk9OVEVORF9VUkw/PyIiKS5yZXBsYWNlKC9cLyskLywiIiksZnJvbnRlbmRSZWRpcmVjdEJhc2U6U3RyaW5nKFkuRlJPTlRFTkRfUkVESVJFQ1RfQkFTRT8/WS5GUk9OVEVORF9VUkw/PyIiKS5yZXBsYWNlKC9cLyskLywiIil9fWZ1bmN0aW9uIEY1KCQsWCl7bGV0IFE9JC5Vc2VyLmRiLmNvbGxlY3Rpb24oVzUpLFosej0oKT0+e2lmKFo9PT12b2lkIDApWj1Qcm9taXNlLmFsbChbUS5jcmVhdGVJbmRleCh7c3RhdGU6MX0se3VuaXF1ZTohMCxuYW1lOiJzdGF0ZSJ9KSxRLmNyZWF0ZUluZGV4KHtleHBpcmVzQXQ6MX0se2V4cGlyZUFmdGVyU2Vjb25kczowLG5hbWU6ImV4cGlyeSJ9KSxRLmNyZWF0ZUluZGV4KHtiaW5kaW5nSGFzaDoxfSx7bmFtZToiYmluZGluZyJ9KV0pLnRoZW4oKCk9PntyZXR1cm59LChXKT0+e3Rocm93IFo9dm9pZCAwLFguZXJyb3IoImNvdWxkIG5vdCBjcmVhdGUgdGhlIHBlbmRpbmcgc2lnbi1pbiBpbmRleGVzOyBPSURDIHNpZ24taW4gaXMgcmVmdXNlZCB1bnRpbCB0aGV5IGV4aXN0Iix7ZXJyb3I6U3RyaW5nKFcpfSksbmV3IEkoInN0b3JlVW5hdmFpbGFibGUiLCJwZW5kaW5nIHNpZ24taW4gaW5kZXhlcyBhcmUgbm90IGluIHBsYWNlIil9KTtyZXR1cm4gWn07cmV0dXJuIHooKS5jYXRjaCgoKT0+e30pLHthc3luYyBpbnNlcnQoVyl7YXdhaXQgeigpLGF3YWl0IFEuaW5zZXJ0T25lKHsuLi5XfSl9LGFzeW5jIHRha2UoVyxKLEgsQil7cmV0dXJuIGF3YWl0IHooKSwoYXdhaXQgUS5maW5kT25lQW5kRGVsZXRlKHtzdGF0ZTpXLGJpbmRpbmdIYXNoOkoscHJvdmlkZXI6SCxleHBpcmVzQXQ6eyRndDpCfX0se2luY2x1ZGVSZXN1bHRNZXRhZGF0YTohMH0pKT8udmFsdWU/P251bGx9LGFzeW5jIGxpc3RCeUJpbmRpbmcoVyxKKXtyZXR1cm4oYXdhaXQgUS5maW5kKHtiaW5kaW5nSGFzaDp7JGluOlsuLi5XXX0sZXhwaXJlc0F0OnskZ3Q6Sn19LHtwcm9qZWN0aW9uOntfaWQ6MCxiaW5kaW5nSGFzaDoxLGNyZWF0ZWRBdDoxfX0pLnRvQXJyYXkoKSkuZmxhdE1hcCgoQik9PnR5cGVvZiBCLmJpbmRpbmdIYXNoPT09InN0cmluZyImJnR5cGVvZiBCLmNyZWF0ZWRBdD09PSJudW1iZXIiP1t7YmluZGluZ0hhc2g6Qi5iaW5kaW5nSGFzaCxjcmVhdGVkQXQ6Qi5jcmVhdGVkQXR9XTpbXSl9LGFzeW5jIHJlbW92ZUJ5QmluZGluZyhXKXthd2FpdCBRLmRlbGV0ZU1hbnkoe2JpbmRpbmdIYXNoOnskaW46Wy4uLlddfX0pfX19ZnVuY3Rpb24gRDUoJCxYLFEsWil7bGV0IHo9JC5Vc2VyLmRiLmNvbGxlY3Rpb24oSjUpLFc9JC5Vc2VyLmRiLmNvbGxlY3Rpb24oWTUpLEosSD0oKT0+e2lmKEo9PT12b2lkIDApSj1Qcm9taXNlLmFsbChbei5jcmVhdGVJbmRleCh7cHJvdmlkZXI6MSxzdWJqZWN0OjF9LHt1bmlxdWU6ITAsbmFtZToicHJvdmlkZXJfc3ViamVjdCJ9KSx6LmNyZWF0ZUluZGV4KHt1c2VySWQ6MX0se3VuaXF1ZTohMCxuYW1lOiJ1c2VyIn0pXSkudGhlbigoKT0+e3JldHVybn0sKFkpPT57dGhyb3cgSj12b2lkIDAsWi5lcnJvcigiY291bGQgbm90IGNyZWF0ZSB0aGUgaWRlbnRpdHktbGluayBpbmRleGVzOyBPSURDIHNpZ24taW4gaXMgcmVmdXNlZCB1bnRpbCB0aGV5IGV4aXN0Iix7ZXJyb3I6U3RyaW5nKFkpfSksbmV3IEkoInN0b3JlVW5hdmFpbGFibGUiLCJpZGVudGl0eS1saW5rIGluZGV4ZXMgYXJlIG5vdCBpbiBwbGFjZSIpfSk7cmV0dXJuIEp9O0goKS5jYXRjaCgoKT0+e30pO2FzeW5jIGZ1bmN0aW9uIEIoWSl7bGV0IEY9WCgpLnRlYW1JZDtpZihGIT09dm9pZCAwKXtpZihhd2FpdCAkLlRlYW0uZmluZEJ5SWQoRik9PT1udWxsKXRocm93IEVycm9yKGBjb25maWd1cmVkIHRlYW1JZCAke0Z9IGRvZXMgbm90IGV4aXN0YCk7cmV0dXJuIEZ9bGV0IEw9YXN5bmMoKT0+YXdhaXQgJC5UZWFtLmZpbmQoe30pLnNlbGVjdCgiX2lkIikubGltaXQoMikubGVhbigpLFY9YXdhaXQgTCgpO2lmKFYubGVuZ3RoPT09MSlyZXR1cm4gVlswXS5faWQudG9TdHJpbmcoKTtpZihWLmxlbmd0aD4xKXRocm93IEVycm9yKCJtb3JlIHRoYW4gb25lIEh5cGVyRFggdGVhbSBleGlzdHM7IHNldCB0ZWFtSWQgaW4gdGhlIE9JREMgY29uZmlndXJhdGlvbiIpO2lmKCFRLmNyZWF0ZVRlYW0pdGhyb3cgbmV3IEkoImluc3RhbmNlTm90UmVhZHkiLCJubyBIeXBlckRYIHRlYW0gZXhpc3RzIHlldCBhbmQgdGhpcyBwbHVnaW4gZG9lcyBub3QgY3JlYXRlIG9uZSIpO2xldCBQPShfKT0+Xy5sZW5ndGg9PT0xP19bMF0uX2lkLnRvU3RyaW5nKCk6dm9pZCAwO3RyeXthd2FpdCBXLmluc2VydE9uZSh7X2lkOkwxLGF0Om5ldyBEYXRlLGJ5Oll9KX1jYXRjaChfKXtpZighdTEoXykpdGhyb3cgXztsZXQgRT1EYXRlLm5vdygpK0g1O3doaWxlKERhdGUubm93KCk8RSl7bGV0IG49UChhd2FpdCBMKCkpO2lmKG4hPT12b2lkIDApcmV0dXJuIG47YXdhaXQgbmV3IFByb21pc2UoKHcpPT5zZXRUaW1lb3V0KHcsMjUwKSl9bGV0IHk9YXdhaXQgVy5maW5kT25lKHtfaWQ6TDF9KSxTMT15Py5hdCBpbnN0YW5jZW9mIERhdGU/eS5hdC5nZXRUaW1lKCk6MDtpZihEYXRlLm5vdygpLVMxPkI1KWF3YWl0IFcuZGVsZXRlT25lKHtfaWQ6TDEsYXQ6eT8uYXR9KTt0aHJvdyBuZXcgSSgiaW5zdGFuY2VOb3RSZWFkeSIsImFub3RoZXIgZmlyc3QgbG9naW4gaXMgY3JlYXRpbmcgdGhlIEh5cGVyRFggdGVhbSIpfWxldCBPO3RyeXtPPWF3YWl0ICQuY3JlYXRlVGVhbSh7bmFtZTpgJHtZfSdzIFRlYW1gLGNvbGxlY3RvckF1dGhlbnRpY2F0aW9uRW5mb3JjZWQ6ITB9KX1jYXRjaChfKXtsZXQgRT1QKGF3YWl0IEwoKSk7aWYoRSE9PXZvaWQgMClyZXR1cm4gRTt0aHJvdyBhd2FpdCBXLmRlbGV0ZU9uZSh7X2lkOkwxfSksX31sZXQgdj1PLl9pZC50b1N0cmluZygpO3JldHVybiBhd2FpdCAkLnNldHVwVGVhbURlZmF1bHRzKHYpLmNhdGNoKChfKT0+Wi5lcnJvcigic2V0dGluZyB1cCBkZWZhdWx0IGNvbm5lY3Rpb25zIGFuZCBzb3VyY2VzIGZvciB0aGUgbmV3IHRlYW0gZmFpbGVkIix7ZXJyb3I6U3RyaW5nKF8pfSkpLHZ9cmV0dXJue2FzeW5jIGZpbmRMaW5rZWRVc2VySWQoWSxGKXthd2FpdCBIKCk7bGV0IEw9YXdhaXQgei5maW5kT25lKHtwcm92aWRlcjpZLHN1YmplY3Q6Rn0pO3JldHVybiBMPT09bnVsbD9udWxsOlN0cmluZyhMLnVzZXJJZCl9LGFzeW5jIHVzZXJFeGlzdHMoWSl7cmV0dXJuIGF3YWl0ICQuVXNlci5maW5kQnlJZChZKSE9PW51bGx9LGFzeW5jIGZpbmRVc2VySWRCeUVtYWlsKFkpe2xldCBGPWF3YWl0ICQuVXNlci5maW5kT25lKHtlbWFpbDpZfSkuc2VsZWN0KCJfaWQiKS5sZWFuKCk7cmV0dXJuIEY9PT1udWxsP251bGw6U3RyaW5nKEYuX2lkKX0sYXN5bmMgdXNlckhhc0FueUxpbmsoWSl7cmV0dXJuIGF3YWl0IHouZmluZE9uZSh7dXNlcklkOll9KSE9PW51bGx9LGFzeW5jIGNyZWF0ZVVzZXIoWSxGKXtsZXQgTD1hd2FpdCBCKFkpO3RyeXtyZXR1cm4oYXdhaXQgJC5Vc2VyLmNyZWF0ZSh7ZW1haWw6WSxuYW1lOkYsdGVhbTpMfSkpLl9pZC50b1N0cmluZygpfWNhdGNoKFYpe2lmKHUxKFYpKXRocm93IG5ldyBwO3Rocm93IFZ9fSxhc3luYyBsaW5rKFksRil7YXdhaXQgSCgpO2xldCBMPW5ldyBEYXRlO3RyeXthd2FpdCB6LnVwZGF0ZU9uZSh7cHJvdmlkZXI6WS5wcm92aWRlcixzdWJqZWN0Olkuc3ViamVjdH0seyRzZXQ6e3VzZXJJZDpGLGVtYWlsOlkuZW1haWwsbGFzdExvZ2luQXQ6TH0sJHNldE9uSW5zZXJ0OntjcmVhdGVkQXQ6TH19LHt1cHNlcnQ6ITB9KX1jYXRjaChWKXtpZighdTEoVikpdGhyb3cgVjtsZXQgUD1hd2FpdCB6LmZpbmRPbmUoe3Byb3ZpZGVyOlkucHJvdmlkZXIsc3ViamVjdDpZLnN1YmplY3R9KTtpZihQIT09bnVsbCYmU3RyaW5nKFAudXNlcklkKT09PUYpcmV0dXJuO3Rocm93IG5ldyBwfX0sYXN5bmMgdW5saW5rKFksRil7YXdhaXQgei5kZWxldGVPbmUoe3Byb3ZpZGVyOlksc3ViamVjdDpGfSl9LGFzeW5jIHRvdWNoKFksRil7YXdhaXQgei51cGRhdGVPbmUoe3Byb3ZpZGVyOlksc3ViamVjdDpGfSx7JHNldDp7bGFzdExvZ2luQXQ6bmV3IERhdGV9fSl9fX1mdW5jdGlvbiBYMCgkLFgsUSxaPXtjcmVhdGVUZWFtOiEwfSl7bGV0IHosVyxKPSExLEg9bmV3IE1hcCxCPUQ1KCQsKCk9Pno/P3ExKCd7InByb3ZpZGVycyI6W119JyksWixRKSxZPUY1KCQsUSk7YXN5bmMgZnVuY3Rpb24gRihLLEcpe2lmKHR5cGVvZiBHIT09InN0cmluZyIpcmV0dXJuO2xldCBNPWF3YWl0IEIuZmluZExpbmtlZFVzZXJJZChLLEcpO2lmKE09PT1udWxsKXJldHVybjthd2FpdCAkLlVzZXIudXBkYXRlT25lKHtfaWQ6TX0seyRzZXQ6e2FjY2Vzc0tleTp0JC5yYW5kb21VVUlEKCl9fSksUS53YXJuKCJyb3RhdGVkIHRoZSBhY2Nlc3Mga2V5IG9mIGEgbGlua2VkIHVzZXIgdGhlIHByb3ZpZGVyIG5vIGxvbmdlciBhZG1pdHMiLHtwcm92aWRlcjpLLHVzZXJJZDpNfSl9bGV0IEw9KCk9Pno/LmFwaVBhdGhQcmVmaXg/PyIvYXBpIixWPSgpPT5gJHtMKCl9L2xvZ2luL29pZGNgLFA9KEspPT4kMShLPy5yZWRpcmVjdEJhc2VVcmwsJC5mcm9udGVuZFVybCksTz0oKT0+UCh6KSx2PSgpPT4kMSgkLmZyb250ZW5kUmVkaXJlY3RCYXNlLHo/LnJlZGlyZWN0QmFzZVVybCksXz0oSyk9PlgxKHYoKSxLKTtmdW5jdGlvbiBFKEspe3JldHVybntuYW1lOmAke1UxfSR7S31gLGF1dGhlbnRpY2F0ZShHKXtsZXQgTT1ILmdldChLKTtpZihNPT09dm9pZCAwKXt0aGlzLmZhaWwoe3JlYXNvbjoidW5rbm93blByb3ZpZGVyIn0sNDA0KTtyZXR1cm59KGFzeW5jKCk9PntsZXQgYj1HLnNlc3Npb247aWYoYj09PXZvaWQgMCl0aHJvdyBFcnJvcigiSHlwZXJEWCBzZXNzaW9uIG1pZGRsZXdhcmUgaXMgbm90IGFjdGl2ZSIpO2lmKEcucmVzPT09dm9pZCAwKXRocm93IEVycm9yKCJ0aGUgcmVxdWVzdCBoYXMgbm8gcmVzcG9uc2UgdG8gc2V0IGNvb2tpZXMgb24iKTtpZigidHlwZWtyb09pZGNQZW5kaW5nImluIGIpZGVsZXRlIGIudHlwZWtyb09pZGNQZW5kaW5nO2lmKCJ0eXBla3JvT2lkY1BlbmRpbmdMb2dpbnMiaW4gYilkZWxldGUgYi50eXBla3JvT2lkY1BlbmRpbmdMb2dpbnM7bGV0IFQ9ZCQoTS5yZWRpcmVjdFVyaSk7aWYoRy5xdWVyeS5jb2RlPT09dm9pZCAwJiZHLnF1ZXJ5LmVycm9yPT09dm9pZCAwKXtsZXR7dXJsOkswLHBlbmRpbmc6RjB9PWF3YWl0IE0uYmVnaW4oTTEoRy5xdWVyeS5yZXR1cm5UbykpO0cucmVzLmFwcGVuZCgiU2V0LUNvb2tpZSIsYXdhaXQgYSQoWSxHLmhlYWRlcnMuY29va2llLEYwLFQsRGF0ZS5ub3coKSkpLHRoaXMucmVkaXJlY3QoSzApO3JldHVybn1sZXR7cGVuZGluZzp4LHNldENvb2tpZXM6a309YXdhaXQgbiQoWSxHLmhlYWRlcnMuY29va2llLEcucXVlcnkuc3RhdGUsSyxULERhdGUubm93KCkpO2lmKGsubGVuZ3RoPjApRy5yZXMuYXBwZW5kKCJTZXQtQ29va2llIixrKTtpZih4PT09dm9pZCAwKXtRLndhcm4oIk9JREMgY2FsbGJhY2sgbWF0Y2hlZCBubyBwZW5kaW5nIHNpZ24taW4iLHtwcm92aWRlcjpLfSksdGhpcy5mYWlsKHtyZWFzb246ImxvZ2luRXhwaXJlZCJ9LDQwMCk7cmV0dXJufWxldCBsPW5ldyBVUkwoRy5vcmlnaW5hbFVybCxPKCl8fCJodHRwOi8vcGxhY2Vob2xkZXIuaW52YWxpZCIpLGExPWF3YWl0IE0uY29tcGxldGUobCx4KSxtPSQkKE0uY29uZmlnLGExKTtpZighbS5hbGxvd2VkKXtpZihRLndhcm4oIk9JREMgbG9naW4gZGVuaWVkIix7cHJvdmlkZXI6SyxyZWFzb246bS5yZWFzb259KSxtLnJlYXNvbiE9PSJzdWJqZWN0TWlzc2luZyIpYXdhaXQgRihLLGExLnN1Yik7dGhpcy5mYWlsKHtyZWFzb246bS5yZWFzb24scmV0dXJuVG86eC5yZXR1cm5Ub30sNDAzKTtyZXR1cm59bGV0IG89YXdhaXQgWCQoQixNLmNvbmZpZyxtLmlkZW50aXR5KTtpZigiZGVuaWVkImluIG8pe1Eud2FybigiT0lEQyBsb2dpbiBkZW5pZWQiLHtwcm92aWRlcjpLLHJlYXNvbjpvLmRlbmllZCxlbWFpbDptLmlkZW50aXR5LmVtYWlsfSksdGhpcy5mYWlsKHtyZWFzb246by5kZW5pZWR9LDQwMyk7cmV0dXJufWxldCBCMD1hd2FpdCAkLlVzZXIuZmluZEJ5SWQoby51c2VySWQpO1EuaW5mbygiT0lEQyBsb2dpbiIse3Byb3ZpZGVyOkssZW1haWw6bS5pZGVudGl0eS5lbWFpbCxvdXRjb21lOm8ub3V0Y29tZX0pLHRoaXMuc3VjY2VzcyhCMCx7cHJvdmlkZXI6SyxyZXR1cm5Ubzp4LnJldHVyblRvfSl9KSgpLmNhdGNoKChiKT0+e2lmKGIgaW5zdGFuY2VvZiBJKXtRLndhcm4oIk9JREMgbG9naW4gZmFpbGVkIix7cHJvdmlkZXI6SyxyZWFzb246Yi5yZWFzb24sZGV0YWlsOmIubWVzc2FnZX0pO2xldCBUPVsicHJvdmlkZXJVbmF2YWlsYWJsZSIsImluc3RhbmNlTm90UmVhZHkiLCJzdG9yZVVuYXZhaWxhYmxlIl0uaW5jbHVkZXMoYi5yZWFzb24pO3RoaXMuZmFpbCh7cmVhc29uOmIucmVhc29ufSxUPzUwMzo0MDApO3JldHVybn10aGlzLmVycm9yKGIpfSl9fX1mdW5jdGlvbiB5KEspe2xldCBHPW5ldyBNYXAsTT1QKEspO2ZvcihsZXQgVSBvZiBLLnByb3ZpZGVycyl7bGV0IGI9WDEoTSxgJHtLLmFwaVBhdGhQcmVmaXh9L2xvZ2luL29pZGMvJHtVLmlkfS9jYWxsYmFja2ApLFQ9SC5nZXQoVS5pZCk7Ry5zZXQoVS5pZCxUIT09dm9pZCAwJiZULnJlZGlyZWN0VXJpPT09YiYmSlNPTi5zdHJpbmdpZnkoVC5jb25maWcpPT09SlNPTi5zdHJpbmdpZnkoVSk/VDpuZXcgaDEoVSxiLEsuYWxsb3dJbnNlY3VyZUh0dHApKX1mb3IobGV0IFUgb2YgSC5rZXlzKCkpaWYoIUcuaGFzKFUpKSQucGFzc3BvcnQudW51c2UoYCR7VTF9JHtVfWApO2ZvcihsZXQgVSBvZiBHLmtleXMoKSkkLnBhc3Nwb3J0LnVzZShgJHtVMX0ke1V9YCxFKFUpKTtpZihIPUcsej1LLFMxKEspLEsuYWxsb3dJbnNlY3VyZUh0dHApUS53YXJuKCJhbGxvd0luc2VjdXJlSHR0cCBpcyBvbjogaXNzdWVycyBhbmQgY2FsbGJhY2tzIG1heSB1c2UgcGxhaW4gaHR0cC4gVXNlIHRoaXMgb25seSBmb3IgdGVzdHM7IGl0IHJlbW92ZXMgdGhlIFRMUyBwcm90ZWN0aW9uIHRoZSBJRC10b2tlbiBjaGVja3MgcmVseSBvbi4iKTtmb3IobGV0IFUgb2YgSC52YWx1ZXMoKSlVLmF1dGhvcml6YXRpb25TZXJ2ZXIoKS5jYXRjaCgoYik9PlEud2FybigiT0lEQyBkaXNjb3ZlcnkgZmFpbGVkOyB3aWxsIHJldHJ5IG9uIGRlbWFuZCIse3Byb3ZpZGVyOlUuY29uZmlnLmlkLGVycm9yOlN0cmluZyhiKX0pKX1mdW5jdGlvbiBTMShLKXtsZXQgRz0kMSgkLmZyb250ZW5kVXJsKTtpZihQKEspPT09IiIpe2xldCBNPSQuZnJvbnRlbmRVcmw9PT0iIj8iaXMgbm90IHNldCI6ImlzIG5vdCBhIHZhbGlkIGh0dHAocykgYmFzZSBVUkwgKGFic29sdXRlLCB3aXRob3V0IGNyZWRlbnRpYWxzLCBxdWVyeSBvciBmcmFnbWVudCkiO1Eud2FybihgSHlwZXJEWCdzIEZST05URU5EX1VSTCAke019IGFuZCByZWRpcmVjdEJhc2VVcmwgaXMgbm90IHNldDogY2FsbGJhY2sgVVJMcyBhbmQgcmVkaXJlY3RzIGFyZSByZWxhdGl2ZS4gUHJvdmlkZXJzIHJlZnVzZSBhIHJlbGF0aXZlIGNhbGxiYWNrLCBhbmQgYmVoaW5kIGEgcmV2ZXJzZSBwcm94eSBIeXBlckRYJ3MgVUkgcmV3cml0ZXMgcmVsYXRpdmUgcmVkaXJlY3RzIHRvIHRoZSBBUEkgc2VydmVyJ3MgcG9ydC5gKTtyZXR1cm59aWYoSy5yZWRpcmVjdEJhc2VVcmwhPT12b2lkIDAmJkchPT0iIil7bGV0IE09bmV3IFVSTChLLnJlZGlyZWN0QmFzZVVybCkub3JpZ2luLFU9bmV3IFVSTChHKS5vcmlnaW47aWYoTSE9PVUpUS53YXJuKCJyZWRpcmVjdEJhc2VVcmwgYW5kIEh5cGVyRFgncyBGUk9OVEVORF9VUkwgaGF2ZSBkaWZmZXJlbnQgb3JpZ2luczogc2lnbi1pbiBjb21wbGV0ZXMsIGFuZCBzZXRzIGl0cyBzZXNzaW9uIGNvb2tpZSwgb24gcmVkaXJlY3RCYXNlVXJsJ3Mgb3JpZ2luLCB0aGVuIHNlbmRzIHRoZSBicm93c2VyIHRvIEZST05URU5EX1VSTCdzLCB3aGVyZSB0aGF0IHNlc3Npb24gaXMgbm90IHNlbnQuIFRoZXkgbXVzdCBzaGFyZSBhbiBvcmlnaW4uIix7cmVkaXJlY3RCYXNlT3JpZ2luOk0sZnJvbnRlbmRPcmlnaW46VX0pfX1mdW5jdGlvbiBuKCl7bGV0IEs7dHJ5e0s9cyQucmVhZEZpbGVTeW5jKFgsInV0ZjgiKX1jYXRjaChHKXtpZighSilKPSEwLFEuZXJyb3Ioej09PXZvaWQgMD8iT0lEQyBjb25maWd1cmF0aW9uIHVucmVhZGFibGU7IG5vIHByb3ZpZGVycyBhY3RpdmUiOiJPSURDIGNvbmZpZ3VyYXRpb24gYmVjYW1lIHVucmVhZGFibGU7IGtlZXBpbmcgdGhlIHByZXZpb3VzIG9uZSIse3BhdGg6WCxlcnJvcjpTdHJpbmcoRyl9KTtyZXR1cm4hMX1pZihKKUo9ITEsUS5pbmZvKCJPSURDIGNvbmZpZ3VyYXRpb24gcmVhZGFibGUgYWdhaW4iLHtwYXRoOlh9KTtpZihLPT09VylyZXR1cm4hMTtXPUs7dHJ5e3kocTEoSykpfWNhdGNoKEcpe3JldHVybiBRLmVycm9yKHo9PT12b2lkIDA/Ik9JREMgY29uZmlndXJhdGlvbiByZWplY3RlZCBhbmQgbm9uZSBoYXMgYmVlbiBhcHBsaWVkIHNpbmNlIHN0YXJ0OyBubyBwcm92aWRlcnMgYWN0aXZlIGFuZCBwYXNzd29yZCBsb2dpbiBpcyBhbGxvd2VkIjoiT0lEQyBjb25maWd1cmF0aW9uIHJlamVjdGVkOyBrZWVwaW5nIHRoZSBwcmV2aW91cyBvbmUiLHtlcnJvcjpTdHJpbmcoRyl9KSwhMX1yZXR1cm4gUS5pbmZvKCJPSURDIGNvbmZpZ3VyYXRpb24gYXBwbGllZCIse3Byb3ZpZGVyczpbLi4uSC5rZXlzKCldLHBhc3N3b3JkTG9naW46ej8ucGFzc3dvcmRMb2dpbixwYXNzd29yZExvZ2luUGF0aDpSMSh6LFoucGFzc3dvcmRMb2dpblBhdGgpLG1heFNlc3Npb25BZ2VNczp6Py5tYXhTZXNzaW9uQWdlTXN9KSwhMH1sZXQgdz0kLnJvb3RSb3V0ZXI7ZnVuY3Rpb24gYzEoSyl7dy51c2UoSyk7bGV0IEc9dy5zdGFjay5wb3AoKTt3LnN0YWNrLnVuc2hpZnQoRyl9YzEoKEssRyxNKT0+e2xldCBVPUsuc2Vzc2lvbj8udHlwZWtyb09pZGNBdXRoO2lmKFU9PT12b2lkIDB8fEsudXNlcj09PXZvaWQgMHx8ej09PXZvaWQgMCl7TSgpO3JldHVybn1pZighKHoubWF4U2Vzc2lvbkFnZU1zPjAmJkRhdGUubm93KCktVS5hdD56Lm1heFNlc3Npb25BZ2VNcykmJkguaGFzKFUucHJvdmlkZXIpKXtNKCk7cmV0dXJufUsubG9nb3V0KChUKT0+TShUKSl9KTtsZXQgbDE9JC5wYXNzcG9ydC5fc3RyYXRlZ3koImxvY2FsIiksVzA9bDEuYXV0aGVudGljYXRlLHAxPW5ldyBXZWFrU2V0O2wxLmF1dGhlbnRpY2F0ZT1mdW5jdGlvbihHLE0pe2lmKHohPT12b2lkIDAmJiF6LnBhc3N3b3JkTG9naW4mJiFwMS5oYXMoRykpe3RoaXMuZmFpbCh7bWVzc2FnZTpvJH0pO3JldHVybn1XMC5jYWxsKHRoaXMsRyxNKX07bGV0IFkwPVsvXlwvbG9naW5cL3Bhc3N3b3JkJC8sL15cL3JlZ2lzdGVyXC9wYXNzd29yZCQvLC9eXC90ZWFtXC9zZXR1cFwvW14vXSskL10sSDA9YXN5bmMoKT0+KGF3YWl0ICQuVGVhbS5maW5kKHt9KS5zZWxlY3QoIl9pZCIpLmxpbWl0KDEpLmxlYW4oKSkubGVuZ3RoPjA7YzEoKEssRyxNKT0+e2lmKEsubWV0aG9kIT09IlBPU1QifHx6PT09dm9pZCAwfHx6LnBhc3N3b3JkTG9naW4pe00oKTtyZXR1cm59bGV0IFU9SzUoSyk7aWYoIVkwLnNvbWUoKFQpPT5ULnRlc3QoVSkpKXtNKCk7cmV0dXJufWxldCBiPSgpPT57aWYoSy5zZXNzaW9uIT09dm9pZCAwKUsuc2Vzc2lvbi5tZXNzYWdlcz1bbyRdO0cucmVkaXJlY3QoMzAzLF8oIi9sb2dpbj9lcnI9cGFzc3dvcmRBdXRoTm90QWxsb3dlZCIpKX07aWYoVSE9PSIvcmVnaXN0ZXIvcGFzc3dvcmQiKXtiKCk7cmV0dXJufXMxKEssWix7dGVhbUV4aXN0czpIMH0pLnRoZW4oKFQpPT57aWYoIVQpe2IoKTtyZXR1cm59cDEuYWRkKEspLE0oKX0sKFQpPT57US53YXJuKCJjb3VsZCBub3QgY2hlY2sgZm9yIGFuIGV4aXN0aW5nIHRlYW07IHJlZnVzaW5nIHRoZSByZWdpc3RyYXRpb24iLHtlcnJvcjpTdHJpbmcoVCl9KSxiKCl9KX0pLHcuZ2V0KCIvbG9naW4vb2lkYyIsKEssRyk9PntsZXQgTT1NMShLLnF1ZXJ5LnJldHVyblRvKSxVPVsuLi5ILnZhbHVlcygpXTtpZihVLmxlbmd0aD09PTEpe2xldCB4PVQxKFYoKSxVWzBdLmNvbmZpZy5pZCxNKTtHLnJlZGlyZWN0KDMwMixYMShPKCkseCkpO3JldHVybn1sZXQgYj1SMSh6LFoucGFzc3dvcmRMb2dpblBhdGgpLFQ9Yj09PXZvaWQgMD92b2lkIDA6XyhiKTtHLnN0YXR1cyhVLmxlbmd0aD09PTA/NTAzOjIwMCkudHlwZSgiaHRtbCIpLnNlbmQoayQoVS5tYXAoKHgpPT4oe2xhYmVsOnguY29uZmlnLmRpc3BsYXlOYW1lLGhyZWY6VDEoVigpLHguY29uZmlnLmlkLE0pfSkpLFQpKX0pO2xldCBpMT0oSyxHLE0pPT57bGV0IFU9Sy5wYXJhbXMucHJvdmlkZXI/PyIiO2lmKCFILmhhcyhVKSl7Ry5zdGF0dXMoNDA0KS50eXBlKCJodG1sIikuc2VuZChrMSgidW5rbm93blByb3ZpZGVyIixWKCkpKTtyZXR1cm59JC5wYXNzcG9ydC5hdXRoZW50aWNhdGUoYCR7VTF9JHtVfWAsKGIsVCx4KT0+e2lmKGIpe00oYik7cmV0dXJufWxldCBrPXg/P3t9O2lmKCFUKXtsZXQgbD1rLnJlYXNvbj09PSJ1bmtub3duUHJvdmlkZXIiPzQwNDpbInByb3ZpZGVyVW5hdmFpbGFibGUiLCJpbnN0YW5jZU5vdFJlYWR5Iiwic3RvcmVVbmF2YWlsYWJsZSJdLmluY2x1ZGVzKGsucmVhc29uPz8iIik/NTAzOjQwMztHLnN0YXR1cyhsKS50eXBlKCJodG1sIikuc2VuZChrMShrLnJlYXNvbj8/InVua25vd24iLFYoKSkpO3JldHVybn1LLmxvZ0luKFQsKGwpPT57aWYobCl7TShsKTtyZXR1cm59aWYoSy5zZXNzaW9uIT09dm9pZCAwKUsuc2Vzc2lvbi50eXBla3JvT2lkY0F1dGg9e3Byb3ZpZGVyOlUsYXQ6RGF0ZS5ub3coKX07Ry5yZWRpcmVjdCgzMDIsXyhNMShrLnJldHVyblRvKSkpfSl9KShLLEcsTSl9O3JldHVybiB3LmdldCgiL2xvZ2luL29pZGMvOnByb3ZpZGVyIixpMSksdy5nZXQoIi9sb2dpbi9vaWRjLzpwcm92aWRlci9jYWxsYmFjayIsaTEpLG4oKSx7cmVsb2FkOm4scHJvdmlkZXJJZHM6KCk9PlsuLi5ILmtleXMoKV19fXZhciBHNT0iVFlQRUtST19IRFhfT0lEQ19DT05GSUciLFY1PSJUWVBFS1JPX0hEWF9PSURDX1JFTE9BRF9TRUNPTkRTIixNNT0iVFlQRUtST19IRFhfT0lEQ19DUkVBVEVfVEVBTSIsUTA9IlRZUEVLUk9fSERYX09JRENfUEFTU1dPUkRfTE9HSU5fUEFUSCIsVTU9L1tcXC9dcGFja2FnZXNbXFwvXWFwaVtcXC9dYnVpbGRbXFwvXWluZGV4XC5qcyQvLGg9e2luZm86KCQsWCk9PmNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtsZXZlbDoiaW5mbyIscGx1Z2luOiJ0eXBla3JvLW9pZGMiLG1lc3NhZ2U6JCwuLi5YfSkpLHdhcm46KCQsWCk9PmNvbnNvbGUud2FybihKU09OLnN0cmluZ2lmeSh7bGV2ZWw6Indhcm4iLHBsdWdpbjoidHlwZWtyby1vaWRjIixtZXNzYWdlOiQsLi4uWH0pKSxlcnJvcjooJCxYKT0+Y29uc29sZS5lcnJvcihKU09OLnN0cmluZ2lmeSh7bGV2ZWw6ImVycm9yIixwbHVnaW46InR5cGVrcm8tb2lkYyIsbWVzc2FnZTokLC4uLlh9KSl9LEw1PTYwMDAwO2Z1bmN0aW9uIE41KCQsWCl7bGV0IFE7dHJ5e1E9ejAucmVhbHBhdGhTeW5jKGIxLmRpcm5hbWUoWCkpfWNhdGNoKEIpe2guZXJyb3IoIm5vdCBpbnN0YWxsZWQ7IGNvdWxkIG5vdCByZXNvbHZlIHRoZSBBUEkgYnVpbGQgZGlyZWN0b3J5Iix7ZXJyb3I6U3RyaW5nKEIpfSk7cmV0dXJufWxldCBaPWIxLmpvaW4oUSwicm91dGVycyIsImFwaSIsInJvb3QuanMiKSx6PUowLmRlZmF1bHQsVz16Ll9sb2FkLEo9ITEsSD1mdW5jdGlvbihZLEYsTCl7bGV0IFY9Vy5jYWxsKHRoaXMsWSxGLEwpO2lmKCFKJiZ6Ll9jYWNoZVtaXT8ubG9hZGVkPT09ITApe2lmKEo9ITAsei5fbG9hZD09PUgpei5fbG9hZD1XO3RyeXtsZXQgUD1wcm9jZXNzLmVudltNNV0hPT0iZmFsc2UiLE89UD92b2lkIDA6dDEocHJvY2Vzcy5lbnYpO2lmKCFQJiZPPT09dm9pZCAwKWgud2Fybigibm8gaW5pdGlhbC11c2VyIGJvb3RzdHJhcCBjcmVkZW50aWFsczsgd2l0aCBwYXNzd29yZExvZ2luOiBmYWxzZSwgZmlyc3QtcnVuIHJlZ2lzdHJhdGlvbiBpcyByZWZ1c2VkIik7ZWxzZSBpZihPIT09dm9pZCAwJiZQMShPLnBhc3N3b3JkRmlsZSk9PT12b2lkIDApaC53YXJuKCJpbml0aWFsLXVzZXIgYm9vdHN0cmFwIHBhc3N3b3JkIGZpbGUgaXMgYWJzZW50IG9yIGVtcHR5OyB3aXRoIHBhc3N3b3JkTG9naW46IGZhbHNlLCBmaXJzdC1ydW4gcmVnaXN0cmF0aW9uIGlzIHJlZnVzZWQgdW50aWwgaXQgYXBwZWFycyIse3Bhc3N3b3JkRmlsZTpPLnBhc3N3b3JkRmlsZX0pO2xldCB2PXByb2Nlc3MuZW52W1EwXSxfPXYhPT12b2lkIDAmJnUodik/djp2b2lkIDA7aWYodiE9PXZvaWQgMCYmXz09PXZvaWQgMCloLndhcm4oImlnbm9yaW5nIGEgcGFzc3dvcmQgbG9naW4gcGF0aCB0aGF0IGlzIG5vdCBhIHNhbWUtb3JpZ2luIHBhdGgiLHtlbnY6UTB9KTtsZXQgRT1YMCgkMChRKSwkLGgse2NyZWF0ZVRlYW06UCwuLi5PIT09dm9pZCAwJiZ7Ym9vdHN0cmFwOk99LC4uLl8hPT12b2lkIDAmJntwYXNzd29yZExvZ2luUGF0aDpffX0pLHk9TnVtYmVyKHByb2Nlc3MuZW52W1Y1XT8/IjE1Iik7c2V0SW50ZXJ2YWwoKCk9PkUucmVsb2FkKCksTWF0aC5tYXgoMSxOdW1iZXIuaXNGaW5pdGUoeSk/eToxNSkqMTAwMCkudW5yZWYoKSxoLmluZm8oImluc3RhbGxlZCIse3Byb3ZpZGVyczpFLnByb3ZpZGVySWRzKCl9KX1jYXRjaChQKXtoLmVycm9yKCJub3QgaW5zdGFsbGVkOyBIeXBlckRYIGNvbnRpbnVlcyB3aXRob3V0IE9JREMiLHtlcnJvcjpTdHJpbmcoUCl9KX19cmV0dXJuIFZ9O3ouX2xvYWQ9SCxzZXRUaW1lb3V0KCgpPT57aWYoIUopaC5lcnJvcigiSHlwZXJEWCBuZXZlciBsb2FkZWQgaXRzIHJvb3Qgcm91dGVyOyB0aGUgcGx1Z2luIHdhcyBub3QgaW5zdGFsbGVkIix7cm9vdFJvdXRlclBhdGg6Wn0pfSxMNSkudW5yZWYoKX12YXIgZDE9cHJvY2Vzcy5lbnZbRzVdLFowPXByb2Nlc3MuYXJndlsxXT8/IiI7aWYoZDEhPT12b2lkIDAmJmQxLmxlbmd0aD4wJiZVNS50ZXN0KFowKSlONShkMSxaMCk7Cg==';
|
|
7
|
+
export const HYPERDX_OIDC_PLUGIN_BASE64 = 'LyohIFR5cGVLcm8gSHlwZXJEWCBPSURDIHBsdWdpbiDigJQgaHR0cHM6Ly9naXRodWIuY29tL3llaHVkYWNvaGVuL3R5cGVrcm8gKEFwYWNoZS0yLjApCiAqIEJ1bmRsZXMgb2F1dGg0d2ViYXBpIChodHRwczovL2dpdGh1Yi5jb20vcGFudmEvb2F1dGg0d2ViYXBpKToKICogVGhlIE1JVCBMaWNlbnNlIChNSVQpCiAqIAogKiBDb3B5cmlnaHQgKGMpIDIwMjIgRmlsaXAgU2tva2FuCiAqIAogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICogCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbAogKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgogKiAKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiAqIFNPRlRXQVJFLgogKi8KdmFyIEQwPU9iamVjdC5jcmVhdGU7dmFye2dldFByb3RvdHlwZU9mOkcwLGRlZmluZVByb3BlcnR5Om4xLGdldE93blByb3BlcnR5TmFtZXM6VjB9PU9iamVjdDt2YXIgTTA9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBVMCgkKXtyZXR1cm4gdGhpc1skXX12YXIgTDAsTjAsYjA9KCQsWCxRKT0+e3ZhciBaPSQhPW51bGwmJnR5cGVvZiAkPT09Im9iamVjdCI7aWYoWil7dmFyIHo9WD9MMD8/PW5ldyBXZWFrTWFwOk4wPz89bmV3IFdlYWtNYXAsVz16LmdldCgkKTtpZihXKXJldHVybiBXfVE9JCE9bnVsbD9EMChHMCgkKSk6e307bGV0IEo9WHx8ISR8fCEkLl9fZXNNb2R1bGU/bjEoUSwiZGVmYXVsdCIse3ZhbHVlOiQsZW51bWVyYWJsZTohMH0pOlE7Zm9yKGxldCBIIG9mIFYwKCQpKWlmKCFNMC5jYWxsKEosSCkpbjEoSixILHtnZXQ6VTAuYmluZCgkLEgpLGVudW1lcmFibGU6ITB9KTtpZihaKXouc2V0KCQsSik7cmV0dXJuIEp9O3ZhciB6MD1yZXF1aXJlKCJub2RlOmZzIiksSjA9YjAocmVxdWlyZSgibm9kZTptb2R1bGUiKSksYjE9cmVxdWlyZSgibm9kZTpwYXRoIik7dmFyIGU9cmVxdWlyZSgibm9kZTpjcnlwdG8iKSxvMT1yZXF1aXJlKCJub2RlOmZzIiksUzA9IlRZUEVLUk9fSERYX09JRENfQk9PVFNUUkFQX0VNQUlMIixQMD0iVFlQRUtST19IRFhfT0lEQ19CT09UU1RSQVBfUEFTU1dPUkRfRklMRSI7ZnVuY3Rpb24gdDEoJCl7bGV0IFg9JFtTMF0/LnRyaW0oKT8/IiIsUT0kW1AwXT8udHJpbSgpPz8iIjtpZihYLmxlbmd0aD09PTB8fFEubGVuZ3RoPT09MClyZXR1cm47cmV0dXJue2VtYWlsOlgscGFzc3dvcmRGaWxlOlF9fWZ1bmN0aW9uIFAxKCQpe2xldCBYO3RyeXtYPW8xLnJlYWRGaWxlU3luYygkLCJ1dGY4Iil9Y2F0Y2h7cmV0dXJufXJldHVybiBYLmxlbmd0aD09PTA/dm9pZCAwOlh9ZnVuY3Rpb24gQzEoJCl7cmV0dXJuICQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cLyskLywiIil9ZnVuY3Rpb24gQzAoJCxYKXtsZXQgUT0oWik9PmUuY3JlYXRlSGFzaCgic2hhMjU2IikudXBkYXRlKFosInV0ZjgiKS5kaWdlc3QoKTtyZXR1cm4gZS50aW1pbmdTYWZlRXF1YWwoUSgkKSxRKFgpKX1mdW5jdGlvbiBUMCgkLFgsUT1QMSl7aWYodHlwZW9mICQhPT0ib2JqZWN0Inx8JD09PW51bGwpcmV0dXJuITE7bGV0e2VtYWlsOloscGFzc3dvcmQ6en09JDtpZih0eXBlb2YgWiE9PSJzdHJpbmcifHx0eXBlb2YgeiE9PSJzdHJpbmciKXJldHVybiExO2xldCBXPVEoWC5wYXNzd29yZEZpbGUpO2lmKFc9PT12b2lkIDApcmV0dXJuITE7bGV0IEo9QzAoeixXKTtyZXR1cm4gWi50b0xvd2VyQ2FzZSgpPT09WC5lbWFpbC50b0xvd2VyQ2FzZSgpJiZKfWFzeW5jIGZ1bmN0aW9uIHMxKCQsWCxRKXtsZXQgWj1YLmJvb3RzdHJhcDtpZihYLmNyZWF0ZVRlYW18fFo9PT12b2lkIDApcmV0dXJuITE7aWYoJC5tZXRob2QhPT0iUE9TVCJ8fEMxKCQucGF0aCkhPT0iL3JlZ2lzdGVyL3Bhc3N3b3JkIilyZXR1cm4hMTtpZihhd2FpdCBRLnRlYW1FeGlzdHMoKSlyZXR1cm4hMTtyZXR1cm4gVDAoJC5ib2R5LFosUS5yZWFkUGFzc3dvcmQpfXZhciB0JD1yZXF1aXJlKCJub2RlOmNyeXB0byIpLHMkPXJlcXVpcmUoIm5vZGU6ZnMiKSxyJD1yZXF1aXJlKCJub2RlOm1vZHVsZSIpLGUkPXJlcXVpcmUoIm5vZGU6cGF0aCIpO2Z1bmN0aW9uICQxKC4uLiQpe2ZvcihsZXQgWCBvZiAkKXtpZihYPT09dm9pZCAwfHxYLnRyaW0oKT09PSIiKWNvbnRpbnVlO2xldCBRO3RyeXtRPW5ldyBVUkwoWC50cmltKCkpfWNhdGNoe2NvbnRpbnVlfWlmKFEucHJvdG9jb2whPT0iaHR0cHM6IiYmUS5wcm90b2NvbCE9PSJodHRwOiIpY29udGludWU7aWYoUS51c2VybmFtZSE9PSIifHxRLnBhc3N3b3JkIT09IiJ8fFEuc2VhcmNoIT09IiJ8fFEuaGFzaCE9PSIiKWNvbnRpbnVlO3JldHVybmAke1Eub3JpZ2lufSR7US5wYXRobmFtZS5yZXBsYWNlKC9cLyskLywiIil9YH1yZXR1cm4iIn1mdW5jdGlvbiBfMCgkKXtmb3IobGV0IFg9MDtYPCQubGVuZ3RoO1grKyl7bGV0IFE9JC5jaGFyQ29kZUF0KFgpO2lmKFE8PTMyfHxRPT09MTI3KXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIHUoJCl7cmV0dXJuICQuc3RhcnRzV2l0aCgiLyIpJiYhJC5zdGFydHNXaXRoKCIvLyIpJiYhJC5pbmNsdWRlcygiXFwiKSYmIV8wKCQpfWZ1bmN0aW9uIFgxKCQsWCl7cmV0dXJuYCR7JH0ke3UoWCk/WDoiLyJ9YH1mdW5jdGlvbiBUMSgkLFgsUSl7bGV0IFo9UT09PSIvIj8iIjpgP3JldHVyblRvPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFEpfWA7cmV0dXJuYCR7JH0vJHtlbmNvZGVVUklDb21wb25lbnQoWCl9JHtafWB9Y2xhc3MgQyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCQpe3N1cGVyKCQpO3RoaXMubmFtZT0iT2lkY0NvbmZpZ0Vycm9yIn19dmFyIFIwPS9eW2EtejAtOV1bYS16MC05LV17MCw2Mn0kLyxxMD0vXihcZCspXHMqKG1zfHN8bXxofGQpJC8sSTA9e21zOjEsczoxMDAwLG06NjAwMDAsaDozNjAwMDAwLGQ6ODY0MDAwMDB9O2Z1bmN0aW9uIGYwKCQsWCl7aWYodHlwZW9mICQ9PT0ibnVtYmVyIiYmTnVtYmVyLmlzRmluaXRlKCQpJiYkPj0wKXJldHVybiAkKjEwMDA7aWYodHlwZW9mICQ9PT0ic3RyaW5nIil7bGV0IFE9cTAuZXhlYygkLnRyaW0oKSk7aWYoUSlyZXR1cm4gTnVtYmVyKFFbMV0pKkkwW1FbMl1dfXRocm93IG5ldyBDKGAke1h9IG11c3QgYmUgYSBkdXJhdGlvbiBsaWtlICIxMmgiLCAiMzBtIiBvciAiN2QiLCBvciBhIG51bWJlciBvZiBzZWNvbmRzIChnb3QgJHtKU09OLnN0cmluZ2lmeSgkKX0pYCl9ZnVuY3Rpb24gUTEoJCl7cmV0dXJuIHR5cGVvZiAkPT09Im9iamVjdCImJiQhPT1udWxsJiYhQXJyYXkuaXNBcnJheSgkKX1mdW5jdGlvbiBkKCQsWCxRKXtsZXQgWj0kW1hdO2lmKHR5cGVvZiBaIT09InN0cmluZyJ8fFoudHJpbSgpLmxlbmd0aD09PTApdGhyb3cgbmV3IEMoYCR7UX0uJHtYfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZ2ApO3JldHVybiBafWZ1bmN0aW9uIHQoJCxYLFEsWil7bGV0IHo9JFtYXTtpZih6PT09dm9pZCAwKXJldHVybiBaO2lmKHR5cGVvZiB6IT09InN0cmluZyJ8fHoudHJpbSgpLmxlbmd0aD09PTApdGhyb3cgbmV3IEMoYCR7UX0uJHtYfSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHNldGApO3JldHVybiB6fWZ1bmN0aW9uIHMoJCxYLFEsWil7bGV0IHo9JFtYXTtpZih6PT09dm9pZCAwKXJldHVybiBaO2lmKHR5cGVvZiB6IT09ImJvb2xlYW4iKXRocm93IG5ldyBDKGAke1F9LiR7WH0gbXVzdCBiZSBhIGJvb2xlYW5gKTtyZXR1cm4gen1mdW5jdGlvbiBfMSgkLFgpe2lmKCQ9PT12b2lkIDApcmV0dXJuW107aWYoIUFycmF5LmlzQXJyYXkoJCl8fCQuc29tZSgoUSk9PnR5cGVvZiBRIT09InN0cmluZyJ8fFEubGVuZ3RoPT09MCkpdGhyb3cgbmV3IEMoYCR7WH0gbXVzdCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgc3RyaW5nc2ApO3JldHVybiAkfWZ1bmN0aW9uIFoxKCQsWCxRKXtsZXQgWj1PYmplY3Qua2V5cygkKS5maWx0ZXIoKHopPT4hWC5pbmNsdWRlcyh6KSk7aWYoWi5sZW5ndGg+MCl0aHJvdyBuZXcgQyhgJHtRfSBoYXMgdW5rbm93biBrZXkocykgJHtaLm1hcCgoeik9PkpTT04uc3RyaW5naWZ5KHopKS5qb2luKCIsICIpfTsgYWxsb3dlZDogJHtYLmpvaW4oIiwgIil9YCl9ZnVuY3Rpb24gcjEoJCxYLFEpe2xldCBaO3RyeXtaPW5ldyBVUkwoJCl9Y2F0Y2h7dGhyb3cgbmV3IEMoYCR7WH0gbXVzdCBiZSBhbiBhYnNvbHV0ZSBVUkwgKGdvdCAke0pTT04uc3RyaW5naWZ5KCQpfSlgKX1pZihaLnByb3RvY29sIT09Imh0dHBzOiImJiEoUSYmWi5wcm90b2NvbD09PSJodHRwOiIpKXRocm93IG5ldyBDKGAke1h9IG11c3QgdXNlIGh0dHBzIChnb3QgJHtKU09OLnN0cmluZ2lmeSgkKX0pYCk7cmV0dXJuICQucmVwbGFjZSgvXC8rJC8sIiIpfXZhciBPMD1bImlkIiwiZGlzcGxheU5hbWUiLCJpc3N1ZXIiLCJjbGllbnRJZCIsImNsaWVudFNlY3JldCIsInRva2VuRW5kcG9pbnRBdXRoTWV0aG9kIiwic2NvcGVzIiwiY2xhaW1zIiwiYWxsb3ciLCJyZXF1aXJlVmVyaWZpZWRFbWFpbCIsImxpbmtFeGlzdGluZ1VzZXJzQnlFbWFpbCIsImNyZWF0ZVVzZXJzIl07ZnVuY3Rpb24gQTAoJCxYLFEpe2xldCBaPWBwcm92aWRlcnNbJHtYfV1gO2lmKCFRMSgkKSl0aHJvdyBuZXcgQyhgJHtafSBtdXN0IGJlIGFuIG9iamVjdGApO1oxKCQsTzAsWik7bGV0IHo9ZCgkLCJpZCIsWik7aWYoIVIwLnRlc3QoeikpdGhyb3cgbmV3IEMoYCR7Wn0uaWQgbXVzdCBiZSBsb3dlcmNhc2UgbGV0dGVycywgZGlnaXRzIGFuZCBkYXNoZXMsIHN0YXJ0aW5nIHdpdGggYSBsZXR0ZXIgb3IgZGlnaXQgKGdvdCAke0pTT04uc3RyaW5naWZ5KHopfSlgKTtsZXQgVz0kLnRva2VuRW5kcG9pbnRBdXRoTWV0aG9kPz8iY2xpZW50X3NlY3JldF9iYXNpYyI7aWYoVyE9PSJjbGllbnRfc2VjcmV0X2Jhc2ljIiYmVyE9PSJjbGllbnRfc2VjcmV0X3Bvc3QiKXRocm93IG5ldyBDKGAke1p9LnRva2VuRW5kcG9pbnRBdXRoTWV0aG9kIG11c3QgYmUgImNsaWVudF9zZWNyZXRfYmFzaWMiIG9yICJjbGllbnRfc2VjcmV0X3Bvc3QiYCk7bGV0IEo9JC5zY29wZXM9PT12b2lkIDA/WyJvcGVuaWQiLCJlbWFpbCIsInByb2ZpbGUiXTpfMSgkLnNjb3BlcyxgJHtafS5zY29wZXNgKTtpZighSi5pbmNsdWRlcygib3BlbmlkIikpdGhyb3cgbmV3IEMoYCR7Wn0uc2NvcGVzIG11c3QgaW5jbHVkZSAib3BlbmlkImApO2xldCBIPSQuY2xhaW1zPz97fTtpZighUTEoSCkpdGhyb3cgbmV3IEMoYCR7Wn0uY2xhaW1zIG11c3QgYmUgYW4gb2JqZWN0YCk7WjEoSCxbImVtYWlsIiwiZ3JvdXBzIiwibmFtZSJdLGAke1p9LmNsYWltc2ApO2xldCBCPXtlbWFpbDp0KEgsImVtYWlsIixgJHtafS5jbGFpbXNgLCJlbWFpbCIpLGdyb3Vwczp0KEgsImdyb3VwcyIsYCR7Wn0uY2xhaW1zYCwiZ3JvdXBzIiksbmFtZTp0KEgsIm5hbWUiLGAke1p9LmNsYWltc2AsIm5hbWUiKX07aWYoIVExKCQuYWxsb3cpKXRocm93IG5ldyBDKGAke1p9LmFsbG93IGlzIHJlcXVpcmVkOiBzZXQgYWxsb3cuZ3JvdXBzIGFuZC9vciBhbGxvdy5lbWFpbERvbWFpbnMuIFdpdGhvdXQgYSBydWxlLCBldmVyeSBhY2NvdW50IHRoZSBwcm92aWRlciBjYW4gYXV0aGVudGljYXRlIHdvdWxkIGdldCBpbnRvIEh5cGVyRFguYCk7WjEoJC5hbGxvdyxbImdyb3VwcyIsImVtYWlsRG9tYWlucyJdLGAke1p9LmFsbG93YCk7bGV0IFk9e2dyb3VwczpfMSgkLmFsbG93Lmdyb3VwcyxgJHtafS5hbGxvdy5ncm91cHNgKSxlbWFpbERvbWFpbnM6XzEoJC5hbGxvdy5lbWFpbERvbWFpbnMsYCR7Wn0uYWxsb3cuZW1haWxEb21haW5zYCkubWFwKChWKT0+Vi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15ALywiIikpfTtpZihZLmdyb3Vwcy5sZW5ndGg9PT0wJiZZLmVtYWlsRG9tYWlucy5sZW5ndGg9PT0wKXRocm93IG5ldyBDKGAke1p9LmFsbG93IG11c3Qgc2V0IGF0IGxlYXN0IG9uZSBvZiBncm91cHMgb3IgZW1haWxEb21haW5zOyBhbiBlbXB0eSBydWxlIHdvdWxkIGFkbWl0IGV2ZXJ5IGFjY291bnQgdGhlIHByb3ZpZGVyIGNhbiBhdXRoZW50aWNhdGUuYCk7bGV0IEY9cygkLCJyZXF1aXJlVmVyaWZpZWRFbWFpbCIsWiwhMCksTD1zKCQsImxpbmtFeGlzdGluZ1VzZXJzQnlFbWFpbCIsWixGKTtpZihMJiYhRil0aHJvdyBuZXcgQyhgJHtafS5saW5rRXhpc3RpbmdVc2Vyc0J5RW1haWwgY2Fubm90IGJlIHRydWUgd2hlbiByZXF1aXJlVmVyaWZpZWRFbWFpbCBpcyBmYWxzZTogYW4gdW52ZXJpZmllZCBlbWFpbCBpcyBvbmx5IGEgY2xhaW0sIHNvIGxpbmtpbmcgYnkgaXQgd291bGQgbGV0IGFueW9uZSB3aG8gY2FuIHNldCB0aGVpciBlbWFpbCBhdCB0aGUgcHJvdmlkZXIgdGFrZSBvdmVyIHRoZSBIeXBlckRYIGFjY291bnQgdGhhdCBoYXMgaXQuYCk7cmV0dXJue2lkOnosZGlzcGxheU5hbWU6dCgkLCJkaXNwbGF5TmFtZSIsWix6KSxpc3N1ZXI6cjEoZCgkLCJpc3N1ZXIiLFopLGAke1p9Lmlzc3VlcmAsUSksY2xpZW50SWQ6ZCgkLCJjbGllbnRJZCIsWiksY2xpZW50U2VjcmV0OmQoJCwiY2xpZW50U2VjcmV0IixaKSx0b2tlbkVuZHBvaW50QXV0aE1ldGhvZDpXLHNjb3BlczpKLGNsYWltczpCLGFsbG93OlkscmVxdWlyZVZlcmlmaWVkRW1haWw6RixsaW5rRXhpc3RpbmdVc2Vyc0J5RW1haWw6TCxjcmVhdGVVc2VyczpzKCQsImNyZWF0ZVVzZXJzIixaLCEwKX19ZnVuY3Rpb24geDAoJCxYKXtsZXQgUT1kKCQsInJlZGlyZWN0QmFzZVVybCIsImNvbmZpZ3VyYXRpb24iKTtyMShRLCJjb25maWd1cmF0aW9uLnJlZGlyZWN0QmFzZVVybCIsWCk7bGV0IFo9bmV3IFVSTChRKTtpZihaLnVzZXJuYW1lIT09IiJ8fFoucGFzc3dvcmQhPT0iInx8US5pbmNsdWRlcygiPyIpfHxRLmluY2x1ZGVzKCIjIikpdGhyb3cgbmV3IEMoImNvbmZpZ3VyYXRpb24ucmVkaXJlY3RCYXNlVXJsIG11c3Qgbm90IGNvbnRhaW4gY3JlZGVudGlhbHMsIGEgcXVlcnkgb3IgYSBmcmFnbWVudCIpO3JldHVybmAke1oub3JpZ2lufSR7Wi5wYXRobmFtZS5yZXBsYWNlKC9cLyskLywiIil9YH12YXIgdjA9WyJwcm92aWRlcnMiLCJwYXNzd29yZExvZ2luIiwicGFzc3dvcmRMb2dpblBhdGgiLCJtYXhTZXNzaW9uQWdlIiwicmVkaXJlY3RCYXNlVXJsIiwiYXBpUGF0aFByZWZpeCIsInRlYW1JZCIsImFsbG93SW5zZWN1cmVIdHRwIl0sRTA9Ii9sb2dpbiI7ZnVuY3Rpb24gUjEoJCxYKXtpZigkPy5wYXNzd29yZExvZ2luPT09ITEpcmV0dXJuO3JldHVybiAkPy5wYXNzd29yZExvZ2luUGF0aD8/WD8/RTB9ZnVuY3Rpb24gcTEoJCl7bGV0IFg7dHJ5e1g9SlNPTi5wYXJzZSgkKX1jYXRjaChZKXtsZXQgRj0vcG9zaXRpb24gKFxkKykvLmV4ZWMoWS5tZXNzYWdlKT8uWzFdO3Rocm93IG5ldyBDKGBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZCBKU09OJHtGPT09dm9pZCAwPyIiOmAgKG5lYXIgY2hhcmFjdGVyICR7Rn0pYH1gKX1pZighUTEoWCkpdGhyb3cgbmV3IEMoImNvbmZpZ3VyYXRpb24gbXVzdCBiZSBhIEpTT04gb2JqZWN0Iik7WjEoWCx2MCwiY29uZmlndXJhdGlvbiIpO2xldCBRPXMoWCwiYWxsb3dJbnNlY3VyZUh0dHAiLCJjb25maWd1cmF0aW9uIiwhMSk7aWYoIUFycmF5LmlzQXJyYXkoWC5wcm92aWRlcnMpKXRocm93IG5ldyBDKCJjb25maWd1cmF0aW9uLnByb3ZpZGVycyBtdXN0IGJlIGFuIGFycmF5Iik7bGV0IFo9WC5wcm92aWRlcnMubWFwKChZLEYpPT5BMChZLEYsUSkpLHo9bmV3IFNldDtmb3IobGV0IFkgb2YgWil7aWYoei5oYXMoWS5pZCkpdGhyb3cgbmV3IEMoYHByb3ZpZGVyIGlkICR7SlNPTi5zdHJpbmdpZnkoWS5pZCl9IGlzIHVzZWQgdHdpY2VgKTt6LmFkZChZLmlkKX1sZXQgVz10KFgsImFwaVBhdGhQcmVmaXgiLCJjb25maWd1cmF0aW9uIiwiL2FwaSIpO2lmKCFXLnN0YXJ0c1dpdGgoIi8iKSl0aHJvdyBuZXcgQygnY29uZmlndXJhdGlvbi5hcGlQYXRoUHJlZml4IG11c3Qgc3RhcnQgd2l0aCAiLyInKTtsZXQgSj1YLnRlYW1JZD09PXZvaWQgMD92b2lkIDA6ZChYLCJ0ZWFtSWQiLCJjb25maWd1cmF0aW9uIik7aWYoSiE9PXZvaWQgMCYmIS9eWzAtOWEtZl17MjR9JC8udGVzdChKKSl0aHJvdyBuZXcgQygiY29uZmlndXJhdGlvbi50ZWFtSWQgbXVzdCBiZSBhIEh5cGVyRFggdGVhbSBpZCAoMjQgaGV4YWRlY2ltYWwgY2hhcmFjdGVycykiKTtsZXQgSD1YLnJlZGlyZWN0QmFzZVVybD09PXZvaWQgMD92b2lkIDA6eDAoWCxRKSxCPVgucGFzc3dvcmRMb2dpblBhdGg9PT12b2lkIDA/dm9pZCAwOmQoWCwicGFzc3dvcmRMb2dpblBhdGgiLCJjb25maWd1cmF0aW9uIik7aWYoQiE9PXZvaWQgMCYmIXUoQikpdGhyb3cgbmV3IEMoYGNvbmZpZ3VyYXRpb24ucGFzc3dvcmRMb2dpblBhdGggbXVzdCBiZSBhIHBhdGggb24gSHlwZXJEWCdzIG93biBvcmlnaW4sIHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgIi8iIChubyAiLy8iLCBiYWNrc2xhc2gsIHdoaXRlc3BhY2Ugb3IgY29udHJvbCBjaGFyYWN0ZXIpYCk7cmV0dXJue3Byb3ZpZGVyczpaLHBhc3N3b3JkTG9naW46cyhYLCJwYXNzd29yZExvZ2luIiwiY29uZmlndXJhdGlvbiIsITApLC4uLkIhPT12b2lkIDAmJntwYXNzd29yZExvZ2luUGF0aDpCfSxtYXhTZXNzaW9uQWdlTXM6WC5tYXhTZXNzaW9uQWdlPT09dm9pZCAwPzQzMjAwMDAwOmYwKFgubWF4U2Vzc2lvbkFnZSwiY29uZmlndXJhdGlvbi5tYXhTZXNzaW9uQWdlIiksYXBpUGF0aFByZWZpeDpXLnJlcGxhY2UoL1wvKyQvLCIiKSwuLi5IIT09dm9pZCAwJiZ7cmVkaXJlY3RCYXNlVXJsOkh9LC4uLkohPT12b2lkIDAmJnt0ZWFtSWQ6Sn0sYWxsb3dJbnNlY3VyZUh0dHA6UX19ZnVuY3Rpb24gajAoJCl7aWYoQXJyYXkuaXNBcnJheSgkKSlyZXR1cm4gJC5maWx0ZXIoKFgpPT50eXBlb2YgWD09PSJzdHJpbmciKTtpZih0eXBlb2YgJD09PSJzdHJpbmciJiYkLmxlbmd0aD4wKXJldHVyblskXTtyZXR1cm5bXX1mdW5jdGlvbiB5MCgkKXtyZXR1cm4gJD09PSEwfHwkPT09InRydWUifWZ1bmN0aW9uICQkKCQsWCl7bGV0IFE9WC5zdWI7aWYodHlwZW9mIFEhPT0ic3RyaW5nInx8US5sZW5ndGg9PT0wKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoic3ViamVjdE1pc3NpbmcifTtsZXQgWj1YWyQuY2xhaW1zLmVtYWlsXTtpZih0eXBlb2YgWiE9PSJzdHJpbmcifHxaLnRyaW0oKS5sZW5ndGg9PT0wKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoiZW1haWxNaXNzaW5nIn07aWYoIS9eW1x4MjEtXHg3ZV0rJC8udGVzdChaLnRyaW0oKSkpcmV0dXJue2FsbG93ZWQ6ITEscmVhc29uOiJlbWFpbEludmFsaWQifTtsZXQgej1aLnRyaW0oKS50b0xvd2VyQ2FzZSgpLFc9ei5sYXN0SW5kZXhPZigiQCIpO2lmKFc8PTB8fFc9PT16Lmxlbmd0aC0xKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoiZW1haWxNaXNzaW5nIn07aWYoJC5yZXF1aXJlVmVyaWZpZWRFbWFpbCYmIXkwKFguZW1haWxfdmVyaWZpZWQpKXJldHVybnthbGxvd2VkOiExLHJlYXNvbjoiZW1haWxOb3RWZXJpZmllZCJ9O2xldCBKPWowKFhbJC5jbGFpbXMuZ3JvdXBzXSk7aWYoJC5hbGxvdy5ncm91cHMubGVuZ3RoPjAmJiFKLnNvbWUoKFkpPT4kLmFsbG93Lmdyb3Vwcy5pbmNsdWRlcyhZKSkpcmV0dXJue2FsbG93ZWQ6ITEscmVhc29uOiJncm91cE5vdEFsbG93ZWQifTtsZXQgSD16LnNsaWNlKFcrMSk7aWYoJC5hbGxvdy5lbWFpbERvbWFpbnMubGVuZ3RoPjAmJiEkLmFsbG93LmVtYWlsRG9tYWlucy5pbmNsdWRlcyhIKSlyZXR1cm57YWxsb3dlZDohMSxyZWFzb246ImVtYWlsRG9tYWluTm90QWxsb3dlZCJ9O2xldCBCPVhbJC5jbGFpbXMubmFtZV07cmV0dXJue2FsbG93ZWQ6ITAsaWRlbnRpdHk6e3Byb3ZpZGVyOiQuaWQsc3ViamVjdDpRLGVtYWlsOnosbmFtZTp0eXBlb2YgQj09PSJzdHJpbmciJiZCLnRyaW0oKS5sZW5ndGg+MD9CLnRyaW0oKTp6LGdyb3VwczpKfX19Y2xhc3MgcCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCl7c3VwZXIoInRoZSBhY2NvdW50IGlzIGFscmVhZHkgbGlua2VkIHRvIGFub3RoZXIgc2lnbi1pbiIpO3RoaXMubmFtZT0iTGlua0NvbmZsaWN0RXJyb3IifX1hc3luYyBmdW5jdGlvbiBYJCgkLFgsUSl7dHJ5e3JldHVybiBhd2FpdCBlMSgkLFgsUSl9Y2F0Y2goWil7aWYoIShaIGluc3RhbmNlb2YgcCkpdGhyb3cgWjt0cnl7cmV0dXJuIGF3YWl0IGUxKCQsWCxRKX1jYXRjaCh6KXtpZih6IGluc3RhbmNlb2YgcClyZXR1cm57ZGVuaWVkOiJlbWFpbEluVXNlIn07dGhyb3cgen19fWFzeW5jIGZ1bmN0aW9uIGUxKCQsWCxRKXtsZXQgWj1hd2FpdCAkLmZpbmRMaW5rZWRVc2VySWQoUS5wcm92aWRlcixRLnN1YmplY3QpO2lmKFohPT1udWxsKXtpZihhd2FpdCAkLnVzZXJFeGlzdHMoWikpcmV0dXJuIGF3YWl0ICQudG91Y2goUS5wcm92aWRlcixRLnN1YmplY3QpLHt1c2VySWQ6WixvdXRjb21lOiJsaW5rZWQifTthd2FpdCAkLnVubGluayhRLnByb3ZpZGVyLFEuc3ViamVjdCl9bGV0IHo9YXdhaXQgJC5maW5kVXNlcklkQnlFbWFpbChRLmVtYWlsKTtpZih6IT09bnVsbCl7aWYoWC5saW5rRXhpc3RpbmdVc2Vyc0J5RW1haWwmJiFhd2FpdCAkLnVzZXJIYXNBbnlMaW5rKHopKXJldHVybiBhd2FpdCAkLmxpbmsoUSx6KSx7dXNlcklkOnosb3V0Y29tZToibGlua2VkQnlFbWFpbCJ9O3JldHVybntkZW5pZWQ6ImVtYWlsSW5Vc2UifX1pZighWC5jcmVhdGVVc2VycylyZXR1cm57ZGVuaWVkOiJub0FjY291bnQifTtsZXQgVz1hd2FpdCAkLmNyZWF0ZVVzZXIoUS5lbWFpbCxRLm5hbWUpO3JldHVybiBhd2FpdCAkLmxpbmsoUSxXKSx7dXNlcklkOlcsb3V0Y29tZToiY3JlYXRlZCJ9fXZhciBJMTtpZih0eXBlb2YgbmF2aWdhdG9yPiJ1Inx8IW5hdmlnYXRvci51c2VyQWdlbnQ/LnN0YXJ0c1dpdGg/LigiTW96aWxsYS81LjAgIikpSTE9Im9hdXRoNHdlYmFwaS92My44LjgiO2Z1bmN0aW9uIEIxKCQsWCl7aWYoJD09bnVsbClyZXR1cm4hMTt0cnl7cmV0dXJuICQgaW5zdGFuY2VvZiBYfHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoJClbU3ltYm9sLnRvU3RyaW5nVGFnXT09PVgucHJvdG90eXBlW1N5bWJvbC50b1N0cmluZ1RhZ119Y2F0Y2h7cmV0dXJuITF9fXZhciBxPSJFUlJfSU5WQUxJRF9BUkdfVkFMVUUiLEE9IkVSUl9JTlZBTElEX0FSR19UWVBFIjtmdW5jdGlvbiBTKCQsWCxRKXtsZXQgWj1UeXBlRXJyb3IoJCx7Y2F1c2U6UX0pO3JldHVybiBPYmplY3QuYXNzaWduKFose2NvZGU6WH0pLFp9dmFyIEsxPVN5bWJvbCgpLHcwPVN5bWJvbCgpLGcwPVN5bWJvbCgpLFkkPVN5bWJvbCgpLGgwPVN5bWJvbCgpLFEkPVN5bWJvbCgpLFI1PVN5bWJvbCgpLGswPW5ldyBUZXh0RW5jb2RlcixtMD1uZXcgVGV4dERlY29kZXI7ZnVuY3Rpb24gZygkKXtpZih0eXBlb2YgJD09PSJzdHJpbmciKXJldHVybiBrMC5lbmNvZGUoJCk7cmV0dXJuIG0wLmRlY29kZSgkKX12YXIgZjE7aWYoVWludDhBcnJheS5wcm90b3R5cGUudG9CYXNlNjQpZjE9KCQpPT57aWYoJCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSQ9bmV3IFVpbnQ4QXJyYXkoJCk7cmV0dXJuICQudG9CYXNlNjQoe2FscGhhYmV0OiJiYXNlNjR1cmwiLG9taXRQYWRkaW5nOiEwfSl9O2Vsc2UgZjE9KFgpPT57aWYoWCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKVg9bmV3IFVpbnQ4QXJyYXkoWCk7bGV0IFE9W107Zm9yKGxldCBaPTA7WjxYLmJ5dGVMZW5ndGg7Wis9MzI3NjgpUS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxYLnN1YmFycmF5KFosWiszMjc2OCkpKTtyZXR1cm4gYnRvYShRLmpvaW4oIiIpKS5yZXBsYWNlKC89L2csIiIpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIil9O3ZhciBPMTtpZihVaW50OEFycmF5LmZyb21CYXNlNjQpTzE9KCQpPT57dHJ5e3JldHVybiBVaW50OEFycmF5LmZyb21CYXNlNjQoJCx7YWxwaGFiZXQ6ImJhc2U2NHVybCJ9KX1jYXRjaChYKXt0aHJvdyBTKCJUaGUgaW5wdXQgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIixxLFgpfX07ZWxzZSBPMT0oJCk9Pnt0cnl7bGV0IFg9YXRvYigkLnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpLnJlcGxhY2UoL1xzL2csIiIpKSxRPW5ldyBVaW50OEFycmF5KFgubGVuZ3RoKTtmb3IobGV0IFo9MDtaPFgubGVuZ3RoO1orKylRW1pdPVguY2hhckNvZGVBdChaKTtyZXR1cm4gUX1jYXRjaChYKXt0aHJvdyBTKCJUaGUgaW5wdXQgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIixxLFgpfX07ZnVuY3Rpb24gaigkKXtpZih0eXBlb2YgJD09PSJzdHJpbmciKXJldHVybiBPMSgkKTtyZXR1cm4gZjEoJCl9Y2xhc3MgZiBleHRlbmRzIEVycm9ye2NvZGU7Y29uc3RydWN0b3IoJCxYKXtzdXBlcigkLFgpO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPXk4LEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPy4odGhpcyx0aGlzLmNvbnN0cnVjdG9yKX19Y2xhc3MgSCQgZXh0ZW5kcyBFcnJvcntjb2RlO2NvbnN0cnVjdG9yKCQsWCl7c3VwZXIoJCxYKTtpZih0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFg/LmNvZGUpdGhpcy5jb2RlPVg/LmNvZGU7RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/Lih0aGlzLHRoaXMuY29uc3RydWN0b3IpfX1mdW5jdGlvbiBEKCQsWCxRKXtyZXR1cm4gbmV3IEgkKCQse2NvZGU6WCxjYXVzZTpRfSl9YXN5bmMgZnVuY3Rpb24gdTAoJCl7bGV0IFg7c3dpdGNoKCQua3R5KXtjYXNlIkVDIjpYPXtjcnY6JC5jcnYsa3R5OiQua3R5LHg6JC54LHk6JC55fTticmVhaztjYXNlIk9LUCI6WD17Y3J2OiQuY3J2LGt0eTokLmt0eSx4OiQueH07YnJlYWs7Y2FzZSJBS1AiOlg9e2FsZzokLmFsZyxrdHk6JC5rdHkscHViOiQucHVifTticmVhaztjYXNlIlJTQSI6WD17ZTokLmUsa3R5OiQua3R5LG46JC5ufTticmVhaztkZWZhdWx0OnRocm93IG5ldyBmKCJ1bnN1cHBvcnRlZCBKV0sga2V5IHR5cGUiLHtjYXVzZTokfSl9cmV0dXJuIGooYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoIlNIQS0yNTYiLGcoSlNPTi5zdHJpbmdpZnkoWCkpKSl9ZnVuY3Rpb24gQiQoJCxYKXtpZighKCQgaW5zdGFuY2VvZiBDcnlwdG9LZXkpKXRocm93IFMoYCR7WH0gbXVzdCBiZSBhIENyeXB0b0tleWAsQSl9ZnVuY3Rpb24gZDAoJCxYKXtpZihCJCgkLFgpLCQudHlwZSE9PSJwcml2YXRlIil0aHJvdyBTKGAke1h9IG11c3QgYmUgYSBwcml2YXRlIENyeXB0b0tleWAscSl9ZnVuY3Rpb24gYzAoJCxYKXtpZihCJCgkLFgpLCQudHlwZSE9PSJwdWJsaWMiKXRocm93IFMoYCR7WH0gbXVzdCBiZSBhIHB1YmxpYyBDcnlwdG9LZXlgLHEpfWZ1bmN0aW9uIHoxKCQpe2lmKCQ9PT1udWxsfHx0eXBlb2YgJCE9PSJvYmplY3QifHxBcnJheS5pc0FycmF5KCQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIEskKCQpe2lmKEIxKCQsSGVhZGVycykpJD1PYmplY3QuZnJvbUVudHJpZXMoJC5lbnRyaWVzKCkpO2xldCBYPW5ldyBIZWFkZXJzKCQ/P3t9KTtpZihJMSYmIVguaGFzKCJ1c2VyLWFnZW50IikpWC5zZXQoInVzZXItYWdlbnQiLEkxKTtpZihYLmhhcygiYXV0aG9yaXphdGlvbiIpKXRocm93IFMoJyJvcHRpb25zLmhlYWRlcnMiIG11c3Qgbm90IGluY2x1ZGUgdGhlICJhdXRob3JpemF0aW9uIiBoZWFkZXIgbmFtZScscSk7cmV0dXJuIFh9ZnVuY3Rpb24gRiQoJCxYKXtpZihYIT09dm9pZCAwKXtpZih0eXBlb2YgWD09PSJmdW5jdGlvbiIpWD1YKCQuaHJlZik7aWYoIShYIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpKXRocm93IFMoJyJvcHRpb25zLnNpZ25hbCIgbXVzdCByZXR1cm4gb3IgYmUgYW4gaW5zdGFuY2Ugb2YgQWJvcnRTaWduYWwnLEEpO3JldHVybiBYfXJldHVybn1mdW5jdGlvbiBEJCgkKXtpZigkLmluY2x1ZGVzKCIvLyIpKXJldHVybiAkLnJlcGxhY2UoIi8vIiwiLyIpO3JldHVybiAkfWZ1bmN0aW9uIGwwKCQsWCxRPSExKXtpZigkLnBhdGhuYW1lPT09Ii8iKSQucGF0aG5hbWU9WDtlbHNlICQucGF0aG5hbWU9RCQoYCR7WH0vJHtRPyQucGF0aG5hbWU6JC5wYXRobmFtZS5yZXBsYWNlKC8oXC8pJC8sIiIpfWApO3JldHVybiAkfWZ1bmN0aW9uIHAwKCQsWCl7cmV0dXJuICQucGF0aG5hbWU9RCQoYCR7JC5wYXRobmFtZX0vJHtYfWApLCR9YXN5bmMgZnVuY3Rpb24gaTAoJCxYLFEsWil7aWYoISgkIGluc3RhbmNlb2YgVVJMKSl0aHJvdyBTKGAiJHtYfSIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBVUkxgLEEpO1QkKCQsWj8uW0sxXSE9PSEwKTtsZXQgej1RKG5ldyBVUkwoJC5ocmVmKSksVz1LJChaPy5oZWFkZXJzKTtyZXR1cm4gVy5zZXQoImFjY2VwdCIsImFwcGxpY2F0aW9uL2pzb24iKSwoWj8uW1kkXXx8ZmV0Y2gpKHouaHJlZix7Ym9keTp2b2lkIDAsaGVhZGVyczpPYmplY3QuZnJvbUVudHJpZXMoVy5lbnRyaWVzKCkpLG1ldGhvZDoiR0VUIixyZWRpcmVjdDoibWFudWFsIixzaWduYWw6RiQoeixaPy5zaWduYWwpfSl9YXN5bmMgZnVuY3Rpb24gRyQoJCxYKXtyZXR1cm4gaTAoJCwiaXNzdWVySWRlbnRpZmllciIsKFEpPT57c3dpdGNoKFg/LmFsZ29yaXRobSl7Y2FzZSB2b2lkIDA6Y2FzZSJvaWRjIjpwMChRLCIud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbiIpO2JyZWFrO2Nhc2Uib2F1dGgyIjpsMChRLCIud2VsbC1rbm93bi9vYXV0aC1hdXRob3JpemF0aW9uLXNlcnZlciIpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgUygnIm9wdGlvbnMuYWxnb3JpdGhtIiBtdXN0IGJlICJvaWRjIiAoZGVmYXVsdCksIG9yICJvYXV0aDIiJyxxKX1yZXR1cm4gUX0sWCl9ZnVuY3Rpb24gSjEoJCxYLFEsWix6KXt0cnl7aWYodHlwZW9mICQhPT0ibnVtYmVyInx8IU51bWJlci5pc0Zpbml0ZSgkKSl0aHJvdyBTKGAke1F9IG11c3QgYmUgYSBudW1iZXJgLEEseik7aWYoJD4wKXJldHVybjtpZihYKXtpZigkIT09MCl0aHJvdyBTKGAke1F9IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyYCxxLHopO3JldHVybn10aHJvdyBTKGAke1F9IG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJgLHEseil9Y2F0Y2goVyl7aWYoWil0aHJvdyBEKFcubWVzc2FnZSxaLHopO3Rocm93IFd9fWZ1bmN0aW9uIFIoJCxYLFEsWil7dHJ5e2lmKHR5cGVvZiAkIT09InN0cmluZyIpdGhyb3cgUyhgJHtYfSBtdXN0IGJlIGEgc3RyaW5nYCxBLFopO2lmKCQubGVuZ3RoPT09MCl0aHJvdyBTKGAke1h9IG11c3Qgbm90IGJlIGVtcHR5YCxxLFopfWNhdGNoKHope2lmKFEpdGhyb3cgRCh6Lm1lc3NhZ2UsUSxaKTt0aHJvdyB6fX1hc3luYyBmdW5jdGlvbiBWJCgkLFgpe2xldCBRPSQ7aWYoIShRIGluc3RhbmNlb2YgVVJMKSYmUSE9PVckKXRocm93IFMoJyJleHBlY3RlZElzc3VlcklkZW50aWZpZXIiIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVVJMJyxBKTtpZighQjEoWCxSZXNwb25zZSkpdGhyb3cgUygnInJlc3BvbnNlIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlJyxBKTtpZihYLnN0YXR1cyE9PTIwMCl0aHJvdyBEKCcicmVzcG9uc2UiIGlzIG5vdCBhIGNvbmZvcm0gQXV0aG9yaXphdGlvbiBTZXJ2ZXIgTWV0YWRhdGEgcmVzcG9uc2UgKHVuZXhwZWN0ZWQgSFRUUCBzdGF0dXMgY29kZSknLHkkLFgpO2cxKFgpO2xldCBaPWF3YWl0IGckKFgpO2lmKFIoWi5pc3N1ZXIsJyJyZXNwb25zZSIgYm9keSAiaXNzdWVyIiBwcm9wZXJ0eScsTix7Ym9keTpafSksUSE9PVckJiZuZXcgVVJMKFouaXNzdWVyKS5ocmVmIT09US5ocmVmKXRocm93IEQoJyJyZXNwb25zZSIgYm9keSAiaXNzdWVyIiBwcm9wZXJ0eSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWUnLG04LHtleHBlY3RlZDpRLmhyZWYsYm9keTpaLGF0dHJpYnV0ZToiaXNzdWVyIn0pO3JldHVybiBafWZ1bmN0aW9uIE0kKCQpe24wKCQsImFwcGxpY2F0aW9uL2pzb24iKX1mdW5jdGlvbiBhMCgkLC4uLlgpe2xldCBRPScicmVzcG9uc2UiIGNvbnRlbnQtdHlwZSBtdXN0IGJlICc7aWYoWC5sZW5ndGg+Mil7bGV0IFo9WC5wb3AoKTtRKz1gJHtYLmpvaW4oIiwgIil9LCBvciAke1p9YH1lbHNlIGlmKFgubGVuZ3RoPT09MilRKz1gJHtYWzBdfSBvciAke1hbMV19YDtlbHNlIFErPVhbMF07cmV0dXJuIEQoUSxnOCwkKX1mdW5jdGlvbiBuMCgkLFgpe2lmKEw4KCQpIT09WCl0aHJvdyBhMCgkLFgpfWZ1bmN0aW9uIEYxKCl7cmV0dXJuIGooY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgzMikpKX1mdW5jdGlvbiBVJCgpe3JldHVybiBGMSgpfWZ1bmN0aW9uIEwkKCl7cmV0dXJuIEYxKCl9ZnVuY3Rpb24gTiQoKXtyZXR1cm4gRjEoKX1hc3luYyBmdW5jdGlvbiBiJCgkKXtyZXR1cm4gUigkLCJjb2RlVmVyaWZpZXIiKSxqKGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IixnKCQpKSl9ZnVuY3Rpb24gbzAoJCl7c3dpdGNoKCQuYWxnb3JpdGhtLmhhc2gubmFtZSl7Y2FzZSJTSEEtMjU2IjpyZXR1cm4iUFMyNTYiO2Nhc2UiU0hBLTM4NCI6cmV0dXJuIlBTMzg0IjtjYXNlIlNIQS01MTIiOnJldHVybiJQUzUxMiI7ZGVmYXVsdDp0aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgUnNhSGFzaGVkS2V5QWxnb3JpdGhtIGhhc2ggbmFtZSIse2NhdXNlOiR9KX19ZnVuY3Rpb24gdDAoJCl7c3dpdGNoKCQuYWxnb3JpdGhtLmhhc2gubmFtZSl7Y2FzZSJTSEEtMjU2IjpyZXR1cm4iUlMyNTYiO2Nhc2UiU0hBLTM4NCI6cmV0dXJuIlJTMzg0IjtjYXNlIlNIQS01MTIiOnJldHVybiJSUzUxMiI7ZGVmYXVsdDp0aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgUnNhSGFzaGVkS2V5QWxnb3JpdGhtIGhhc2ggbmFtZSIse2NhdXNlOiR9KX19ZnVuY3Rpb24gczAoJCl7c3dpdGNoKCQuYWxnb3JpdGhtLm5hbWVkQ3VydmUpe2Nhc2UiUC0yNTYiOnJldHVybiJFUzI1NiI7Y2FzZSJQLTM4NCI6cmV0dXJuIkVTMzg0IjtjYXNlIlAtNTIxIjpyZXR1cm4iRVM1MTIiO2RlZmF1bHQ6dGhyb3cgbmV3IGYoInVuc3VwcG9ydGVkIEVjS2V5QWxnb3JpdGhtIG5hbWVkQ3VydmUiLHtjYXVzZTokfSl9fWZ1bmN0aW9uIHIwKCQpe3N3aXRjaCgkLmFsZ29yaXRobS5uYW1lKXtjYXNlIlJTQS1QU1MiOnJldHVybiBvMCgkKTtjYXNlIlJTQVNTQS1QS0NTMS12MV81IjpyZXR1cm4gdDAoJCk7Y2FzZSJFQ0RTQSI6cmV0dXJuIHMwKCQpO2Nhc2UiRWQyNTUxOSI6Y2FzZSJNTC1EU0EtNDQiOmNhc2UiTUwtRFNBLTY1IjpjYXNlIk1MLURTQS04NyI6cmV0dXJuICQuYWxnb3JpdGhtLm5hbWU7Y2FzZSJFZERTQSI6cmV0dXJuIkVkMjU1MTkiO2RlZmF1bHQ6dGhyb3cgbmV3IGYoInVuc3VwcG9ydGVkIENyeXB0b0tleSBhbGdvcml0aG0gbmFtZSIse2NhdXNlOiR9KX19ZnVuY3Rpb24gRTEoJCl7bGV0IFg9JD8uW3cwXTtyZXR1cm4gdHlwZW9mIFg9PT0ibnVtYmVyIiYmTnVtYmVyLmlzRmluaXRlKFgpP1g6MH1mdW5jdGlvbiBTJCgkKXtsZXQgWD0kPy5bZzBdO3JldHVybiB0eXBlb2YgWD09PSJudW1iZXIiJiZOdW1iZXIuaXNGaW5pdGUoWCkmJk1hdGguc2lnbihYKSE9PS0xP1g6MzB9ZnVuY3Rpb24gajEoKXtyZXR1cm4gTWF0aC5mbG9vcihEYXRlLm5vdygpLzEwMDApfWZ1bmN0aW9uIHkxKCQpe2lmKHR5cGVvZiAkIT09Im9iamVjdCJ8fCQ9PT1udWxsKXRocm93IFMoJyJhcyIgbXVzdCBiZSBhbiBvYmplY3QnLEEpO1IoJC5pc3N1ZXIsJyJhcy5pc3N1ZXIiJyl9ZnVuY3Rpb24gdzEoJCl7aWYodHlwZW9mICQhPT0ib2JqZWN0Inx8JD09PW51bGwpdGhyb3cgUygnImNsaWVudCIgbXVzdCBiZSBhbiBvYmplY3QnLEEpO1IoJC5jbGllbnRfaWQsJyJjbGllbnQuY2xpZW50X2lkIicpfWZ1bmN0aW9uIFokKCQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoJCkucmVwbGFjZSgvKD86Wy1fLiF+KicoKV18JTIwKS9nLChYKT0+e3N3aXRjaChYKXtjYXNlIi0iOmNhc2UiXyI6Y2FzZSIuIjpjYXNlIiEiOmNhc2UifiI6Y2FzZSIqIjpjYXNlIiciOmNhc2UiKCI6Y2FzZSIpIjpyZXR1cm5gJSR7WC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWA7Y2FzZSIlMjAiOnJldHVybiIrIjtkZWZhdWx0OnRocm93IEVycm9yKCl9fSl9ZnVuY3Rpb24gUCQoJCl7cmV0dXJuIFIoJCwnImNsaWVudFNlY3JldCInKSwoWCxRLFoseik9PntaLnNldCgiY2xpZW50X2lkIixRLmNsaWVudF9pZCksWi5zZXQoImNsaWVudF9zZWNyZXQiLCQpfX1mdW5jdGlvbiBDJCgkKXtyZXR1cm4gUigkLCciY2xpZW50U2VjcmV0IicpLChYLFEsWix6KT0+e2xldCBXPVokKFEuY2xpZW50X2lkKSxKPVokKCQpLEg9YnRvYShgJHtXfToke0p9YCk7ei5zZXQoImF1dGhvcml6YXRpb24iLGBCYXNpYyAke0h9YCl9fWFzeW5jIGZ1bmN0aW9uIGUwKCQsWCxRKXtpZighUS51c2FnZXMuaW5jbHVkZXMoInNpZ24iKSl0aHJvdyBTKCdDcnlwdG9LZXkgaW5zdGFuY2VzIHVzZWQgZm9yIHNpZ25pbmcgYXNzZXJ0aW9ucyBtdXN0IGluY2x1ZGUgInNpZ24iIGluIHRoZWlyICJ1c2FnZXMiJyxxKTtsZXQgWj1gJHtqKGcoSlNPTi5zdHJpbmdpZnkoJCkpKX0uJHtqKGcoSlNPTi5zdHJpbmdpZnkoWCkpKX1gLHo9aihhd2FpdCBjcnlwdG8uc3VidGxlLnNpZ24obDgoUSksUSxnKFopKSk7cmV0dXJuYCR7Wn0uJHt6fWB9dmFyIEExO2FzeW5jIGZ1bmN0aW9uICQ4KCQsWCl7bGV0e2t0eTpRLGU6WixuOnoseDpXLHk6SixjcnY6SCxwdWI6Qn09YXdhaXQgY3J5cHRvLnN1YnRsZS5leHBvcnRLZXkoImp3ayIsJCksWT17a3R5OlEsZTpaLG46eix4OlcseTpKLGNydjpILHB1YjpCfTtpZihRPT09IkFLUCIpWS5hbGc9WDtyZXR1cm4gQTEuc2V0KCQsWSksWX1hc3luYyBmdW5jdGlvbiBYOCgkLFgpe3JldHVybiBBMXx8PW5ldyBXZWFrTWFwLEExLmdldCgkKXx8JDgoJCxYKX12YXIgUTg9VVJMLnBhcnNlPygkLFgpPT5VUkwucGFyc2UoJCxYKTooJCxYKT0+e3RyeXtyZXR1cm4gbmV3IFVSTCgkLFgpfWNhdGNoe3JldHVybiBudWxsfX07ZnVuY3Rpb24gVCQoJCxYKXtpZihYJiYkLnByb3RvY29sIT09Imh0dHBzOiIpdGhyb3cgRCgib25seSByZXF1ZXN0cyB0byBIVFRQUyBhcmUgYWxsb3dlZCIsaDgsJCk7aWYoJC5wcm90b2NvbCE9PSJodHRwczoiJiYkLnByb3RvY29sIT09Imh0dHA6Iil0aHJvdyBEKCJvbmx5IEhUVFAgYW5kIEhUVFBTIHJlcXVlc3RzIGFyZSBhbGxvd2VkIixrOCwkKX1mdW5jdGlvbiB6JCgkLFgsUSxaKXtsZXQgejtpZih0eXBlb2YgJCE9PSJzdHJpbmcifHwhKHo9UTgoJCkpKXRocm93IEQoYGF1dGhvcml6YXRpb24gc2VydmVyIG1ldGFkYXRhIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCAke1E/YCJhcy5tdGxzX2VuZHBvaW50X2FsaWFzZXMuJHtYfSJgOmAiYXMuJHtYfSJgfWAsJD09PXZvaWQgMD91ODpkOCx7YXR0cmlidXRlOlE/YG10bHNfZW5kcG9pbnRfYWxpYXNlcy4ke1h9YDpYfSk7cmV0dXJuIFQkKHosWiksen1mdW5jdGlvbiBaOCgkLFgsUSxaKXtpZihRJiYkLm10bHNfZW5kcG9pbnRfYWxpYXNlcyYmWCBpbiAkLm10bHNfZW5kcG9pbnRfYWxpYXNlcylyZXR1cm4geiQoJC5tdGxzX2VuZHBvaW50X2FsaWFzZXNbWF0sWCxRLFopO3JldHVybiB6JCgkW1hdLFgsUSxaKX1jbGFzcyB6OHsjWDsjUTsjWjsjSjsjVzsjJDsjejtjb25zdHJ1Y3RvcigkLFgsUSl7aWYoZDAoWD8ucHJpdmF0ZUtleSwnIkRQb1AucHJpdmF0ZUtleSInKSxjMChYPy5wdWJsaWNLZXksJyJEUG9QLnB1YmxpY0tleSInKSwhWC5wdWJsaWNLZXkuZXh0cmFjdGFibGUpdGhyb3cgUygnIkRQb1AucHVibGljS2V5LmV4dHJhY3RhYmxlIiBtdXN0IGJlIHRydWUnLHEpO3RoaXMuI1c9UT8uW2gwXSx0aGlzLiNKPUUxKCQpLHRoaXMuI1E9WC5wcml2YXRlS2V5LHRoaXMuI1o9WC5wdWJsaWNLZXksRzEuYWRkKHRoaXMpfSNZKCQpe3RoaXMuIyR8fD1uZXcgTWFwO2xldCBYPXRoaXMuIyQuZ2V0KCQpO2lmKFgpdGhpcy4jJC5kZWxldGUoJCksdGhpcy4jJC5zZXQoJCxYKTtyZXR1cm4gWH0jSCgkLFgpe2lmKHRoaXMuIyR8fD1uZXcgTWFwLHRoaXMuIyQuZGVsZXRlKCQpLHRoaXMuIyQuc2l6ZT09PTEwMCl0aGlzLiMkLmRlbGV0ZSh0aGlzLiMkLmtleXMoKS5uZXh0KCkudmFsdWUpO3RoaXMuIyQuc2V0KCQsWCl9YXN5bmMgY2FsY3VsYXRlVGh1bWJwcmludCgpe2lmKCF0aGlzLiN6KXtsZXQgJD1hd2FpdCBjcnlwdG8uc3VidGxlLmV4cG9ydEtleSgiandrIix0aGlzLiNaKTt0aGlzLiN6fHw9YXdhaXQgdTAoJCl9cmV0dXJuIHRoaXMuI3p9YXN5bmMgYWRkUHJvb2YoJCxYLFEsWil7bGV0IHo9cjAodGhpcy4jUSk7dGhpcy4jWHx8PXthbGc6eix0eXA6ImRwb3Arand0Iixqd2s6YXdhaXQgWDgodGhpcy4jWix6KX07bGV0IFc9dGhpcy4jWSgkLm9yaWdpbiksSD17aWF0OmoxKCkrdGhpcy4jSixqdGk6RjEoKSxodG06USxub25jZTpXLGh0dTpgJHskLm9yaWdpbn0keyQucGF0aG5hbWV9YCxhdGg6Wj9qKGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IixnKFopKSk6dm9pZCAwfTt0aGlzLiNXPy4odGhpcy4jWCxIKSxYLnNldCgiZHBvcCIsYXdhaXQgZTAodGhpcy4jWCxILHRoaXMuI1EpKX1jYWNoZU5vbmNlKCQsWCl7dHJ5e2xldCBRPSQuaGVhZGVycy5nZXQoImRwb3Atbm9uY2UiKTtpZihRKXRoaXMuI0goWC5vcmlnaW4sUSl9Y2F0Y2h7fX19Y2xhc3MgXyQgZXh0ZW5kcyBFcnJvcntjYXVzZTtjb2RlO2Vycm9yO3N0YXR1cztlcnJvcl9kZXNjcmlwdGlvbjtyZXNwb25zZTtjb25zdHJ1Y3RvcigkLFgpe3N1cGVyKCQsWCk7dGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSx0aGlzLmNvZGU9ajgsdGhpcy5jYXVzZT1YLmNhdXNlLHRoaXMuZXJyb3I9WC5jYXVzZS5lcnJvcix0aGlzLnN0YXR1cz1YLnJlc3BvbnNlLnN0YXR1cyx0aGlzLmVycm9yX2Rlc2NyaXB0aW9uPVguY2F1c2UuZXJyb3JfZGVzY3JpcHRpb24sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlc3BvbnNlIix7ZW51bWVyYWJsZTohMSx2YWx1ZTpYLnJlc3BvbnNlfSksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/Lih0aGlzLHRoaXMuY29uc3RydWN0b3IpfX1jbGFzcyBSJCBleHRlbmRzIEVycm9ye2NhdXNlO2NvZGU7ZXJyb3I7ZXJyb3JfZGVzY3JpcHRpb247Y29uc3RydWN0b3IoJCxYKXtzdXBlcigkLFgpO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPXc4LHRoaXMuY2F1c2U9WC5jYXVzZSx0aGlzLmVycm9yPVguY2F1c2UuZ2V0KCJlcnJvciIpLHRoaXMuZXJyb3JfZGVzY3JpcHRpb249WC5jYXVzZS5nZXQoImVycm9yX2Rlc2NyaXB0aW9uIik/P3ZvaWQgMCxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT8uKHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcil9fWNsYXNzIHEkIGV4dGVuZHMgRXJyb3J7Y2F1c2U7Y29kZTtyZXNwb25zZTtzdGF0dXM7Y29uc3RydWN0b3IoJCxYKXtzdXBlcigkLFgpO3RoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPUU4LHRoaXMuY2F1c2U9WC5jYXVzZSx0aGlzLnN0YXR1cz1YLnJlc3BvbnNlLnN0YXR1cyx0aGlzLnJlc3BvbnNlPVgucmVzcG9uc2UsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlc3BvbnNlIix7ZW51bWVyYWJsZTohMX0pLEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPy4odGhpcyx0aGlzLmNvbnN0cnVjdG9yKX19dmFyIFcxPSJbYS16QS1aMC05ISMkJSZcXCdcXCpcXCtcXC1cXC5cXF5fYFxcfH5dKyIsSjg9IlthLXpBLVowLTlcXC1cXC5fXFx+XFwrXFwvXSs9ezAsMn0iLFc4PSciKCg/OlteIlxcXFxdfFxcXFxbXFxzXFxTXSkqKSInLFk4PSIoIitXMSsiKVxccyo9XFxzKiIrVzgsSDg9IigiK1cxKyIpXFxzKj1cXHMqKCIrVzErIikiLEI4PW5ldyBSZWdFeHAoIl5bLFxcc10qKCIrVzErIikiKSxLOD1uZXcgUmVnRXhwKCJeWyxcXHNdKiIrWTgrIlssXFxzXSooLiopIiksRjg9bmV3IFJlZ0V4cCgiXlssXFxzXSoiK0g4KyJbLFxcc10qKC4qKSIpLEQ4PW5ldyBSZWdFeHAoIl4oIitKOCsiKSg/OiR8WyxcXHNdKSguKikiKTtmdW5jdGlvbiBHOCgkKXtpZighQjEoJCxSZXNwb25zZSkpdGhyb3cgUygnInJlc3BvbnNlIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlJyxBKTtsZXQgWD0kLmhlYWRlcnMuZ2V0KCJ3d3ctYXV0aGVudGljYXRlIik7aWYoWD09PW51bGwpcmV0dXJuO2xldCBRPVtdLFo9WDt3aGlsZShaKXtsZXQgej1aLm1hdGNoKEI4KSxXPXo/LlsiMSJdLnRvTG93ZXJDYXNlKCk7aWYoIVcpcmV0dXJuO2xldCBKPVouc3Vic3RyaW5nKHpbMF0ubGVuZ3RoKTtpZihKJiYhSi5tYXRjaCgvXltccyxdLykpcmV0dXJuO2xldCBIPUoubWF0Y2goL15ccysoLiopJC8pLEI9ISFIO1o9SD9IWzFdOnZvaWQgMDtsZXQgWT17fSxGO2lmKEIpd2hpbGUoWil7bGV0IFYsUDtpZih6PVoubWF0Y2goSzgpKXtpZihbLFYsUCxaXT16LFAuaW5jbHVkZXMoIlxcIikpUD1QLnJlcGxhY2UoL1xcKFtcc1xTXSkvZywiJDEiKTtZW1YudG9Mb3dlckNhc2UoKV09UDtjb250aW51ZX1pZih6PVoubWF0Y2goRjgpKXtbLFYsUCxaXT16LFlbVi50b0xvd2VyQ2FzZSgpXT1QO2NvbnRpbnVlfWlmKHo9Wi5tYXRjaChEOCkpe2lmKE9iamVjdC5rZXlzKFkpLmxlbmd0aClicmVhaztbLEYsWl09ejticmVha31yZXR1cm59ZWxzZSBaPUp8fHZvaWQgMDtsZXQgTD17c2NoZW1lOlcscGFyYW1ldGVyczpZfTtpZihGKUwudG9rZW42OD1GO1EucHVzaChMKX1pZighUS5sZW5ndGgpcmV0dXJuO3JldHVybiBRfWFzeW5jIGZ1bmN0aW9uIFY4KCQpe2lmKCQuc3RhdHVzPjM5OSYmJC5zdGF0dXM8NTAwKXtnMSgkKSxNJCgkKTt0cnl7bGV0IFg9YXdhaXQgJC5jbG9uZSgpLmpzb24oKTtpZih6MShYKSYmdHlwZW9mIFguZXJyb3I9PT0ic3RyaW5nIiYmWC5lcnJvci5sZW5ndGgpcmV0dXJuIFh9Y2F0Y2h7fX1yZXR1cm59YXN5bmMgZnVuY3Rpb24gTTgoJCxYLFEpe2lmKCQuc3RhdHVzIT09WCl7UDgoJCk7bGV0IFo7aWYoWj1hd2FpdCBWOCgkKSl0aHJvdyBhd2FpdCAkLmJvZHk/LmNhbmNlbCgpLG5ldyBfJCgic2VydmVyIHJlc3BvbmRlZCB3aXRoIGFuIGVycm9yIGluIHRoZSByZXNwb25zZSBib2R5Iix7Y2F1c2U6WixyZXNwb25zZTokfSk7dGhyb3cgRChgInJlc3BvbnNlIiBpcyBub3QgYSBjb25mb3JtICR7UX0gcmVzcG9uc2UgKHVuZXhwZWN0ZWQgSFRUUCBzdGF0dXMgY29kZSlgLHkkLCQpfX1mdW5jdGlvbiBVOCgkKXtpZighRzEuaGFzKCQpKXRocm93IFMoJyJvcHRpb25zLkRQb1AiIGlzIG5vdCBhIHZhbGlkIERQb1BIYW5kbGUnLHEpfXZhciBxNT1TeW1ib2woKTtmdW5jdGlvbiBMOCgkKXtyZXR1cm4gJC5oZWFkZXJzLmdldCgiY29udGVudC10eXBlIik/LnNwbGl0KCI7IilbMF19YXN5bmMgZnVuY3Rpb24gTjgoJCxYLFEsWix6LFcsSil7cmV0dXJuIGF3YWl0IFEoJCxYLHosVyksVy5zZXQoImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IiksKEo/LltZJF18fGZldGNoKShaLmhyZWYse2JvZHk6eixoZWFkZXJzOk9iamVjdC5mcm9tRW50cmllcyhXLmVudHJpZXMoKSksbWV0aG9kOiJQT1NUIixyZWRpcmVjdDoibWFudWFsIixzaWduYWw6RiQoWixKPy5zaWduYWwpfSl9YXN5bmMgZnVuY3Rpb24gYjgoJCxYLFEsWix6LFcpe2xldCBKPVo4KCQsInRva2VuX2VuZHBvaW50IixYLnVzZV9tdGxzX2VuZHBvaW50X2FsaWFzZXMsVz8uW0sxXSE9PSEwKTt6LnNldCgiZ3JhbnRfdHlwZSIsWik7bGV0IEg9SyQoVz8uaGVhZGVycyk7aWYoSC5zZXQoImFjY2VwdCIsImFwcGxpY2F0aW9uL2pzb24iKSxXPy5EUG9QIT09dm9pZCAwKVU4KFcuRFBvUCksYXdhaXQgVy5EUG9QLmFkZFByb29mKEosSCwiUE9TVCIpO2xldCBCPWF3YWl0IE44KCQsWCxRLEoseixILFcpO3JldHVybiBXPy5EUG9QPy5jYWNoZU5vbmNlKEIsSiksQn12YXIgSSQ9bmV3IFdlYWtNYXAsUzg9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gRDEoJCl7aWYoISQuaWRfdG9rZW4pcmV0dXJuO2xldCBYPUkkLmdldCgkKTtpZighWCl0aHJvdyBTKCcicmVmIiB3YXMgYWxyZWFkeSBnYXJiYWdlIGNvbGxlY3RlZCBvciBkaWQgbm90IHJlc29sdmUgZnJvbSB0aGUgcHJvcGVyIHNvdXJjZXMnLHEpO3JldHVybiBYfWFzeW5jIGZ1bmN0aW9uIGYkKCQsWCxRLFoseixXKXtpZih5MSgkKSx3MShYKSwhQjEoUSxSZXNwb25zZSkpdGhyb3cgUygnInJlc3BvbnNlIiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlJyxBKTthd2FpdCBNOChRLDIwMCwiVG9rZW4gRW5kcG9pbnQiKSxnMShRKTtsZXQgSj1hd2FpdCBnJChRKTtpZihSKEouYWNjZXNzX3Rva2VuLCcicmVzcG9uc2UiIGJvZHkgImFjY2Vzc190b2tlbiIgcHJvcGVydHknLE4se2JvZHk6Sn0pLFIoSi50b2tlbl90eXBlLCcicmVzcG9uc2UiIGJvZHkgInRva2VuX3R5cGUiIHByb3BlcnR5JyxOLHtib2R5Okp9KSxKLnRva2VuX3R5cGU9Si50b2tlbl90eXBlLnRvTG93ZXJDYXNlKCksSi5leHBpcmVzX2luIT09dm9pZCAwKXtsZXQgSD10eXBlb2YgSi5leHBpcmVzX2luIT09Im51bWJlciI/cGFyc2VGbG9hdChKLmV4cGlyZXNfaW4pOkouZXhwaXJlc19pbjtKMShILCEwLCcicmVzcG9uc2UiIGJvZHkgImV4cGlyZXNfaW4iIHByb3BlcnR5JyxOLHtib2R5Okp9KSxKLmV4cGlyZXNfaW49SH1pZihKLnJlZnJlc2hfdG9rZW4hPT12b2lkIDApUihKLnJlZnJlc2hfdG9rZW4sJyJyZXNwb25zZSIgYm9keSAicmVmcmVzaF90b2tlbiIgcHJvcGVydHknLE4se2JvZHk6Sn0pO2lmKEouc2NvcGUhPT12b2lkIDAmJnR5cGVvZiBKLnNjb3BlIT09InN0cmluZyIpdGhyb3cgRCgnInJlc3BvbnNlIiBib2R5ICJzY29wZSIgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZycsTix7Ym9keTpKfSk7aWYoSi5pZF90b2tlbiE9PXZvaWQgMCl7UihKLmlkX3Rva2VuLCcicmVzcG9uc2UiIGJvZHkgImlkX3Rva2VuIiBwcm9wZXJ0eScsTix7Ym9keTpKfSk7bGV0IEg9W107aWYoWC5yZXF1aXJlX2F1dGhfdGltZT09PSEwKUgucHVzaCgiYXV0aF90aW1lIik7aWYoWC5kZWZhdWx0X21heF9hZ2UhPT12b2lkIDApSjEoWC5kZWZhdWx0X21heF9hZ2UsITAsJyJjbGllbnQuZGVmYXVsdF9tYXhfYWdlIicpLEgucHVzaCgiYXV0aF90aW1lIik7aWYoWj8ubGVuZ3RoKUgucHVzaCguLi5aKTtsZXR7Y2xhaW1zOkIsand0Oll9PWF3YWl0IGY4KCQsWCxKLmlkX3Rva2VuLEgseik7QTgoWCxCKSxPOChCKSxTOC5zZXQoUSxZKSxJJC5zZXQoSixCKX1pZihXPy5bSi50b2tlbl90eXBlXSE9PXZvaWQgMClXW0oudG9rZW5fdHlwZV0oUSxKKTtlbHNlIGlmKEoudG9rZW5fdHlwZSE9PSJkcG9wIiYmSi50b2tlbl90eXBlIT09ImJlYXJlciIpdGhyb3cgbmV3IGYoInVuc3VwcG9ydGVkIGB0b2tlbl90eXBlYCB2YWx1ZSIse2NhdXNlOntib2R5Okp9fSk7cmV0dXJuIEp9ZnVuY3Rpb24gUDgoJCl7bGV0IFg7aWYoWD1HOCgkKSl0aHJvdyBuZXcgcSQoInNlcnZlciByZXNwb25kZWQgd2l0aCBhIGNoYWxsZW5nZSBpbiB0aGUgV1dXLUF1dGhlbnRpY2F0ZSBIVFRQIEhlYWRlciIse2NhdXNlOlgscmVzcG9uc2U6JH0pfWZ1bmN0aW9uIEM4KCQsWCl7aWYoQXJyYXkuaXNBcnJheShYLmNsYWltcy5hdWQpKXtpZighWC5jbGFpbXMuYXVkLmluY2x1ZGVzKCQpKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhdWQiIChhdWRpZW5jZSkgY2xhaW0gdmFsdWUnLGkse2V4cGVjdGVkOiQsY2xhaW1zOlguY2xhaW1zLGNsYWltOiJhdWQifSl9ZWxzZSBpZihYLmNsYWltcy5hdWQhPT0kKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhdWQiIChhdWRpZW5jZSkgY2xhaW0gdmFsdWUnLGkse2V4cGVjdGVkOiQsY2xhaW1zOlguY2xhaW1zLGNsYWltOiJhdWQifSk7cmV0dXJuIFh9ZnVuY3Rpb24gVDgoJCxYKXtsZXQgUT0kW284XT8uKFgpPz8kLmlzc3VlcjtpZihYLmNsYWltcy5pc3MhPT1RKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJpc3MiIChpc3N1ZXIpIGNsYWltIHZhbHVlJyxpLHtleHBlY3RlZDpRLGNsYWltczpYLmNsYWltcyxjbGFpbToiaXNzIn0pO3JldHVybiBYfXZhciBHMT1uZXcgV2Vha1NldDtmdW5jdGlvbiBfOCgkKXtyZXR1cm4gRzEuYWRkKCQpLCR9dmFyIFI4PVN5bWJvbCgpO2FzeW5jIGZ1bmN0aW9uIE8kKCQsWCxRLFoseixXLEope2lmKHkxKCQpLHcxKFgpLCFHMS5oYXMoWikpdGhyb3cgUygnImNhbGxiYWNrUGFyYW1ldGVycyIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBVUkxTZWFyY2hQYXJhbXMgb2J0YWluZWQgZnJvbSAidmFsaWRhdGVBdXRoUmVzcG9uc2UoKSIsIG9yICJ2YWxpZGF0ZUp3dEF1dGhSZXNwb25zZSgpJyxxKTtSKHosJyJyZWRpcmVjdFVyaSInKTtsZXQgSD1jKFosImNvZGUiKTtpZighSCl0aHJvdyBEKCdubyBhdXRob3JpemF0aW9uIGNvZGUgaW4gImNhbGxiYWNrUGFyYW1ldGVycyInLE4pO2xldCBCPW5ldyBVUkxTZWFyY2hQYXJhbXMoSj8uYWRkaXRpb25hbFBhcmFtZXRlcnMpO2lmKEIuc2V0KCJyZWRpcmVjdF91cmkiLHopLEIuc2V0KCJjb2RlIixIKSxXIT09UjgpUihXLCciY29kZVZlcmlmaWVyIicpLEIuc2V0KCJjb2RlX3ZlcmlmaWVyIixXKTtyZXR1cm4gYjgoJCxYLFEsImF1dGhvcml6YXRpb25fY29kZSIsQixKKX12YXIgQSQ9e2F1ZDoiYXVkaWVuY2UiLGNfaGFzaDoiY29kZSBoYXNoIixjbGllbnRfaWQ6ImNsaWVudCBpZCIsZXhwOiJleHBpcmF0aW9uIHRpbWUiLGlhdDoiaXNzdWVkIGF0Iixpc3M6Imlzc3VlciIsanRpOiJqd3QgaWQiLG5vbmNlOiJub25jZSIsc19oYXNoOiJzdGF0ZSBoYXNoIixzdWI6InN1YmplY3QiLGF0aDoiYWNjZXNzIHRva2VuIGhhc2giLGh0bToiaHR0cCBtZXRob2QiLGh0dToiaHR0cCB1cmkiLGNuZjoiY29uZmlybWF0aW9uIixhdXRoX3RpbWU6ImF1dGhlbnRpY2F0aW9uIHRpbWUifTtmdW5jdGlvbiBxOCgkLFgpe2ZvcihsZXQgUSBvZiAkKWlmKFguY2xhaW1zW1FdPT09dm9pZCAwKXRocm93IEQoYEpXVCAiJHtRfSIgKCR7QSRbUV19KSBjbGFpbSBtaXNzaW5nYCxOLHtjbGFpbXM6WC5jbGFpbXN9KTtyZXR1cm4gWH1mdW5jdGlvbiBJOCgkLFgpe2lmKHR5cGVvZiBYLmNsYWltc1skXSE9PSJzdHJpbmciKXRocm93IEQoYHVuZXhwZWN0ZWQgSldUICIkeyR9IiAoJHtBJFskXX0pIGNsYWltIHR5cGVgLE4se2NsYWltczpYLmNsYWltc30pO3JldHVybiBYfWZ1bmN0aW9uIGY4KCQsWCxRLFoseil7cmV0dXJuIHA4KFEsaTguYmluZCh2b2lkIDAsWC5pZF90b2tlbl9zaWduZWRfcmVzcG9uc2VfYWxnLCQuaWRfdG9rZW5fc2lnbmluZ19hbGdfdmFsdWVzX3N1cHBvcnRlZCwiUlMyNTYiKSxFMShYKSxTJChYKSx6KS50aGVuKHE4LmJpbmQodm9pZCAwLFsiYXVkIiwiZXhwIiwiaWF0IiwiaXNzIiwic3ViIiwuLi5aXSkpLnRoZW4oVDguYmluZCh2b2lkIDAsJCkpLnRoZW4oQzguYmluZCh2b2lkIDAsWC5jbGllbnRfaWQpKS50aGVuKEk4LmJpbmQodm9pZCAwLCJzdWIiKSl9ZnVuY3Rpb24geCQoJCxYKXtpZihYPT09SDEpcmV0dXJuIFg7bGV0IFE9WD09PXZvaWQgMDtpZihRKVg9JC5kZWZhdWx0X21heF9hZ2U7aWYoWD09PXZvaWQgMClyZXR1cm4gSDE7cmV0dXJuIEoxKFgsITAsUT8nImNsaWVudC5kZWZhdWx0X21heF9hZ2UiJzonIm1heEFnZSIgYXJndW1lbnQnKSxYfWZ1bmN0aW9uIE84KCQpe2lmKCQuYXV0aF90aW1lIT09dm9pZCAwKUoxKCQuYXV0aF90aW1lLCEwLCdJRCBUb2tlbiAiYXV0aF90aW1lIiAoYXV0aGVudGljYXRpb24gdGltZSknLE4se2NsYWltczokfSl9ZnVuY3Rpb24gdiQoJCxYLFEpe2lmKFE9PT1IMSlyZXR1cm47bGV0IFo9ajEoKStFMSgkKSx6PVMkKCQpO2lmKFguYXV0aF90aW1lK1E8Wi16KXRocm93IEQoInRvbyBtdWNoIHRpbWUgaGFzIGVsYXBzZWQgc2luY2UgdGhlIGxhc3QgRW5kLVVzZXIgYXV0aGVudGljYXRpb24iLHYxLHtjbGFpbXM6WCxub3c6Wix0b2xlcmFuY2U6eixjbGFpbToiYXV0aF90aW1lIn0pfWZ1bmN0aW9uIEUkKCQsWCl7bGV0IFE9WD09PVkxP3ZvaWQgMDpYO2lmKCQubm9uY2UhPT1RKXRocm93IEQoJ3VuZXhwZWN0ZWQgSUQgVG9rZW4gIm5vbmNlIiBjbGFpbSB2YWx1ZScsaSx7ZXhwZWN0ZWQ6USxjbGFpbXM6JCxjbGFpbToibm9uY2UifSl9ZnVuY3Rpb24gQTgoJCxYKXtpZihBcnJheS5pc0FycmF5KFguYXVkKSYmWC5hdWQubGVuZ3RoIT09MSl7aWYoWC5henA9PT12b2lkIDApdGhyb3cgRCgnSUQgVG9rZW4gImF1ZCIgKGF1ZGllbmNlKSBjbGFpbSBpbmNsdWRlcyBhZGRpdGlvbmFsIHVudHJ1c3RlZCBhdWRpZW5jZXMnLGkse2NsYWltczpYLGNsYWltOiJhdWQifSk7aWYoWC5henAhPT0kLmNsaWVudF9pZCl0aHJvdyBEKCd1bmV4cGVjdGVkIElEIFRva2VuICJhenAiIChhdXRob3JpemVkIHBhcnR5KSBjbGFpbSB2YWx1ZScsaSx7ZXhwZWN0ZWQ6JC5jbGllbnRfaWQsY2xhaW1zOlgsY2xhaW06ImF6cCJ9KX19dmFyIFkxPVN5bWJvbCgpLEgxPVN5bWJvbCgpO2FzeW5jIGZ1bmN0aW9uIGokKCQsWCxRLFope2lmKHR5cGVvZiBaPy5leHBlY3RlZE5vbmNlPT09InN0cmluZyJ8fHR5cGVvZiBaPy5tYXhBZ2U9PT0ibnVtYmVyInx8Wj8ucmVxdWlyZUlkVG9rZW4pcmV0dXJuIHg4KCQsWCxRLFouZXhwZWN0ZWROb25jZSxaLm1heEFnZSxaW1EkXSxaLnJlY29nbml6ZWRUb2tlblR5cGVzKTtyZXR1cm4gdjgoJCxYLFEsWj8ubWF4QWdlLFo/LltRJF0sWj8ucmVjb2duaXplZFRva2VuVHlwZXMpfWFzeW5jIGZ1bmN0aW9uIHg4KCQsWCxRLFoseixXLEope2xldCBIPVtdO3N3aXRjaChaKXtjYXNlIHZvaWQgMDpaPVkxO2JyZWFrO2Nhc2UgWTE6YnJlYWs7ZGVmYXVsdDpSKFosJyJleHBlY3RlZE5vbmNlIiBhcmd1bWVudCcpLEgucHVzaCgibm9uY2UiKX1pZih6PXgkKFgseikseiE9PUgxKUgucHVzaCgiYXV0aF90aW1lIik7bGV0IEI9YXdhaXQgZiQoJCxYLFEsSCxXLEopO1IoQi5pZF90b2tlbiwnInJlc3BvbnNlIiBib2R5ICJpZF90b2tlbiIgcHJvcGVydHknLE4se2JvZHk6Qn0pO2xldCBZPUQxKEIpO3JldHVybiB2JChYLFkseiksRSQoWSxaKSxCfWFzeW5jIGZ1bmN0aW9uIHY4KCQsWCxRLFoseixXKXtsZXQgSj1hd2FpdCBmJCgkLFgsUSx2b2lkIDAseixXKSxIPUQxKEopO2lmKEgpdiQoWCxILHgkKFgsWikpLEUkKEgsWTEpO3JldHVybiBKfXZhciBFOD0iT0FVVEhfV1dXX0FVVEhFTlRJQ0FURV9DSEFMTEVOR0UiLGo4PSJPQVVUSF9SRVNQT05TRV9CT0RZX0VSUk9SIix5OD0iT0FVVEhfVU5TVVBQT1JURURfT1BFUkFUSU9OIix3OD0iT0FVVEhfQVVUSE9SSVpBVElPTl9SRVNQT05TRV9FUlJPUiI7dmFyIHgxPSJPQVVUSF9QQVJTRV9FUlJPUiIsTj0iT0FVVEhfSU5WQUxJRF9SRVNQT05TRSI7dmFyIGc4PSJPQVVUSF9SRVNQT05TRV9JU19OT1RfSlNPTiIseSQ9Ik9BVVRIX1JFU1BPTlNFX0lTX05PVF9DT05GT1JNIixoOD0iT0FVVEhfSFRUUF9SRVFVRVNUX0ZPUkJJRERFTiIsazg9Ik9BVVRIX1JFUVVFU1RfUFJPVE9DT0xfRk9SQklEREVOIix2MT0iT0FVVEhfSldUX1RJTUVTVEFNUF9DSEVDS19GQUlMRUQiLGk9Ik9BVVRIX0pXVF9DTEFJTV9DT01QQVJJU09OX0ZBSUxFRCIsbTg9Ik9BVVRIX0pTT05fQVRUUklCVVRFX0NPTVBBUklTT05fRkFJTEVEIjt2YXIgdTg9Ik9BVVRIX01JU1NJTkdfU0VSVkVSX01FVEFEQVRBIixkOD0iT0FVVEhfSU5WQUxJRF9TRVJWRVJfTUVUQURBVEEiO2Z1bmN0aW9uIGcxKCQpe2lmKCQuYm9keVVzZWQpdGhyb3cgUygnInJlc3BvbnNlIiBib2R5IGhhcyBiZWVuIHVzZWQgYWxyZWFkeScscSl9ZnVuY3Rpb24gSiQoJCl7bGV0e2FsZ29yaXRobTpYfT0kO2lmKHR5cGVvZiBYLm1vZHVsdXNMZW5ndGghPT0ibnVtYmVyInx8WC5tb2R1bHVzTGVuZ3RoPDIwNDgpdGhyb3cgbmV3IGYoYHVuc3VwcG9ydGVkICR7WC5uYW1lfSBtb2R1bHVzTGVuZ3RoYCx7Y2F1c2U6JH0pfWZ1bmN0aW9uIGM4KCQpe2xldHthbGdvcml0aG06WH09JDtzd2l0Y2goWC5uYW1lZEN1cnZlKXtjYXNlIlAtMjU2IjpyZXR1cm4iU0hBLTI1NiI7Y2FzZSJQLTM4NCI6cmV0dXJuIlNIQS0zODQiO2Nhc2UiUC01MjEiOnJldHVybiJTSEEtNTEyIjtkZWZhdWx0OnRocm93IG5ldyBmKCJ1bnN1cHBvcnRlZCBFQ0RTQSBuYW1lZEN1cnZlIix7Y2F1c2U6JH0pfX1mdW5jdGlvbiBsOCgkKXtzd2l0Y2goJC5hbGdvcml0aG0ubmFtZSl7Y2FzZSJFQ0RTQSI6cmV0dXJue25hbWU6JC5hbGdvcml0aG0ubmFtZSxoYXNoOmM4KCQpfTtjYXNlIlJTQS1QU1MiOnN3aXRjaChKJCgkKSwkLmFsZ29yaXRobS5oYXNoLm5hbWUpe2Nhc2UiU0hBLTI1NiI6Y2FzZSJTSEEtMzg0IjpjYXNlIlNIQS01MTIiOnJldHVybntuYW1lOiQuYWxnb3JpdGhtLm5hbWUsc2FsdExlbmd0aDpwYXJzZUludCgkLmFsZ29yaXRobS5oYXNoLm5hbWUuc2xpY2UoLTMpLDEwKT4+M307ZGVmYXVsdDp0aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgUlNBLVBTUyBoYXNoIG5hbWUiLHtjYXVzZTokfSl9Y2FzZSJSU0FTU0EtUEtDUzEtdjFfNSI6cmV0dXJuIEokKCQpLCQuYWxnb3JpdGhtLm5hbWU7Y2FzZSJNTC1EU0EtNDQiOmNhc2UiTUwtRFNBLTY1IjpjYXNlIk1MLURTQS04NyI6Y2FzZSJFZDI1NTE5IjpyZXR1cm4gJC5hbGdvcml0aG0ubmFtZX10aHJvdyBuZXcgZigidW5zdXBwb3J0ZWQgQ3J5cHRvS2V5IGFsZ29yaXRobSBuYW1lIix7Y2F1c2U6JH0pfWFzeW5jIGZ1bmN0aW9uIHA4KCQsWCxRLFoseil7bGV0ezA6VywxOkosbGVuZ3RoOkh9PSQuc3BsaXQoIi4iKTtpZihIPT09NSlpZih6IT09dm9pZCAwKSQ9YXdhaXQgeigkKSx7MDpXLDE6SixsZW5ndGg6SH09JC5zcGxpdCgiLiIpO2Vsc2UgdGhyb3cgbmV3IGYoIkpXRSBkZWNyeXB0aW9uIGlzIG5vdCBjb25maWd1cmVkIix7Y2F1c2U6JH0pO2lmKEghPT0zKXRocm93IEQoIkludmFsaWQgSldUIixOLCQpO2xldCBCO3RyeXtCPUpTT04ucGFyc2UoZyhqKFcpKSl9Y2F0Y2goTCl7dGhyb3cgRCgiZmFpbGVkIHRvIHBhcnNlIEpXVCBIZWFkZXIgYm9keSBhcyBiYXNlNjR1cmwgZW5jb2RlZCBKU09OIix4MSxMKX1pZighejEoQikpdGhyb3cgRCgiSldUIEhlYWRlciBtdXN0IGJlIGEgdG9wIGxldmVsIG9iamVjdCIsTiwkKTtpZihYKEIpLEIuY3JpdCE9PXZvaWQgMCl0aHJvdyBuZXcgZignbm8gSldUICJjcml0IiBoZWFkZXIgcGFyYW1ldGVyIGV4dGVuc2lvbnMgYXJlIHN1cHBvcnRlZCcse2NhdXNlOntoZWFkZXI6Qn19KTtsZXQgWTt0cnl7WT1KU09OLnBhcnNlKGcoaihKKSkpfWNhdGNoKEwpe3Rocm93IEQoImZhaWxlZCB0byBwYXJzZSBKV1QgUGF5bG9hZCBib2R5IGFzIGJhc2U2NHVybCBlbmNvZGVkIEpTT04iLHgxLEwpfWlmKCF6MShZKSl0aHJvdyBEKCJKV1QgUGF5bG9hZCBtdXN0IGJlIGEgdG9wIGxldmVsIG9iamVjdCIsTiwkKTtsZXQgRj1qMSgpK1E7aWYoWS5leHAhPT12b2lkIDApe2lmKHR5cGVvZiBZLmV4cCE9PSJudW1iZXIiKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJleHAiIChleHBpcmF0aW9uIHRpbWUpIGNsYWltIHR5cGUnLE4se2NsYWltczpZfSk7aWYoWS5leHA8PUYtWil0aHJvdyBEKCd1bmV4cGVjdGVkIEpXVCAiZXhwIiAoZXhwaXJhdGlvbiB0aW1lKSBjbGFpbSB2YWx1ZSwgZXhwaXJhdGlvbiBpcyBwYXN0IGN1cnJlbnQgdGltZXN0YW1wJyx2MSx7Y2xhaW1zOlksbm93OkYsdG9sZXJhbmNlOlosY2xhaW06ImV4cCJ9KX1pZihZLmlhdCE9PXZvaWQgMCl7aWYodHlwZW9mIFkuaWF0IT09Im51bWJlciIpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImlhdCIgKGlzc3VlZCBhdCkgY2xhaW0gdHlwZScsTix7Y2xhaW1zOll9KX1pZihZLmlzcyE9PXZvaWQgMCl7aWYodHlwZW9mIFkuaXNzIT09InN0cmluZyIpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImlzcyIgKGlzc3VlcikgY2xhaW0gdHlwZScsTix7Y2xhaW1zOll9KX1pZihZLm5iZiE9PXZvaWQgMCl7aWYodHlwZW9mIFkubmJmIT09Im51bWJlciIpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgIm5iZiIgKG5vdCBiZWZvcmUpIGNsYWltIHR5cGUnLE4se2NsYWltczpZfSk7aWYoWS5uYmY+RitaKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJuYmYiIChub3QgYmVmb3JlKSBjbGFpbSB2YWx1ZScsdjEse2NsYWltczpZLG5vdzpGLHRvbGVyYW5jZTpaLGNsYWltOiJuYmYifSl9aWYoWS5hdWQhPT12b2lkIDApe2lmKHR5cGVvZiBZLmF1ZCE9PSJzdHJpbmciJiYhQXJyYXkuaXNBcnJheShZLmF1ZCkpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImF1ZCIgKGF1ZGllbmNlKSBjbGFpbSB0eXBlJyxOLHtjbGFpbXM6WX0pfXJldHVybntoZWFkZXI6QixjbGFpbXM6WSxqd3Q6JH19ZnVuY3Rpb24gaTgoJCxYLFEsWil7aWYoJCE9PXZvaWQgMCl7aWYodHlwZW9mICQ9PT0ic3RyaW5nIj9aLmFsZyE9PSQ6ISQuaW5jbHVkZXMoWi5hbGcpKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhbGciIGhlYWRlciBwYXJhbWV0ZXInLE4se2hlYWRlcjpaLGV4cGVjdGVkOiQscmVhc29uOiJjbGllbnQgY29uZmlndXJhdGlvbiJ9KTtyZXR1cm59aWYoQXJyYXkuaXNBcnJheShYKSl7aWYoIVguaW5jbHVkZXMoWi5hbGcpKXRocm93IEQoJ3VuZXhwZWN0ZWQgSldUICJhbGciIGhlYWRlciBwYXJhbWV0ZXInLE4se2hlYWRlcjpaLGV4cGVjdGVkOlgscmVhc29uOiJhdXRob3JpemF0aW9uIHNlcnZlciBtZXRhZGF0YSJ9KTtyZXR1cm59aWYoUSE9PXZvaWQgMCl7aWYodHlwZW9mIFE9PT0ic3RyaW5nIj9aLmFsZyE9PVE6dHlwZW9mIFE9PT0iZnVuY3Rpb24iPyFRKFouYWxnKTohUS5pbmNsdWRlcyhaLmFsZykpdGhyb3cgRCgndW5leHBlY3RlZCBKV1QgImFsZyIgaGVhZGVyIHBhcmFtZXRlcicsTix7aGVhZGVyOlosZXhwZWN0ZWQ6USxyZWFzb246ImRlZmF1bHQgdmFsdWUifSk7cmV0dXJufXRocm93IEQoJ21pc3NpbmcgY2xpZW50IG9yIHNlcnZlciBjb25maWd1cmF0aW9uIHRvIHZlcmlmeSB1c2VkIEpXVCAiYWxnIiBoZWFkZXIgcGFyYW1ldGVyJyx2b2lkIDAse2NsaWVudDokLGlzc3VlcjpYLGZhbGxiYWNrOlF9KX1mdW5jdGlvbiBjKCQsWCl7bGV0ezA6USxsZW5ndGg6Wn09JC5nZXRBbGwoWCk7aWYoWj4xKXRocm93IEQoYCIke1h9IiBwYXJhbWV0ZXIgbXVzdCBiZSBwcm92aWRlZCBvbmx5IG9uY2VgLE4pO3JldHVybiBRfXZhciBhOD1TeW1ib2woKSxuOD1TeW1ib2woKTtmdW5jdGlvbiB3JCgkLFgsUSxaKXtpZih5MSgkKSx3MShYKSxRIGluc3RhbmNlb2YgVVJMKVE9US5zZWFyY2hQYXJhbXM7aWYoIShRIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKSl0aHJvdyBTKCcicGFyYW1ldGVycyIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBVUkxTZWFyY2hQYXJhbXMsIG9yIFVSTCcsQSk7aWYoYyhRLCJyZXNwb25zZSIpKXRocm93IEQoJyJwYXJhbWV0ZXJzIiBjb250YWlucyBhIEpBUk0gcmVzcG9uc2UsIHVzZSB2YWxpZGF0ZUp3dEF1dGhSZXNwb25zZSgpIGluc3RlYWQgb2YgdmFsaWRhdGVBdXRoUmVzcG9uc2UoKScsTix7cGFyYW1ldGVyczpRfSk7bGV0IHo9YyhRLCJpc3MiKSxXPWMoUSwic3RhdGUiKTtpZigheiYmJC5hdXRob3JpemF0aW9uX3Jlc3BvbnNlX2lzc19wYXJhbWV0ZXJfc3VwcG9ydGVkKXRocm93IEQoJ3Jlc3BvbnNlIHBhcmFtZXRlciAiaXNzIiAoaXNzdWVyKSBtaXNzaW5nJyxOLHtwYXJhbWV0ZXJzOlF9KTtpZih6JiZ6IT09JC5pc3N1ZXIpdGhyb3cgRCgndW5leHBlY3RlZCAiaXNzIiAoaXNzdWVyKSByZXNwb25zZSBwYXJhbWV0ZXIgdmFsdWUnLE4se2V4cGVjdGVkOiQuaXNzdWVyLHBhcmFtZXRlcnM6UX0pO3N3aXRjaChaKXtjYXNlIHZvaWQgMDpjYXNlIG44OmlmKFchPT12b2lkIDApdGhyb3cgRCgndW5leHBlY3RlZCAic3RhdGUiIHJlc3BvbnNlIHBhcmFtZXRlciBlbmNvdW50ZXJlZCcsTix7ZXhwZWN0ZWQ6dm9pZCAwLHBhcmFtZXRlcnM6UX0pO2JyZWFrO2Nhc2UgYTg6YnJlYWs7ZGVmYXVsdDppZihSKFosJyJleHBlY3RlZFN0YXRlIiBhcmd1bWVudCcpLFchPT1aKXRocm93IEQoVz09PXZvaWQgMD8ncmVzcG9uc2UgcGFyYW1ldGVyICJzdGF0ZSIgbWlzc2luZyc6J3VuZXhwZWN0ZWQgInN0YXRlIiByZXNwb25zZSBwYXJhbWV0ZXIgdmFsdWUnLE4se2V4cGVjdGVkOloscGFyYW1ldGVyczpRfSl9aWYoYyhRLCJlcnJvciIpKXRocm93IG5ldyBSJCgiYXV0aG9yaXphdGlvbiByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgaXMgYW4gZXJyb3IiLHtjYXVzZTpRfSk7bGV0IEg9YyhRLCJpZF90b2tlbiIpLEI9YyhRLCJ0b2tlbiIpO2lmKEghPT12b2lkIDB8fEIhPT12b2lkIDApdGhyb3cgbmV3IGYoImltcGxpY2l0IGFuZCBoeWJyaWQgZmxvd3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTtyZXR1cm4gXzgobmV3IFVSTFNlYXJjaFBhcmFtcyhRKSl9YXN5bmMgZnVuY3Rpb24gZyQoJCxYPU0kKXtsZXQgUTt0cnl7UT1hd2FpdCAkLmpzb24oKX1jYXRjaChaKXt0aHJvdyBYKCQpLEQoJ2ZhaWxlZCB0byBwYXJzZSAicmVzcG9uc2UiIGJvZHkgYXMgSlNPTicseDEsWil9aWYoIXoxKFEpKXRocm93IEQoJyJyZXNwb25zZSIgYm9keSBtdXN0IGJlIGEgdG9wIGxldmVsIG9iamVjdCcsTix7Ym9keTpRfSk7cmV0dXJuIFF9dmFyIFckPVN5bWJvbCgpLG84PVN5bWJvbCgpO3ZhciBWMT02MDAwMDAsczg9ODY0MDAwMDAscjg9MTUwMDA7Y2xhc3MgSSBleHRlbmRzIEVycm9ye3JlYXNvbjtjb25zdHJ1Y3RvcigkLFgpe3N1cGVyKFgpO3RoaXMucmVhc29uPSQ7dGhpcy5uYW1lPSJPaWRjRmxvd0Vycm9yIn19Y2xhc3MgaDF7Y29uZmlnO3JlZGlyZWN0VXJpO2FsbG93SW5zZWN1cmVIdHRwO21ldGFkYXRhO21ldGFkYXRhRmV0Y2hlZEF0PTA7bGFzdERpc2NvdmVyeUZhaWx1cmVBdD0wO2NvbnN0cnVjdG9yKCQsWCxRKXt0aGlzLmNvbmZpZz0kO3RoaXMucmVkaXJlY3RVcmk9WDt0aGlzLmFsbG93SW5zZWN1cmVIdHRwPVF9Z2V0IGNsaWVudCgpe3JldHVybntjbGllbnRfaWQ6dGhpcy5jb25maWcuY2xpZW50SWR9fWdldCBjbGllbnRBdXRoKCl7cmV0dXJuIHRoaXMuY29uZmlnLnRva2VuRW5kcG9pbnRBdXRoTWV0aG9kPT09ImNsaWVudF9zZWNyZXRfcG9zdCI/UCQodGhpcy5jb25maWcuY2xpZW50U2VjcmV0KTpDJCh0aGlzLmNvbmZpZy5jbGllbnRTZWNyZXQpfXJlcXVlc3RPcHRpb25zKCl7cmV0dXJuIHRoaXMuYWxsb3dJbnNlY3VyZUh0dHA/e1tLMV06ITB9Ont9fWFzeW5jIGF1dGhvcml6YXRpb25TZXJ2ZXIoKXtsZXQgJD1EYXRlLm5vdygpO2lmKHRoaXMubWV0YWRhdGEhPT12b2lkIDAmJiQtdGhpcy5tZXRhZGF0YUZldGNoZWRBdDxzOClyZXR1cm4gdGhpcy5tZXRhZGF0YTtpZih0aGlzLm1ldGFkYXRhPT09dm9pZCAwJiYkLXRoaXMubGFzdERpc2NvdmVyeUZhaWx1cmVBdDxyOCl0aHJvdyBuZXcgSSgicHJvdmlkZXJVbmF2YWlsYWJsZSIsYGRpc2NvdmVyeSBmb3IgcHJvdmlkZXIgJHt0aGlzLmNvbmZpZy5pZH0gZmFpbGVkIHJlY2VudGx5OyByZXRyeWluZyBzaG9ydGx5YCk7bGV0IFg9bmV3IFVSTCh0aGlzLmNvbmZpZy5pc3N1ZXIpLFE9RyQoWCx7YWxnb3JpdGhtOiJvaWRjIiwuLi50aGlzLnJlcXVlc3RPcHRpb25zKCl9KS50aGVuKChaKT0+ViQoWCxaKSk7dGhpcy5tZXRhZGF0YT1RLHRoaXMubWV0YWRhdGFGZXRjaGVkQXQ9JDt0cnl7cmV0dXJuIGF3YWl0IFF9Y2F0Y2goWil7dGhyb3cgdGhpcy5tZXRhZGF0YT12b2lkIDAsdGhpcy5sYXN0RGlzY292ZXJ5RmFpbHVyZUF0PURhdGUubm93KCksbmV3IEkoInByb3ZpZGVyVW5hdmFpbGFibGUiLGBkaXNjb3ZlcnkgZm9yIHByb3ZpZGVyICR7dGhpcy5jb25maWcuaWR9ICgke3RoaXMuY29uZmlnLmlzc3Vlcn0pIGZhaWxlZDogJHtaLm1lc3NhZ2V9YCl9fWFzeW5jIGJlZ2luKCQpe2xldCBYPWF3YWl0IHRoaXMuYXV0aG9yaXphdGlvblNlcnZlcigpO2lmKFguYXV0aG9yaXphdGlvbl9lbmRwb2ludD09PXZvaWQgMCl0aHJvdyBuZXcgSSgicHJvdmlkZXJNaXNjb25maWd1cmVkIixgcHJvdmlkZXIgJHt0aGlzLmNvbmZpZy5pZH0gaGFzIG5vIGF1dGhvcml6YXRpb25fZW5kcG9pbnRgKTtsZXQgUT1VJCgpLFo9e3Byb3ZpZGVyOnRoaXMuY29uZmlnLmlkLHN0YXRlOkwkKCksbm9uY2U6TiQoKSxjb2RlVmVyaWZpZXI6USxyZXR1cm5UbzokLGNyZWF0ZWRBdDpEYXRlLm5vdygpfSx6PW5ldyBVUkwoWC5hdXRob3JpemF0aW9uX2VuZHBvaW50KTtyZXR1cm4gei5zZWFyY2hQYXJhbXMuc2V0KCJjbGllbnRfaWQiLHRoaXMuY29uZmlnLmNsaWVudElkKSx6LnNlYXJjaFBhcmFtcy5zZXQoInJlZGlyZWN0X3VyaSIsdGhpcy5yZWRpcmVjdFVyaSksei5zZWFyY2hQYXJhbXMuc2V0KCJyZXNwb25zZV90eXBlIiwiY29kZSIpLHouc2VhcmNoUGFyYW1zLnNldCgic2NvcGUiLHRoaXMuY29uZmlnLnNjb3Blcy5qb2luKCIgIikpLHouc2VhcmNoUGFyYW1zLnNldCgic3RhdGUiLFouc3RhdGUpLHouc2VhcmNoUGFyYW1zLnNldCgibm9uY2UiLFoubm9uY2UpLHouc2VhcmNoUGFyYW1zLnNldCgiY29kZV9jaGFsbGVuZ2UiLGF3YWl0IGIkKFEpKSx6LnNlYXJjaFBhcmFtcy5zZXQoImNvZGVfY2hhbGxlbmdlX21ldGhvZCIsIlMyNTYiKSx7dXJsOnouaHJlZixwZW5kaW5nOlp9fWFzeW5jIGNvbXBsZXRlKCQsWCl7aWYoWC5wcm92aWRlciE9PXRoaXMuY29uZmlnLmlkKXRocm93IG5ldyBJKCJzdGF0ZU1pc21hdGNoIiwidGhlIHBlbmRpbmcgbG9naW4gYmVsb25ncyB0byBhIGRpZmZlcmVudCBwcm92aWRlciIpO2lmKERhdGUubm93KCktWC5jcmVhdGVkQXQ+VjEpdGhyb3cgbmV3IEkoImxvZ2luRXhwaXJlZCIsInRoZSBsb2dpbiB0b29rIHRvbyBsb25nOyBzdGFydCBhZ2FpbiIpO2xldCBRPWF3YWl0IHRoaXMuYXV0aG9yaXphdGlvblNlcnZlcigpLFo7dHJ5e1o9dyQoUSx0aGlzLmNsaWVudCwkLFguc3RhdGUpfWNhdGNoKEgpe3Rocm93IG5ldyBJKCJhdXRob3JpemF0aW9uRmFpbGVkIixILm1lc3NhZ2UpfWxldCB6PWF3YWl0IE8kKFEsdGhpcy5jbGllbnQsdGhpcy5jbGllbnRBdXRoLFosdGhpcy5yZWRpcmVjdFVyaSxYLmNvZGVWZXJpZmllcix0aGlzLnJlcXVlc3RPcHRpb25zKCkpLFc7dHJ5e1c9YXdhaXQgaiQoUSx0aGlzLmNsaWVudCx6LHtleHBlY3RlZE5vbmNlOlgubm9uY2UscmVxdWlyZUlkVG9rZW46ITB9KX1jYXRjaChIKXt0aHJvdyBuZXcgSSgidG9rZW5FeGNoYW5nZUZhaWxlZCIsSC5tZXNzYWdlKX1sZXQgSj1EMShXKTtpZihKPT09dm9pZCAwKXRocm93IG5ldyBJKCJ0b2tlbkV4Y2hhbmdlRmFpbGVkIiwibm8gSUQgdG9rZW4gaW4gdGhlIHRva2VuIHJlc3BvbnNlIik7cmV0dXJuIEp9fXZhciBlOD0yMDQ4O2Z1bmN0aW9uIE0xKCQpe3JldHVybiB0eXBlb2YgJD09PSJzdHJpbmciJiYkLmxlbmd0aDw9ZTgmJnUoJCk/JDoiLyJ9ZnVuY3Rpb24gYSgkKXtyZXR1cm4gJC5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPC9nLCImbHQ7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvIi9nLCImcXVvdDsiKS5yZXBsYWNlKC8nL2csIiYjMzk7Iil9dmFyICQ1PSJib2R5e2ZvbnQtZmFtaWx5OnN5c3RlbS11aSxzYW5zLXNlcmlmO2JhY2tncm91bmQ6IzExMTtjb2xvcjojZWVlO2Rpc3BsYXk6ZmxleDttaW4taGVpZ2h0OjEwMHZoO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO21hcmdpbjowfW1haW57bWF4LXdpZHRoOjI0cmVtO3dpZHRoOjEwMCU7cGFkZGluZzoycmVtfWgxe2ZvbnQtc2l6ZToxLjI1cmVtO21hcmdpbjowIDAgMS41cmVtfWEucHJvdmlkZXJ7ZGlzcGxheTpibG9jaztwYWRkaW5nOi43NXJlbSAxcmVtO21hcmdpbjouNXJlbSAwO2JvcmRlcjoxcHggc29saWQgIzQ0NDtib3JkZXItcmFkaXVzOi41cmVtO2NvbG9yOiNlZWU7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YS5wcm92aWRlcjpob3Zlcntib3JkZXItY29sb3I6Izg4OH1we2NvbG9yOiNiYmI7bGluZS1oZWlnaHQ6MS41fWF7Y29sb3I6IzhhYjRmOH0iO2Z1bmN0aW9uIGgkKCQsWCl7cmV0dXJuYDwhZG9jdHlwZSBodG1sPjxodG1sIGxhbmc9ImVuIj48aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+PG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEiPjx0aXRsZT4ke2EoJCl9PC90aXRsZT48c3R5bGU+JHskNX08L3N0eWxlPjwvaGVhZD48Ym9keT48bWFpbj4ke1h9PC9tYWluPjwvYm9keT48L2h0bWw+YH1mdW5jdGlvbiBrJCgkLFgpe2xldCBRPSQubWFwKCh6KT0+YDxhIGNsYXNzPSJwcm92aWRlciIgaHJlZj0iJHthKHouaHJlZil9Ij4ke2Eoei5sYWJlbCl9PC9hPmApLmpvaW4oIiIpLFo9WD09PXZvaWQgMD8iIjpgPHA+PGEgaHJlZj0iJHthKFgpfSI+U2lnbiBpbiB3aXRoIGVtYWlsIGFuZCBwYXNzd29yZDwvYT48L3A+YDtyZXR1cm4gaCQoIlNpZ24gaW4gdG8gSHlwZXJEWCIsYDxoMT5TaWduIGluIHRvIEh5cGVyRFg8L2gxPiR7UX0ke1p9YCl9dmFyIFg1PXtzdWJqZWN0TWlzc2luZzoiVGhlIGlkZW50aXR5IHByb3ZpZGVyIGRpZCBub3QgcmV0dXJuIGEgdXNlciBpZGVudGlmaWVyLiIsZW1haWxNaXNzaW5nOiJUaGUgaWRlbnRpdHkgcHJvdmlkZXIgZGlkIG5vdCByZXR1cm4gYW4gZW1haWwgYWRkcmVzcyBmb3IgeW91ciBhY2NvdW50LiIsZW1haWxJbnZhbGlkOiJZb3VyIGVtYWlsIGFkZHJlc3MgY29udGFpbnMgY2hhcmFjdGVycyBIeXBlckRYIHNpZ24taW4gZG9lcyBub3QgYWNjZXB0LiIsZW1haWxJblVzZToiQSBIeXBlckRYIGFjY291bnQgd2l0aCB5b3VyIGVtYWlsIGFkZHJlc3MgYWxyZWFkeSBiZWxvbmdzIHRvIGFub3RoZXIgc2lnbi1pbi4gQXNrIGFuIGFkbWluaXN0cmF0b3IuIixpbnN0YW5jZU5vdFJlYWR5OiJIeXBlckRYIGlzIHN0aWxsIGJlaW5nIHNldCB1cC4gVHJ5IGFnYWluIGluIGEgbWludXRlLiIsc3RvcmVVbmF2YWlsYWJsZToiSHlwZXJEWCBzaWduLWluIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlLiBUcnkgYWdhaW4gaW4gYSBtaW51dGUuIix1bmtub3duUHJvdmlkZXI6IlRoYXQgc2lnbi1pbiBwcm92aWRlciBpcyBub3QgY29uZmlndXJlZC4iLGVtYWlsTm90VmVyaWZpZWQ6IllvdXIgZW1haWwgYWRkcmVzcyBpcyBub3QgdmVyaWZpZWQgd2l0aCB0aGUgaWRlbnRpdHkgcHJvdmlkZXIuIixncm91cE5vdEFsbG93ZWQ6IllvdXIgYWNjb3VudCBpcyBub3QgaW4gYSBncm91cCB0aGF0IGlzIGFsbG93ZWQgdG8gdXNlIEh5cGVyRFguIixlbWFpbERvbWFpbk5vdEFsbG93ZWQ6IllvdXIgZW1haWwgYWRkcmVzcydzIGRvbWFpbiBpcyBub3QgYWxsb3dlZCB0byB1c2UgSHlwZXJEWC4iLG5vQWNjb3VudDoiVGhlcmUgaXMgbm8gSHlwZXJEWCBhY2NvdW50IGZvciB5b3UsIGFuZCB0aGlzIHByb3ZpZGVyIGRvZXMgbm90IGNyZWF0ZSBhY2NvdW50cy4iLHByb3ZpZGVyVW5hdmFpbGFibGU6IlRoZSBpZGVudGl0eSBwcm92aWRlciBjb3VsZCBub3QgYmUgcmVhY2hlZC4gVHJ5IGFnYWluIGluIGEgbW9tZW50LiIsbG9naW5FeHBpcmVkOiJUaGUgc2lnbi1pbiB0b29rIHRvbyBsb25nLiBTdGFydCBhZ2Fpbi4ifTtmdW5jdGlvbiBrMSgkLFgpe2xldCBRPVg1WyRdPz8iU2lnbi1pbiBmYWlsZWQuIjtyZXR1cm4gaCQoIlNpZ24taW4gZmFpbGVkIixgPGgxPlNpZ24taW4gZmFpbGVkPC9oMT48cD4ke2EoUSl9PC9wPjxwPjxhIGhyZWY9IiR7YShYKX0iPlRyeSBhZ2FpbjwvYT48L3A+YCl9dmFyIHI9cmVxdWlyZSgibm9kZTpjcnlwdG8iKTt2YXIgbSQ9MTAsdSQ9InR5cGVrcm9fb2lkY18iLFE1PTUxMjtmdW5jdGlvbiBkJCgkKXtsZXQgWD1uZXcgVVJMKCQsImh0dHA6Ly9wbGFjZWhvbGRlci5pbnZhbGlkIiksUT1YLnBhdGhuYW1lLnJlcGxhY2UoL1wvW14vXStcL2NhbGxiYWNrJC8sIiIpO3JldHVybntwYXRoOlE9PT0iIj8iLyI6USxzZWN1cmU6WC5wcm90b2NvbD09PSJodHRwczoifX1mdW5jdGlvbiBjJCgkKXtyZXR1cm5gJHt1JH0ke3IuY3JlYXRlSGFzaCgic2hhMjU2IikudXBkYXRlKCQpLmRpZ2VzdCgiYmFzZTY0dXJsIikuc2xpY2UoMCwyMil9YH1mdW5jdGlvbiBtMSgkKXtyZXR1cm4gci5jcmVhdGVIYXNoKCJzaGEyNTYiKS51cGRhdGUoJCkuZGlnZXN0KCJoZXgiKX1mdW5jdGlvbiBsJCgkKXtsZXQgWD1uZXcgTWFwO2lmKHR5cGVvZiAkIT09InN0cmluZyIpcmV0dXJuIFg7Zm9yKGxldCBRIG9mICQuc3BsaXQoIjsiKSl7bGV0IFo9US5pbmRleE9mKCI9Iik7aWYoWjw9MCljb250aW51ZTtsZXQgej1RLnNsaWNlKDAsWikudHJpbSgpO2lmKCFYLmhhcyh6KSlYLnNldCh6LFEuc2xpY2UoWisxKS50cmltKCkpfXJldHVybiBYfWZ1bmN0aW9uIHAkKCQsWCxRLFope3JldHVybmAkeyR9PSR7WH07IFBhdGg9JHtRLnBhdGh9OyBNYXgtQWdlPSR7Wn07IEh0dHBPbmx5OyBTYW1lU2l0ZT1MYXhgKyhRLnNlY3VyZT8iOyBTZWN1cmUiOiIiKX12YXIgaSQ9KCQsWCk9PnAkKCQsIiIsWCwwKTtmdW5jdGlvbiBaNSgkKXtsZXQgWD1uZXcgTWFwO2ZvcihsZXRbUSxaXW9mIGwkKCQpKWlmKFEuc3RhcnRzV2l0aCh1JCkmJlohPT0iIilYLnNldChtMShaKSxRKTtyZXR1cm4gWH1hc3luYyBmdW5jdGlvbiBhJCgkLFgsUSxaLHope2xldCBXPVtdLEo9WjUoWCk7aWYoSi5zaXplPj1tJCl7bGV0IEI9Wy4uLmF3YWl0ICQubGlzdEJ5QmluZGluZyhbLi4uSi5rZXlzKCldLG5ldyBEYXRlKHopKV0uc29ydCgoVixQKT0+Vi5jcmVhdGVkQXQtUC5jcmVhdGVkQXQpLFk9bmV3IFNldChCLm1hcCgoVik9PlYuYmluZGluZ0hhc2gpKSxGPVsuLi5KLmtleXMoKV0uZmlsdGVyKChWKT0+IVkuaGFzKFYpKSxMPUIuc2xpY2UoMCxNYXRoLm1heCgwLEIubGVuZ3RoLShtJC0xKSkpLm1hcCgoVik9PlYuYmluZGluZ0hhc2gpO2lmKEwubGVuZ3RoPjApYXdhaXQgJC5yZW1vdmVCeUJpbmRpbmcoTCk7Zm9yKGxldCBWIG9mWy4uLkYsLi4uTF0pVy5wdXNoKGkkKEouZ2V0KFYpLFopKX1sZXQgSD1yLnJhbmRvbUJ5dGVzKDMyKS50b1N0cmluZygiYmFzZTY0dXJsIik7cmV0dXJuIGF3YWl0ICQuaW5zZXJ0KHsuLi5RLGJpbmRpbmdIYXNoOm0xKEgpLGV4cGlyZXNBdDpuZXcgRGF0ZShRLmNyZWF0ZWRBdCtWMSl9KSxXLnB1c2gocCQoYyQoUS5zdGF0ZSksSCxaLFYxLzEwMDApKSxXfWFzeW5jIGZ1bmN0aW9uIG4kKCQsWCxRLFoseixXKXtpZih0eXBlb2YgUSE9PSJzdHJpbmcifHxRLmxlbmd0aD09PTB8fFEubGVuZ3RoPlE1KXJldHVybntwZW5kaW5nOnZvaWQgMCxzZXRDb29raWVzOltdfTtsZXQgSj1jJChRKSxIPWwkKFgpLmdldChKKTtpZihIPT09dm9pZCAwKXJldHVybntwZW5kaW5nOnZvaWQgMCxzZXRDb29raWVzOltdfTtsZXQgQj1baSQoSix6KV07aWYoSD09PSIiKXJldHVybntwZW5kaW5nOnZvaWQgMCxzZXRDb29raWVzOkJ9O2xldCBZPXo1KGF3YWl0ICQudGFrZShRLG0xKEgpLFosbmV3IERhdGUoVykpKTtyZXR1cm57cGVuZGluZzpZIT09dm9pZCAwJiZZLnN0YXRlPT09USYmWS5wcm92aWRlcj09PVo/WTp2b2lkIDAsc2V0Q29va2llczpCfX1mdW5jdGlvbiB6NSgkKXtpZih0eXBlb2YgJCE9PSJvYmplY3QifHwkPT09bnVsbClyZXR1cm47bGV0IFg9JDtpZih0eXBlb2YgWC5wcm92aWRlciE9PSJzdHJpbmcifHx0eXBlb2YgWC5zdGF0ZSE9PSJzdHJpbmcifHx0eXBlb2YgWC5ub25jZSE9PSJzdHJpbmcifHx0eXBlb2YgWC5jb2RlVmVyaWZpZXIhPT0ic3RyaW5nInx8dHlwZW9mIFgucmV0dXJuVG8hPT0ic3RyaW5nInx8dHlwZW9mIFguY3JlYXRlZEF0IT09Im51bWJlciJ8fCFOdW1iZXIuaXNGaW5pdGUoWC5jcmVhdGVkQXQpKXJldHVybjtyZXR1cm57cHJvdmlkZXI6WC5wcm92aWRlcixzdGF0ZTpYLnN0YXRlLG5vbmNlOlgubm9uY2UsY29kZVZlcmlmaWVyOlguY29kZVZlcmlmaWVyLHJldHVyblRvOlgucmV0dXJuVG8sY3JlYXRlZEF0OlguY3JlYXRlZEF0fX12YXIgVTE9InR5cGVrcm8tb2lkYzoiLEo1PSJ0eXBla3JvX29pZGNfaWRlbnRpdGllcyIsVzU9InR5cGVrcm9fb2lkY19wZW5kaW5nX2xvZ2lucyIsWTU9InR5cGVrcm9fb2lkY19zdGF0ZSIsTDE9InRlYW0tY2xhaW0iLEg1PTE1MDAwLEI1PTYwMDAwO2Z1bmN0aW9uIHUxKCQpe3JldHVybiAkPy5jb2RlPT09MTEwMDB9ZnVuY3Rpb24gSzUoJCl7cmV0dXJuIEMxKCQucGF0aCl9dmFyIG8kPSJBdXRoZW50aWNhdGlvbiBtZXRob2QgcGFzc3dvcmQgaXMgbm90IGFsbG93ZWQgYnkgeW91ciB0ZWFtIGFkbWluLiI7ZnVuY3Rpb24gTjEoJCl7cmV0dXJuICQuZGVmYXVsdD8/JH1mdW5jdGlvbiAkMCgkKXtsZXQgWD1yJC5jcmVhdGVSZXF1aXJlKGUkLmpvaW4oJCwiaW5kZXguanMiKSksUT0oVik9PlgoViksWj1OMShRKCJwYXNzcG9ydCIpKSx6PU4xKFEoIi4vcm91dGVycy9hcGkvcm9vdC5qcyIpKSxXPU4xKFEoIi4vbW9kZWxzL3VzZXIuanMiKSksSj1OMShRKCIuL21vZGVscy90ZWFtLmpzIikpLEg9USgiLi9jb250cm9sbGVycy90ZWFtLmpzIiksQj1RKCIuL3NldHVwRGVmYXVsdHMuanMiKSxZPVEoIi4vY29uZmlnLmpzIiksTD1bWyJwYXNzcG9ydC51c2UiLHR5cGVvZiBaPy51c2U9PT0iZnVuY3Rpb24iXSxbInBhc3Nwb3J0LnVudXNlIix0eXBlb2YgWj8udW51c2U9PT0iZnVuY3Rpb24iXSxbInBhc3Nwb3J0LmF1dGhlbnRpY2F0ZSIsdHlwZW9mIFo/LmF1dGhlbnRpY2F0ZT09PSJmdW5jdGlvbiJdLFsicGFzc3BvcnQuX3N0cmF0ZWd5KCdsb2NhbCcpIix0eXBlb2YgWj8uX3N0cmF0ZWd5PT09ImZ1bmN0aW9uIiYmdHlwZW9mIFouX3N0cmF0ZWd5KCJsb2NhbCIpPy5hdXRoZW50aWNhdGU9PT0iZnVuY3Rpb24iXSxbInJvdXRlcnMvYXBpL3Jvb3Qgcm91dGVyIixBcnJheS5pc0FycmF5KHo/LnN0YWNrKSYmdHlwZW9mIHo/LmdldD09PSJmdW5jdGlvbiJdLFsibW9kZWxzL3VzZXIiLHR5cGVvZiBXPy5maW5kT25lPT09ImZ1bmN0aW9uIiYmdHlwZW9mIFc/LmNyZWF0ZT09PSJmdW5jdGlvbiImJnR5cGVvZiBXPy51cGRhdGVPbmU9PT0iZnVuY3Rpb24iXSxbIm1vZGVscy90ZWFtIix0eXBlb2YgSj8uZmluZD09PSJmdW5jdGlvbiJdLFsiY29udHJvbGxlcnMvdGVhbS5jcmVhdGVUZWFtIix0eXBlb2YgSC5jcmVhdGVUZWFtPT09ImZ1bmN0aW9uIl0sWyJzZXR1cERlZmF1bHRzLnNldHVwVGVhbURlZmF1bHRzIix0eXBlb2YgQi5zZXR1cFRlYW1EZWZhdWx0cz09PSJmdW5jdGlvbiJdLFsiY29uZmlnLkZST05URU5EX1VSTCIsdHlwZW9mIFkuRlJPTlRFTkRfVVJMPT09InN0cmluZyJ8fFkuRlJPTlRFTkRfVVJMPT09dm9pZCAwXV0uZmlsdGVyKChbLFZdKT0+IVYpLm1hcCgoW1ZdKT0+Vik7aWYoTC5sZW5ndGg+MCl0aHJvdyBFcnJvcihgSHlwZXJEWCBob29rIHBvaW50KHMpIG5vdCBmb3VuZDogJHtMLmpvaW4oIiwgIil9YCk7cmV0dXJue3Bhc3Nwb3J0Oloscm9vdFJvdXRlcjp6LFVzZXI6VyxUZWFtOkosY3JlYXRlVGVhbTpILmNyZWF0ZVRlYW0sc2V0dXBUZWFtRGVmYXVsdHM6Qi5zZXR1cFRlYW1EZWZhdWx0cyxmcm9udGVuZFVybDpTdHJpbmcoWS5GUk9OVEVORF9VUkw/PyIiKS5yZXBsYWNlKC9cLyskLywiIiksZnJvbnRlbmRSZWRpcmVjdEJhc2U6U3RyaW5nKFkuRlJPTlRFTkRfUkVESVJFQ1RfQkFTRT8/WS5GUk9OVEVORF9VUkw/PyIiKS5yZXBsYWNlKC9cLyskLywiIil9fWZ1bmN0aW9uIEY1KCQsWCl7bGV0IFE9JC5Vc2VyLmRiLmNvbGxlY3Rpb24oVzUpLFosej0oKT0+e2lmKFo9PT12b2lkIDApWj1Qcm9taXNlLmFsbChbUS5jcmVhdGVJbmRleCh7c3RhdGU6MX0se3VuaXF1ZTohMCxuYW1lOiJzdGF0ZSJ9KSxRLmNyZWF0ZUluZGV4KHtleHBpcmVzQXQ6MX0se2V4cGlyZUFmdGVyU2Vjb25kczowLG5hbWU6ImV4cGlyeSJ9KSxRLmNyZWF0ZUluZGV4KHtiaW5kaW5nSGFzaDoxfSx7bmFtZToiYmluZGluZyJ9KV0pLnRoZW4oKCk9PntyZXR1cm59LChXKT0+e3Rocm93IFo9dm9pZCAwLFguZXJyb3IoImNvdWxkIG5vdCBjcmVhdGUgdGhlIHBlbmRpbmcgc2lnbi1pbiBpbmRleGVzOyBPSURDIHNpZ24taW4gaXMgcmVmdXNlZCB1bnRpbCB0aGV5IGV4aXN0Iix7ZXJyb3I6U3RyaW5nKFcpfSksbmV3IEkoInN0b3JlVW5hdmFpbGFibGUiLCJwZW5kaW5nIHNpZ24taW4gaW5kZXhlcyBhcmUgbm90IGluIHBsYWNlIil9KTtyZXR1cm4gWn07cmV0dXJuIHooKS5jYXRjaCgoKT0+e30pLHthc3luYyBpbnNlcnQoVyl7YXdhaXQgeigpLGF3YWl0IFEuaW5zZXJ0T25lKHsuLi5XfSl9LGFzeW5jIHRha2UoVyxKLEgsQil7cmV0dXJuIGF3YWl0IHooKSwoYXdhaXQgUS5maW5kT25lQW5kRGVsZXRlKHtzdGF0ZTpXLGJpbmRpbmdIYXNoOkoscHJvdmlkZXI6SCxleHBpcmVzQXQ6eyRndDpCfX0se2luY2x1ZGVSZXN1bHRNZXRhZGF0YTohMH0pKT8udmFsdWU/P251bGx9LGFzeW5jIGxpc3RCeUJpbmRpbmcoVyxKKXtyZXR1cm4oYXdhaXQgUS5maW5kKHtiaW5kaW5nSGFzaDp7JGluOlsuLi5XXX0sZXhwaXJlc0F0OnskZ3Q6Sn19LHtwcm9qZWN0aW9uOntfaWQ6MCxiaW5kaW5nSGFzaDoxLGNyZWF0ZWRBdDoxfX0pLnRvQXJyYXkoKSkuZmxhdE1hcCgoQik9PnR5cGVvZiBCLmJpbmRpbmdIYXNoPT09InN0cmluZyImJnR5cGVvZiBCLmNyZWF0ZWRBdD09PSJudW1iZXIiP1t7YmluZGluZ0hhc2g6Qi5iaW5kaW5nSGFzaCxjcmVhdGVkQXQ6Qi5jcmVhdGVkQXR9XTpbXSl9LGFzeW5jIHJlbW92ZUJ5QmluZGluZyhXKXthd2FpdCBRLmRlbGV0ZU1hbnkoe2JpbmRpbmdIYXNoOnskaW46Wy4uLlddfX0pfX19ZnVuY3Rpb24gRDUoJCxYLFEsWil7bGV0IHo9JC5Vc2VyLmRiLmNvbGxlY3Rpb24oSjUpLFc9JC5Vc2VyLmRiLmNvbGxlY3Rpb24oWTUpLEosSD0oKT0+e2lmKEo9PT12b2lkIDApSj1Qcm9taXNlLmFsbChbei5jcmVhdGVJbmRleCh7cHJvdmlkZXI6MSxzdWJqZWN0OjF9LHt1bmlxdWU6ITAsbmFtZToicHJvdmlkZXJfc3ViamVjdCJ9KSx6LmNyZWF0ZUluZGV4KHt1c2VySWQ6MX0se3VuaXF1ZTohMCxuYW1lOiJ1c2VyIn0pXSkudGhlbigoKT0+e3JldHVybn0sKFkpPT57dGhyb3cgSj12b2lkIDAsWi5lcnJvcigiY291bGQgbm90IGNyZWF0ZSB0aGUgaWRlbnRpdHktbGluayBpbmRleGVzOyBPSURDIHNpZ24taW4gaXMgcmVmdXNlZCB1bnRpbCB0aGV5IGV4aXN0Iix7ZXJyb3I6U3RyaW5nKFkpfSksbmV3IEkoInN0b3JlVW5hdmFpbGFibGUiLCJpZGVudGl0eS1saW5rIGluZGV4ZXMgYXJlIG5vdCBpbiBwbGFjZSIpfSk7cmV0dXJuIEp9O0goKS5jYXRjaCgoKT0+e30pO2FzeW5jIGZ1bmN0aW9uIEIoWSl7bGV0IEY9WCgpLnRlYW1JZDtpZihGIT09dm9pZCAwKXtpZihhd2FpdCAkLlRlYW0uZmluZEJ5SWQoRik9PT1udWxsKXRocm93IEVycm9yKGBjb25maWd1cmVkIHRlYW1JZCAke0Z9IGRvZXMgbm90IGV4aXN0YCk7cmV0dXJuIEZ9bGV0IEw9YXN5bmMoKT0+YXdhaXQgJC5UZWFtLmZpbmQoe30pLnNlbGVjdCgiX2lkIikubGltaXQoMikubGVhbigpLFY9YXdhaXQgTCgpO2lmKFYubGVuZ3RoPT09MSlyZXR1cm4gVlswXS5faWQudG9TdHJpbmcoKTtpZihWLmxlbmd0aD4xKXRocm93IEVycm9yKCJtb3JlIHRoYW4gb25lIEh5cGVyRFggdGVhbSBleGlzdHM7IHNldCB0ZWFtSWQgaW4gdGhlIE9JREMgY29uZmlndXJhdGlvbiIpO2lmKCFRLmNyZWF0ZVRlYW0pdGhyb3cgbmV3IEkoImluc3RhbmNlTm90UmVhZHkiLCJubyBIeXBlckRYIHRlYW0gZXhpc3RzIHlldCBhbmQgdGhpcyBwbHVnaW4gZG9lcyBub3QgY3JlYXRlIG9uZSIpO2xldCBQPShfKT0+Xy5sZW5ndGg9PT0xP19bMF0uX2lkLnRvU3RyaW5nKCk6dm9pZCAwO3RyeXthd2FpdCBXLmluc2VydE9uZSh7X2lkOkwxLGF0Om5ldyBEYXRlLGJ5Oll9KX1jYXRjaChfKXtpZighdTEoXykpdGhyb3cgXztsZXQgRT1EYXRlLm5vdygpK0g1O3doaWxlKERhdGUubm93KCk8RSl7bGV0IG49UChhd2FpdCBMKCkpO2lmKG4hPT12b2lkIDApcmV0dXJuIG47YXdhaXQgbmV3IFByb21pc2UoKHcpPT5zZXRUaW1lb3V0KHcsMjUwKSl9bGV0IHk9YXdhaXQgVy5maW5kT25lKHtfaWQ6TDF9KSxTMT15Py5hdCBpbnN0YW5jZW9mIERhdGU/eS5hdC5nZXRUaW1lKCk6MDtpZihEYXRlLm5vdygpLVMxPkI1KWF3YWl0IFcuZGVsZXRlT25lKHtfaWQ6TDEsYXQ6eT8uYXR9KTt0aHJvdyBuZXcgSSgiaW5zdGFuY2VOb3RSZWFkeSIsImFub3RoZXIgZmlyc3QgbG9naW4gaXMgY3JlYXRpbmcgdGhlIEh5cGVyRFggdGVhbSIpfWxldCBPO3RyeXtPPWF3YWl0ICQuY3JlYXRlVGVhbSh7bmFtZTpgJHtZfSdzIFRlYW1gLGNvbGxlY3RvckF1dGhlbnRpY2F0aW9uRW5mb3JjZWQ6ITB9KX1jYXRjaChfKXtsZXQgRT1QKGF3YWl0IEwoKSk7aWYoRSE9PXZvaWQgMClyZXR1cm4gRTt0aHJvdyBhd2FpdCBXLmRlbGV0ZU9uZSh7X2lkOkwxfSksX31sZXQgdj1PLl9pZC50b1N0cmluZygpO3JldHVybiBhd2FpdCAkLnNldHVwVGVhbURlZmF1bHRzKHYpLmNhdGNoKChfKT0+Wi5lcnJvcigic2V0dGluZyB1cCBkZWZhdWx0IGNvbm5lY3Rpb25zIGFuZCBzb3VyY2VzIGZvciB0aGUgbmV3IHRlYW0gZmFpbGVkIix7ZXJyb3I6U3RyaW5nKF8pfSkpLHZ9cmV0dXJue2FzeW5jIGZpbmRMaW5rZWRVc2VySWQoWSxGKXthd2FpdCBIKCk7bGV0IEw9YXdhaXQgei5maW5kT25lKHtwcm92aWRlcjpZLHN1YmplY3Q6Rn0pO3JldHVybiBMPT09bnVsbD9udWxsOlN0cmluZyhMLnVzZXJJZCl9LGFzeW5jIHVzZXJFeGlzdHMoWSl7cmV0dXJuIGF3YWl0ICQuVXNlci5maW5kQnlJZChZKSE9PW51bGx9LGFzeW5jIGZpbmRVc2VySWRCeUVtYWlsKFkpe2xldCBGPWF3YWl0ICQuVXNlci5maW5kT25lKHtlbWFpbDpZfSkuc2VsZWN0KCJfaWQiKS5sZWFuKCk7cmV0dXJuIEY9PT1udWxsP251bGw6U3RyaW5nKEYuX2lkKX0sYXN5bmMgdXNlckhhc0FueUxpbmsoWSl7cmV0dXJuIGF3YWl0IHouZmluZE9uZSh7dXNlcklkOll9KSE9PW51bGx9LGFzeW5jIGNyZWF0ZVVzZXIoWSxGKXtsZXQgTD1hd2FpdCBCKFkpO3RyeXtyZXR1cm4oYXdhaXQgJC5Vc2VyLmNyZWF0ZSh7ZW1haWw6WSxuYW1lOkYsdGVhbTpMfSkpLl9pZC50b1N0cmluZygpfWNhdGNoKFYpe2lmKHUxKFYpKXRocm93IG5ldyBwO3Rocm93IFZ9fSxhc3luYyBsaW5rKFksRil7YXdhaXQgSCgpO2xldCBMPW5ldyBEYXRlO3RyeXthd2FpdCB6LnVwZGF0ZU9uZSh7cHJvdmlkZXI6WS5wcm92aWRlcixzdWJqZWN0Olkuc3ViamVjdH0seyRzZXQ6e3VzZXJJZDpGLGVtYWlsOlkuZW1haWwsbGFzdExvZ2luQXQ6TH0sJHNldE9uSW5zZXJ0OntjcmVhdGVkQXQ6TH19LHt1cHNlcnQ6ITB9KX1jYXRjaChWKXtpZighdTEoVikpdGhyb3cgVjtsZXQgUD1hd2FpdCB6LmZpbmRPbmUoe3Byb3ZpZGVyOlkucHJvdmlkZXIsc3ViamVjdDpZLnN1YmplY3R9KTtpZihQIT09bnVsbCYmU3RyaW5nKFAudXNlcklkKT09PUYpcmV0dXJuO3Rocm93IG5ldyBwfX0sYXN5bmMgdW5saW5rKFksRil7YXdhaXQgei5kZWxldGVPbmUoe3Byb3ZpZGVyOlksc3ViamVjdDpGfSl9LGFzeW5jIHRvdWNoKFksRil7YXdhaXQgei51cGRhdGVPbmUoe3Byb3ZpZGVyOlksc3ViamVjdDpGfSx7JHNldDp7bGFzdExvZ2luQXQ6bmV3IERhdGV9fSl9fX1mdW5jdGlvbiBYMCgkLFgsUSxaPXtjcmVhdGVUZWFtOiEwfSl7bGV0IHosVyxKPSExLEg9bmV3IE1hcCxCPUQ1KCQsKCk9Pno/P3ExKCd7InByb3ZpZGVycyI6W119JyksWixRKSxZPUY1KCQsUSk7YXN5bmMgZnVuY3Rpb24gRihLLEcpe2lmKHR5cGVvZiBHIT09InN0cmluZyIpcmV0dXJuO2xldCBNPWF3YWl0IEIuZmluZExpbmtlZFVzZXJJZChLLEcpO2lmKE09PT1udWxsKXJldHVybjthd2FpdCAkLlVzZXIudXBkYXRlT25lKHtfaWQ6TX0seyRzZXQ6e2FjY2Vzc0tleTp0JC5yYW5kb21VVUlEKCl9fSksUS53YXJuKCJyb3RhdGVkIHRoZSBhY2Nlc3Mga2V5IG9mIGEgbGlua2VkIHVzZXIgdGhlIHByb3ZpZGVyIG5vIGxvbmdlciBhZG1pdHMiLHtwcm92aWRlcjpLLHVzZXJJZDpNfSl9bGV0IEw9KCk9Pno/LmFwaVBhdGhQcmVmaXg/PyIvYXBpIixWPSgpPT5gJHtMKCl9L2xvZ2luL29pZGNgLFA9KEspPT4kMShLPy5yZWRpcmVjdEJhc2VVcmwsJC5mcm9udGVuZFVybCksTz0oKT0+UCh6KSx2PSgpPT4kMSgkLmZyb250ZW5kUmVkaXJlY3RCYXNlLHo/LnJlZGlyZWN0QmFzZVVybCksXz0oSyk9PlgxKHYoKSxLKTtmdW5jdGlvbiBFKEspe3JldHVybntuYW1lOmAke1UxfSR7S31gLGF1dGhlbnRpY2F0ZShHKXtsZXQgTT1ILmdldChLKTtpZihNPT09dm9pZCAwKXt0aGlzLmZhaWwoe3JlYXNvbjoidW5rbm93blByb3ZpZGVyIn0sNDA0KTtyZXR1cm59KGFzeW5jKCk9PntsZXQgYj1HLnNlc3Npb247aWYoYj09PXZvaWQgMCl0aHJvdyBFcnJvcigiSHlwZXJEWCBzZXNzaW9uIG1pZGRsZXdhcmUgaXMgbm90IGFjdGl2ZSIpO2lmKEcucmVzPT09dm9pZCAwKXRocm93IEVycm9yKCJ0aGUgcmVxdWVzdCBoYXMgbm8gcmVzcG9uc2UgdG8gc2V0IGNvb2tpZXMgb24iKTtpZigidHlwZWtyb09pZGNQZW5kaW5nImluIGIpZGVsZXRlIGIudHlwZWtyb09pZGNQZW5kaW5nO2lmKCJ0eXBla3JvT2lkY1BlbmRpbmdMb2dpbnMiaW4gYilkZWxldGUgYi50eXBla3JvT2lkY1BlbmRpbmdMb2dpbnM7bGV0IFQ9ZCQoTS5yZWRpcmVjdFVyaSk7aWYoRy5xdWVyeS5jb2RlPT09dm9pZCAwJiZHLnF1ZXJ5LmVycm9yPT09dm9pZCAwKXtsZXR7dXJsOkswLHBlbmRpbmc6RjB9PWF3YWl0IE0uYmVnaW4oTTEoRy5xdWVyeS5yZXR1cm5UbykpO0cucmVzLmFwcGVuZCgiU2V0LUNvb2tpZSIsYXdhaXQgYSQoWSxHLmhlYWRlcnMuY29va2llLEYwLFQsRGF0ZS5ub3coKSkpLHRoaXMucmVkaXJlY3QoSzApO3JldHVybn1sZXR7cGVuZGluZzp4LHNldENvb2tpZXM6a309YXdhaXQgbiQoWSxHLmhlYWRlcnMuY29va2llLEcucXVlcnkuc3RhdGUsSyxULERhdGUubm93KCkpO2lmKGsubGVuZ3RoPjApRy5yZXMuYXBwZW5kKCJTZXQtQ29va2llIixrKTtpZih4PT09dm9pZCAwKXtRLndhcm4oIk9JREMgY2FsbGJhY2sgbWF0Y2hlZCBubyBwZW5kaW5nIHNpZ24taW4iLHtwcm92aWRlcjpLfSksdGhpcy5mYWlsKHtyZWFzb246ImxvZ2luRXhwaXJlZCJ9LDQwMCk7cmV0dXJufWxldCBsPW5ldyBVUkwoRy5vcmlnaW5hbFVybCxPKCl8fCJodHRwOi8vcGxhY2Vob2xkZXIuaW52YWxpZCIpLGExPWF3YWl0IE0uY29tcGxldGUobCx4KSxtPSQkKE0uY29uZmlnLGExKTtpZighbS5hbGxvd2VkKXtpZihRLndhcm4oIk9JREMgbG9naW4gZGVuaWVkIix7cHJvdmlkZXI6SyxyZWFzb246bS5yZWFzb259KSxtLnJlYXNvbiE9PSJzdWJqZWN0TWlzc2luZyIpYXdhaXQgRihLLGExLnN1Yik7dGhpcy5mYWlsKHtyZWFzb246bS5yZWFzb24scmV0dXJuVG86eC5yZXR1cm5Ub30sNDAzKTtyZXR1cm59bGV0IG89YXdhaXQgWCQoQixNLmNvbmZpZyxtLmlkZW50aXR5KTtpZigiZGVuaWVkImluIG8pe1Eud2FybigiT0lEQyBsb2dpbiBkZW5pZWQiLHtwcm92aWRlcjpLLHJlYXNvbjpvLmRlbmllZCxlbWFpbDptLmlkZW50aXR5LmVtYWlsfSksdGhpcy5mYWlsKHtyZWFzb246by5kZW5pZWR9LDQwMyk7cmV0dXJufWxldCBCMD1hd2FpdCAkLlVzZXIuZmluZEJ5SWQoby51c2VySWQpO1EuaW5mbygiT0lEQyBsb2dpbiIse3Byb3ZpZGVyOkssZW1haWw6bS5pZGVudGl0eS5lbWFpbCxvdXRjb21lOm8ub3V0Y29tZX0pLHRoaXMuc3VjY2VzcyhCMCx7cHJvdmlkZXI6SyxyZXR1cm5Ubzp4LnJldHVyblRvfSl9KSgpLmNhdGNoKChiKT0+e2lmKGIgaW5zdGFuY2VvZiBJKXtRLndhcm4oIk9JREMgbG9naW4gZmFpbGVkIix7cHJvdmlkZXI6SyxyZWFzb246Yi5yZWFzb24sZGV0YWlsOmIubWVzc2FnZX0pO2xldCBUPVsicHJvdmlkZXJVbmF2YWlsYWJsZSIsImluc3RhbmNlTm90UmVhZHkiLCJzdG9yZVVuYXZhaWxhYmxlIl0uaW5jbHVkZXMoYi5yZWFzb24pO3RoaXMuZmFpbCh7cmVhc29uOmIucmVhc29ufSxUPzUwMzo0MDApO3JldHVybn10aGlzLmVycm9yKGIpfSl9fX1mdW5jdGlvbiB5KEspe2xldCBHPW5ldyBNYXAsTT1QKEspO2ZvcihsZXQgVSBvZiBLLnByb3ZpZGVycyl7bGV0IGI9WDEoTSxgJHtLLmFwaVBhdGhQcmVmaXh9L2xvZ2luL29pZGMvJHtVLmlkfS9jYWxsYmFja2ApLFQ9SC5nZXQoVS5pZCk7Ry5zZXQoVS5pZCxUIT09dm9pZCAwJiZULnJlZGlyZWN0VXJpPT09YiYmSlNPTi5zdHJpbmdpZnkoVC5jb25maWcpPT09SlNPTi5zdHJpbmdpZnkoVSk/VDpuZXcgaDEoVSxiLEsuYWxsb3dJbnNlY3VyZUh0dHApKX1mb3IobGV0IFUgb2YgSC5rZXlzKCkpaWYoIUcuaGFzKFUpKSQucGFzc3BvcnQudW51c2UoYCR7VTF9JHtVfWApO2ZvcihsZXQgVSBvZiBHLmtleXMoKSkkLnBhc3Nwb3J0LnVzZShgJHtVMX0ke1V9YCxFKFUpKTtpZihIPUcsej1LLFMxKEspLEsuYWxsb3dJbnNlY3VyZUh0dHApUS53YXJuKCJhbGxvd0luc2VjdXJlSHR0cCBpcyBvbjogaXNzdWVycyBhbmQgY2FsbGJhY2tzIG1heSB1c2UgcGxhaW4gaHR0cC4gVXNlIHRoaXMgb25seSBmb3IgdGVzdHM7IGl0IHJlbW92ZXMgdGhlIFRMUyBwcm90ZWN0aW9uIHRoZSBJRC10b2tlbiBjaGVja3MgcmVseSBvbi4iKTtmb3IobGV0IFUgb2YgSC52YWx1ZXMoKSlVLmF1dGhvcml6YXRpb25TZXJ2ZXIoKS5jYXRjaCgoYik9PlEud2FybigiT0lEQyBkaXNjb3ZlcnkgZmFpbGVkOyB3aWxsIHJldHJ5IG9uIGRlbWFuZCIse3Byb3ZpZGVyOlUuY29uZmlnLmlkLGVycm9yOlN0cmluZyhiKX0pKX1mdW5jdGlvbiBTMShLKXtsZXQgRz0kMSgkLmZyb250ZW5kVXJsKTtpZihQKEspPT09IiIpe2xldCBNPSQuZnJvbnRlbmRVcmw9PT0iIj8iaXMgbm90IHNldCI6ImlzIG5vdCBhIHZhbGlkIGh0dHAocykgYmFzZSBVUkwgKGFic29sdXRlLCB3aXRob3V0IGNyZWRlbnRpYWxzLCBxdWVyeSBvciBmcmFnbWVudCkiO1Eud2FybihgSHlwZXJEWCdzIEZST05URU5EX1VSTCAke019IGFuZCByZWRpcmVjdEJhc2VVcmwgaXMgbm90IHNldDogY2FsbGJhY2sgVVJMcyBhbmQgcmVkaXJlY3RzIGFyZSByZWxhdGl2ZS4gUHJvdmlkZXJzIHJlZnVzZSBhIHJlbGF0aXZlIGNhbGxiYWNrLCBhbmQgYmVoaW5kIGEgcmV2ZXJzZSBwcm94eSBIeXBlckRYJ3MgVUkgcmV3cml0ZXMgcmVsYXRpdmUgcmVkaXJlY3RzIHRvIHRoZSBBUEkgc2VydmVyJ3MgcG9ydC5gKTtyZXR1cm59aWYoSy5yZWRpcmVjdEJhc2VVcmwhPT12b2lkIDAmJkchPT0iIil7bGV0IE09bmV3IFVSTChLLnJlZGlyZWN0QmFzZVVybCkub3JpZ2luLFU9bmV3IFVSTChHKS5vcmlnaW47aWYoTSE9PVUpUS53YXJuKCJyZWRpcmVjdEJhc2VVcmwgYW5kIEh5cGVyRFgncyBGUk9OVEVORF9VUkwgaGF2ZSBkaWZmZXJlbnQgb3JpZ2luczogc2lnbi1pbiBjb21wbGV0ZXMsIGFuZCBzZXRzIGl0cyBzZXNzaW9uIGNvb2tpZSwgb24gcmVkaXJlY3RCYXNlVXJsJ3Mgb3JpZ2luLCB0aGVuIHNlbmRzIHRoZSBicm93c2VyIHRvIEZST05URU5EX1VSTCdzLCB3aGVyZSB0aGF0IHNlc3Npb24gaXMgbm90IHNlbnQuIFRoZXkgbXVzdCBzaGFyZSBhbiBvcmlnaW4uIix7cmVkaXJlY3RCYXNlT3JpZ2luOk0sZnJvbnRlbmRPcmlnaW46VX0pfX1mdW5jdGlvbiBuKCl7bGV0IEs7dHJ5e0s9cyQucmVhZEZpbGVTeW5jKFgsInV0ZjgiKX1jYXRjaChHKXtpZighSilKPSEwLFEuZXJyb3Ioej09PXZvaWQgMD8iT0lEQyBjb25maWd1cmF0aW9uIHVucmVhZGFibGU7IG5vIHByb3ZpZGVycyBhY3RpdmUiOiJPSURDIGNvbmZpZ3VyYXRpb24gYmVjYW1lIHVucmVhZGFibGU7IGtlZXBpbmcgdGhlIHByZXZpb3VzIG9uZSIse3BhdGg6WCxlcnJvcjpTdHJpbmcoRyl9KTtyZXR1cm4hMX1pZihKKUo9ITEsUS5pbmZvKCJPSURDIGNvbmZpZ3VyYXRpb24gcmVhZGFibGUgYWdhaW4iLHtwYXRoOlh9KTtpZihLPT09VylyZXR1cm4hMTtXPUs7dHJ5e3kocTEoSykpfWNhdGNoKEcpe3JldHVybiBRLmVycm9yKHo9PT12b2lkIDA/Ik9JREMgY29uZmlndXJhdGlvbiByZWplY3RlZCBhbmQgbm9uZSBoYXMgYmVlbiBhcHBsaWVkIHNpbmNlIHN0YXJ0OyBubyBwcm92aWRlcnMgYWN0aXZlIGFuZCBwYXNzd29yZCBsb2dpbiBpcyBhbGxvd2VkIjoiT0lEQyBjb25maWd1cmF0aW9uIHJlamVjdGVkOyBrZWVwaW5nIHRoZSBwcmV2aW91cyBvbmUiLHtlcnJvcjpTdHJpbmcoRyl9KSwhMX1yZXR1cm4gUS5pbmZvKCJPSURDIGNvbmZpZ3VyYXRpb24gYXBwbGllZCIse3Byb3ZpZGVyczpbLi4uSC5rZXlzKCldLHBhc3N3b3JkTG9naW46ej8ucGFzc3dvcmRMb2dpbixwYXNzd29yZExvZ2luUGF0aDpSMSh6LFoucGFzc3dvcmRMb2dpblBhdGgpLG1heFNlc3Npb25BZ2VNczp6Py5tYXhTZXNzaW9uQWdlTXN9KSwhMH1sZXQgdz0kLnJvb3RSb3V0ZXI7ZnVuY3Rpb24gYzEoSyl7dy51c2UoSyk7bGV0IEc9dy5zdGFjay5wb3AoKTt3LnN0YWNrLnVuc2hpZnQoRyl9YzEoKEssRyxNKT0+e2xldCBVPUsuc2Vzc2lvbj8udHlwZWtyb09pZGNBdXRoO2lmKFU9PT12b2lkIDB8fEsudXNlcj09PXZvaWQgMHx8ej09PXZvaWQgMCl7TSgpO3JldHVybn1pZighKHoubWF4U2Vzc2lvbkFnZU1zPjAmJkRhdGUubm93KCktVS5hdD56Lm1heFNlc3Npb25BZ2VNcykmJkguaGFzKFUucHJvdmlkZXIpKXtNKCk7cmV0dXJufUsubG9nb3V0KChUKT0+TShUKSl9KTtsZXQgbDE9JC5wYXNzcG9ydC5fc3RyYXRlZ3koImxvY2FsIiksVzA9bDEuYXV0aGVudGljYXRlLHAxPW5ldyBXZWFrU2V0O2wxLmF1dGhlbnRpY2F0ZT1mdW5jdGlvbihHLE0pe2lmKHohPT12b2lkIDAmJiF6LnBhc3N3b3JkTG9naW4mJiFwMS5oYXMoRykpe3RoaXMuZmFpbCh7bWVzc2FnZTpvJH0pO3JldHVybn1XMC5jYWxsKHRoaXMsRyxNKX07bGV0IFkwPVsvXlwvbG9naW5cL3Bhc3N3b3JkJC8sL15cL3JlZ2lzdGVyXC9wYXNzd29yZCQvLC9eXC90ZWFtXC9zZXR1cFwvW14vXSskL10sSDA9YXN5bmMoKT0+KGF3YWl0ICQuVGVhbS5maW5kKHt9KS5zZWxlY3QoIl9pZCIpLmxpbWl0KDEpLmxlYW4oKSkubGVuZ3RoPjA7YzEoKEssRyxNKT0+e2lmKEsubWV0aG9kIT09IlBPU1QifHx6PT09dm9pZCAwfHx6LnBhc3N3b3JkTG9naW4pe00oKTtyZXR1cm59bGV0IFU9SzUoSyk7aWYoIVkwLnNvbWUoKFQpPT5ULnRlc3QoVSkpKXtNKCk7cmV0dXJufWxldCBiPSgpPT57aWYoSy5zZXNzaW9uIT09dm9pZCAwKUsuc2Vzc2lvbi5tZXNzYWdlcz1bbyRdO0cucmVkaXJlY3QoMzAzLF8oIi9sb2dpbj9lcnI9cGFzc3dvcmRBdXRoTm90QWxsb3dlZCIpKX07aWYoVSE9PSIvcmVnaXN0ZXIvcGFzc3dvcmQiKXtiKCk7cmV0dXJufXMxKEssWix7dGVhbUV4aXN0czpIMH0pLnRoZW4oKFQpPT57aWYoIVQpe2IoKTtyZXR1cm59cDEuYWRkKEspLE0oKX0sKFQpPT57US53YXJuKCJjb3VsZCBub3QgY2hlY2sgZm9yIGFuIGV4aXN0aW5nIHRlYW07IHJlZnVzaW5nIHRoZSByZWdpc3RyYXRpb24iLHtlcnJvcjpTdHJpbmcoVCl9KSxiKCl9KX0pLHcuZ2V0KCIvbG9naW4vb2lkYyIsKEssRyk9PntsZXQgTT1NMShLLnF1ZXJ5LnJldHVyblRvKSxVPVsuLi5ILnZhbHVlcygpXTtpZihVLmxlbmd0aD09PTEpe2xldCB4PVQxKFYoKSxVWzBdLmNvbmZpZy5pZCxNKTtHLnJlZGlyZWN0KDMwMixYMShPKCkseCkpO3JldHVybn1sZXQgYj1SMSh6LFoucGFzc3dvcmRMb2dpblBhdGgpLFQ9Yj09PXZvaWQgMD92b2lkIDA6XyhiKTtHLnN0YXR1cyhVLmxlbmd0aD09PTA/NTAzOjIwMCkudHlwZSgiaHRtbCIpLnNlbmQoayQoVS5tYXAoKHgpPT4oe2xhYmVsOnguY29uZmlnLmRpc3BsYXlOYW1lLGhyZWY6VDEoVigpLHguY29uZmlnLmlkLE0pfSkpLFQpKX0pO2xldCBpMT0oSyxHLE0pPT57bGV0IFU9Sy5wYXJhbXMucHJvdmlkZXI/PyIiO2lmKCFILmhhcyhVKSl7Ry5zdGF0dXMoNDA0KS50eXBlKCJodG1sIikuc2VuZChrMSgidW5rbm93blByb3ZpZGVyIixWKCkpKTtyZXR1cm59JC5wYXNzcG9ydC5hdXRoZW50aWNhdGUoYCR7VTF9JHtVfWAsKGIsVCx4KT0+e2lmKGIpe00oYik7cmV0dXJufWxldCBrPXg/P3t9O2lmKCFUKXtsZXQgbD1rLnJlYXNvbj09PSJ1bmtub3duUHJvdmlkZXIiPzQwNDpbInByb3ZpZGVyVW5hdmFpbGFibGUiLCJpbnN0YW5jZU5vdFJlYWR5Iiwic3RvcmVVbmF2YWlsYWJsZSJdLmluY2x1ZGVzKGsucmVhc29uPz8iIik/NTAzOjQwMztHLnN0YXR1cyhsKS50eXBlKCJodG1sIikuc2VuZChrMShrLnJlYXNvbj8/InVua25vd24iLFYoKSkpO3JldHVybn1LLmxvZ0luKFQsKGwpPT57aWYobCl7TShsKTtyZXR1cm59aWYoSy5zZXNzaW9uIT09dm9pZCAwKUsuc2Vzc2lvbi50eXBla3JvT2lkY0F1dGg9e3Byb3ZpZGVyOlUsYXQ6RGF0ZS5ub3coKX07Ry5yZWRpcmVjdCgzMDIsXyhNMShrLnJldHVyblRvKSkpfSl9KShLLEcsTSl9O3JldHVybiB3LmdldCgiL2xvZ2luL29pZGMvOnByb3ZpZGVyIixpMSksdy5nZXQoIi9sb2dpbi9vaWRjLzpwcm92aWRlci9jYWxsYmFjayIsaTEpLG4oKSx7cmVsb2FkOm4scHJvdmlkZXJJZHM6KCk9PlsuLi5ILmtleXMoKV19fXZhciBHNT0iVFlQRUtST19IRFhfT0lEQ19DT05GSUciLFY1PSJUWVBFS1JPX0hEWF9PSURDX1JFTE9BRF9TRUNPTkRTIixNNT0iVFlQRUtST19IRFhfT0lEQ19DUkVBVEVfVEVBTSIsUTA9IlRZUEVLUk9fSERYX09JRENfUEFTU1dPUkRfTE9HSU5fUEFUSCIsVTU9L1tcXC9dcGFja2FnZXNbXFwvXWFwaVtcXC9dYnVpbGRbXFwvXWluZGV4XC5qcyQvLGg9e2luZm86KCQsWCk9PmNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtsZXZlbDoiaW5mbyIscGx1Z2luOiJ0eXBla3JvLW9pZGMiLG1lc3NhZ2U6JCwuLi5YfSkpLHdhcm46KCQsWCk9PmNvbnNvbGUud2FybihKU09OLnN0cmluZ2lmeSh7bGV2ZWw6Indhcm4iLHBsdWdpbjoidHlwZWtyby1vaWRjIixtZXNzYWdlOiQsLi4uWH0pKSxlcnJvcjooJCxYKT0+Y29uc29sZS5lcnJvcihKU09OLnN0cmluZ2lmeSh7bGV2ZWw6ImVycm9yIixwbHVnaW46InR5cGVrcm8tb2lkYyIsbWVzc2FnZTokLC4uLlh9KSl9LEw1PTYwMDAwO2Z1bmN0aW9uIE41KCQsWCl7bGV0IFE7dHJ5e1E9ejAucmVhbHBhdGhTeW5jKGIxLmRpcm5hbWUoWCkpfWNhdGNoKEIpe2guZXJyb3IoIm5vdCBpbnN0YWxsZWQ7IGNvdWxkIG5vdCByZXNvbHZlIHRoZSBBUEkgYnVpbGQgZGlyZWN0b3J5Iix7ZXJyb3I6U3RyaW5nKEIpfSk7cmV0dXJufWxldCBaPWIxLmpvaW4oUSwicm91dGVycyIsImFwaSIsInJvb3QuanMiKSx6PUowLmRlZmF1bHQsVz16Ll9sb2FkLEo9ITEsSD1mdW5jdGlvbihZLEYsTCl7bGV0IFY9Vy5jYWxsKHRoaXMsWSxGLEwpO2lmKCFKJiZ6Ll9jYWNoZVtaXT8ubG9hZGVkPT09ITApe2lmKEo9ITAsei5fbG9hZD09PUgpei5fbG9hZD1XO3RyeXtsZXQgUD1wcm9jZXNzLmVudltNNV0hPT0iZmFsc2UiLE89UD92b2lkIDA6dDEocHJvY2Vzcy5lbnYpO2lmKCFQJiZPPT09dm9pZCAwKWguaW5mbygidGhpcyBwbHVnaW4gZG9lcyBub3QgY3JlYXRlIHRoZSBIeXBlckRYIHRlYW06IE9JREMgc2lnbi1pbiB3YWl0cyB1bnRpbCB0aGUgdGVhbSBleGlzdHMsIGFuZCB3aXRoIHBhc3N3b3JkTG9naW46IGZhbHNlIGZpcnN0LXJ1biByZWdpc3RyYXRpb24gaXMgcmVmdXNlZCIpO2Vsc2UgaWYoTyE9PXZvaWQgMCYmUDEoTy5wYXNzd29yZEZpbGUpPT09dm9pZCAwKWgud2FybigiaW5pdGlhbC11c2VyIGJvb3RzdHJhcCBwYXNzd29yZCBmaWxlIGlzIGFic2VudCBvciBlbXB0eTsgd2l0aCBwYXNzd29yZExvZ2luOiBmYWxzZSwgZmlyc3QtcnVuIHJlZ2lzdHJhdGlvbiBpcyByZWZ1c2VkIHVudGlsIGl0IGFwcGVhcnMiLHtwYXNzd29yZEZpbGU6Ty5wYXNzd29yZEZpbGV9KTtsZXQgdj1wcm9jZXNzLmVudltRMF0sXz12IT09dm9pZCAwJiZ1KHYpP3Y6dm9pZCAwO2lmKHYhPT12b2lkIDAmJl89PT12b2lkIDApaC53YXJuKCJpZ25vcmluZyBhIHBhc3N3b3JkIGxvZ2luIHBhdGggdGhhdCBpcyBub3QgYSBzYW1lLW9yaWdpbiBwYXRoIix7ZW52OlEwfSk7bGV0IEU9WDAoJDAoUSksJCxoLHtjcmVhdGVUZWFtOlAsLi4uTyE9PXZvaWQgMCYme2Jvb3RzdHJhcDpPfSwuLi5fIT09dm9pZCAwJiZ7cGFzc3dvcmRMb2dpblBhdGg6X319KSx5PU51bWJlcihwcm9jZXNzLmVudltWNV0/PyIxNSIpO3NldEludGVydmFsKCgpPT5FLnJlbG9hZCgpLE1hdGgubWF4KDEsTnVtYmVyLmlzRmluaXRlKHkpP3k6MTUpKjEwMDApLnVucmVmKCksaC5pbmZvKCJpbnN0YWxsZWQiLHtwcm92aWRlcnM6RS5wcm92aWRlcklkcygpfSl9Y2F0Y2goUCl7aC5lcnJvcigibm90IGluc3RhbGxlZDsgSHlwZXJEWCBjb250aW51ZXMgd2l0aG91dCBPSURDIix7ZXJyb3I6U3RyaW5nKFApfSl9fXJldHVybiBWfTt6Ll9sb2FkPUgsc2V0VGltZW91dCgoKT0+e2lmKCFKKWguZXJyb3IoIkh5cGVyRFggbmV2ZXIgbG9hZGVkIGl0cyByb290IHJvdXRlcjsgdGhlIHBsdWdpbiB3YXMgbm90IGluc3RhbGxlZCIse3Jvb3RSb3V0ZXJQYXRoOlp9KX0sTDUpLnVucmVmKCl9dmFyIGQxPXByb2Nlc3MuZW52W0c1XSxaMD1wcm9jZXNzLmFyZ3ZbMV0/PyIiO2lmKGQxIT09dm9pZCAwJiZkMS5sZW5ndGg+MCYmVTUudGVzdChaMCkpTjUoZDEsWjApOwo=';
|
|
8
8
|
/** SHA-256 of the decoded bundle; changes whenever the plugin does. */
|
|
9
|
-
export const HYPERDX_OIDC_PLUGIN_SHA256 = '
|
|
9
|
+
export const HYPERDX_OIDC_PLUGIN_SHA256 = 'd4f1128eaf2fbeb869e7515cb6c480ba1046f5e1906715a4252107c1f5f94734';
|
|
10
10
|
/** Size of the decoded bundle in bytes. */
|
|
11
|
-
export const HYPERDX_OIDC_PLUGIN_BYTES =
|
|
11
|
+
export const HYPERDX_OIDC_PLUGIN_BYTES = 56702;
|
|
12
12
|
/** Hash of the inputs the bundle was built from (see the --check mode of the build script). */
|
|
13
|
-
export const HYPERDX_OIDC_PLUGIN_INPUTS_SHA256 = '
|
|
13
|
+
export const HYPERDX_OIDC_PLUGIN_INPUTS_SHA256 = '17e73700066533d0047f69de5a3f99271798a1af52c4836e98cf31cf6dcf4052';
|
|
14
14
|
//# sourceMappingURL=plugin-bundle.generated.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-bundle.generated.js","sourceRoot":"","sources":["../../../../src/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,gEAAgE;AAEhE;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GACrC,
|
|
1
|
+
{"version":3,"file":"plugin-bundle.generated.js","sourceRoot":"","sources":["../../../../src/factories/clickstack/hyperdx-oidc/plugin-bundle.generated.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,gEAAgE;AAEhE;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GACrC,s1zEAAs1zE,CAAC;AAEz1zE,uEAAuE;AACvE,MAAM,CAAC,MAAM,0BAA0B,GAAW,kEAAkE,CAAC;AAErH,2CAA2C;AAC3C,MAAM,CAAC,MAAM,yBAAyB,GAAW,KAAK,CAAC;AAEvD,+FAA+F;AAC/F,MAAM,CAAC,MAAM,iCAAiC,GAAW,kEAAkE,CAAC"}
|
|
@@ -383,6 +383,58 @@ export declare const DEFAULT_CLICKSTACK_INITIAL_USER_PASSWORD_KEY = "HYPERDX_INI
|
|
|
383
383
|
* with a future upstream field.
|
|
384
384
|
*/
|
|
385
385
|
export declare const CLICKSTACK_BOOTSTRAP_MARKER_COLLECTION = "typekro_bootstrap";
|
|
386
|
+
/**
|
|
387
|
+
* The CEL rule the generated CRD carries on `spec.clickhouse.host`: a
|
|
388
|
+
* SYNTACTIC pre-check. A bracketed host may hold only hex digits, `.` and at
|
|
389
|
+
* least one `:`; any other host only ASCII letters, digits, `.`, `-` and `_`.
|
|
390
|
+
* That refuses every scheme, port, path, userinfo, whitespace, backslash,
|
|
391
|
+
* percent-encoding and non-ASCII host. It does not parse IPv6 or normalise
|
|
392
|
+
* IPv4 (Kubernetes' CEL IP library needs a newer API server than TypeKro
|
|
393
|
+
* requires), so `[:::]` and `127.1` pass admission.
|
|
394
|
+
* {@link validateClickStackClickhouseHost} (render time) and the seed's runtime
|
|
395
|
+
* check are the authoritative ones.
|
|
396
|
+
*
|
|
397
|
+
* KRO carries it into the CRD only when it creates the CRD fresh (see the KRO
|
|
398
|
+
* caveat in the docs).
|
|
399
|
+
*/
|
|
400
|
+
export declare const CLICKSTACK_CLICKHOUSE_HOST_VALIDATION_RULE: string;
|
|
401
|
+
/**
|
|
402
|
+
* Check a concrete `clickhouse.host` by what breaks the `http://` / `tcp://`
|
|
403
|
+
* URLs it is built into, with a reason a person can act on. Accepts a short
|
|
404
|
+
* name, an FQDN (with or without a trailing dot), an IPv4 address and a
|
|
405
|
+
* bracketed IPv6 address, in any case.
|
|
406
|
+
*
|
|
407
|
+
* A bracketed host must be an IPv6 address by `net.isIPv6`. Any other host
|
|
408
|
+
* must be ASCII letters, digits, `.`, `-` and `_` only (so no `\`, which URL
|
|
409
|
+
* parsers read as a path separator, no percent-encoding and no non-ASCII),
|
|
410
|
+
* and must survive WHATWG URL parsing unchanged
|
|
411
|
+
* (`new URL('http://<host>/').hostname` equals the host, lower-cased), which
|
|
412
|
+
* refuses shorthand IPv4 such as `127.1`. Each of those would make consumers
|
|
413
|
+
* reach a different host from the one checked.
|
|
414
|
+
* The seed runs the same checks at runtime ({@link CLICKSTACK_CLICKHOUSE_HOST_URL_CHECK_SOURCE}).
|
|
415
|
+
*
|
|
416
|
+
* @returns A reason the host is unusable, or `undefined` when it is valid
|
|
417
|
+
*/
|
|
418
|
+
export declare function validateClickStackClickhouseHost(host: unknown): string | undefined;
|
|
419
|
+
/**
|
|
420
|
+
* The seed's runtime host check, as mongosh source: given the connection URL
|
|
421
|
+
* the CronJob carries (`http://<host>:<port>`), the reason its host would
|
|
422
|
+
* break the connection, or `null`. The same checks as
|
|
423
|
+
* {@link validateClickStackClickhouseHost}, with mongosh's Node `net` and
|
|
424
|
+
* `URL` (a unit test holds the two to one sample set). It exists because KRO
|
|
425
|
+
* 0.9.2 never adds the CRD rule to a CRD it already created, and the CRD rule
|
|
426
|
+
* is only syntactic anyway.
|
|
427
|
+
*/
|
|
428
|
+
export declare const CLICKSTACK_CLICKHOUSE_HOST_URL_CHECK_SOURCE: string;
|
|
429
|
+
/** Name of the HyperDX Team the bootstrap creates when `teamName` is not set. */
|
|
430
|
+
export declare const DEFAULT_CLICKSTACK_TEAM_NAME = "ClickStack";
|
|
431
|
+
/**
|
|
432
|
+
* Resolve the build-time `teamName`: `undefined` means "leave the name alone"
|
|
433
|
+
* (only with `initialUser`, where HyperDX's registration names the Team).
|
|
434
|
+
*
|
|
435
|
+
* @throws Error when the name is empty or longer than HyperDX accepts (100)
|
|
436
|
+
*/
|
|
437
|
+
export declare function resolveClickStackTeamName(context: string, teamName: string | undefined, hasInitialUser: boolean): string | undefined;
|
|
386
438
|
/** `_id` of the marker document recording that initial-user bootstrap is done. */
|
|
387
439
|
export declare const CLICKSTACK_INITIAL_USER_MARKER_ID = "initial-user";
|
|
388
440
|
/**
|
|
@@ -545,6 +597,13 @@ export declare function resolveClickStackInitialUser(context: string, chartSecre
|
|
|
545
597
|
* from {@link clickStackInitialUserVersionValidationRule}, so a consumer who
|
|
546
598
|
* sets an unaudited version on the custom resource at apply time is rejected by
|
|
547
599
|
* ADMISSION, where there is no build to fail.
|
|
600
|
+
*
|
|
601
|
+
* KRO CAVEAT. KRO 0.9.2 compares no `x-kubernetes-validations` when it
|
|
602
|
+
* reconciles a CRD, so it adds that rule only to a CRD it creates fresh (or
|
|
603
|
+
* patches for some other, compared change), never to one that predates the
|
|
604
|
+
* rule. The Team-defaults seed therefore re-checks the chart version at
|
|
605
|
+
* runtime (`CLICKSTACK_CHART_VERSION`); `initialUser` and `hyperdxOidc` have
|
|
606
|
+
* only the build-time and CRD halves.
|
|
548
607
|
*/
|
|
549
608
|
export declare const CLICKSTACK_INITIAL_USER_VALIDATED_CHART_VERSIONS: readonly ["3.2.0"];
|
|
550
609
|
/** HyperDX appVersion the registration contract above was verified against. */
|
|
@@ -563,11 +622,34 @@ export declare function isClickStackInitialUserValidatedChartVersion(version: st
|
|
|
563
622
|
* This is the KRO-mode half of the allowlist: the rule becomes an
|
|
564
623
|
* `x-kubernetes-validations` entry on the field, so the API server refuses a CR
|
|
565
624
|
* carrying an unaudited version instead of admitting it and leaving the
|
|
566
|
-
* CronJob to patch `teams.apiKey` on a schema nobody has read.
|
|
625
|
+
* CronJob to patch `teams.apiKey` on a schema nobody has read. Only on CRDs KRO
|
|
626
|
+
* creates fresh: see the KRO caveat on
|
|
627
|
+
* {@link CLICKSTACK_INITIAL_USER_VALIDATED_CHART_VERSIONS}.
|
|
567
628
|
*
|
|
568
629
|
* @returns A CEL expression over `self`, the submitted `spec.version`
|
|
569
630
|
*/
|
|
570
631
|
export declare function clickStackInitialUserVersionValidationRule(): string;
|
|
632
|
+
/** Options for the one-time seed of a HyperDX Team's connection and sources. */
|
|
633
|
+
export interface ClickStackTeamDefaultsOptions {
|
|
634
|
+
/**
|
|
635
|
+
* The seed writes documents in HyperDX 2.35.0's own schema, so it is refused
|
|
636
|
+
* on a chart version outside
|
|
637
|
+
* {@link CLICKSTACK_INITIAL_USER_VALIDATED_CHART_VERSIONS}, by three checks:
|
|
638
|
+
*
|
|
639
|
+
* - direct mode: a build-time throw for a concrete `spec.version`;
|
|
640
|
+
* - KRO mode: a CEL rule on the CRD's `spec.version`, present only on CRDs
|
|
641
|
+
* KRO creates fresh (KRO 0.9.2 never adds a validation rule to an
|
|
642
|
+
* existing CRD; see the KRO caveat in the docs);
|
|
643
|
+
* - both modes: a runtime check in the Team-bootstrap CronJob against the
|
|
644
|
+
* release's chart version (`CLICKSTACK_CHART_VERSION`), which seeds
|
|
645
|
+
* nothing on an unaudited one. This is the guard that holds on existing
|
|
646
|
+
* KRO CRDs.
|
|
647
|
+
*
|
|
648
|
+
* `true` disables all three. Set it once you have checked the
|
|
649
|
+
* `connections` / `sources` schema of a newer chart yourself.
|
|
650
|
+
*/
|
|
651
|
+
allowUnvalidatedChartVersion?: boolean;
|
|
652
|
+
}
|
|
571
653
|
/** Shared build-time options for both bootstrap variants. */
|
|
572
654
|
interface ClickStackBuildOptionsBase {
|
|
573
655
|
/**
|
|
@@ -618,6 +700,29 @@ interface ClickStackBuildOptionsBase {
|
|
|
618
700
|
* re-reads at runtime. See {@link ClickStackHyperdxOidcOptions}.
|
|
619
701
|
*/
|
|
620
702
|
hyperdxOidc?: ClickStackHyperdxOidcOptions;
|
|
703
|
+
/**
|
|
704
|
+
* Name of the HyperDX Team (1–100 characters). Default
|
|
705
|
+
* {@link DEFAULT_CLICKSTACK_TEAM_NAME} for the Team the bootstrap creates;
|
|
706
|
+
* with `initialUser`, HyperDX names the Team and it is renamed only when this
|
|
707
|
+
* is set. A rename made in HyperDX afterwards is kept.
|
|
708
|
+
*/
|
|
709
|
+
teamName?: string;
|
|
710
|
+
/**
|
|
711
|
+
* Seed an empty Team's ClickHouse connection and log/trace/metric/session
|
|
712
|
+
* sources, once. The connection is the one HyperDX's own registration
|
|
713
|
+
* creates, from the same values and the same password.
|
|
714
|
+
*
|
|
715
|
+
* - Inline credentials: default ON (TypeKro owns the connection).
|
|
716
|
+
* - `secretValues`: default OFF, since the values fragment may replace
|
|
717
|
+
* `defaultConnections` and the CronJob cannot see it; `true` or an
|
|
718
|
+
* options object seeds TypeKro's typed ClickHouse topology.
|
|
719
|
+
*
|
|
720
|
+
* `false` turns it off; so do build-time `values` that replace the chart's
|
|
721
|
+
* `defaultConnections`, `defaultSources` or `useExistingConfigSecret`. Only
|
|
722
|
+
* on audited chart versions, like `initialUser` (see
|
|
723
|
+
* {@link ClickStackTeamDefaultsOptions}).
|
|
724
|
+
*/
|
|
725
|
+
teamDefaults?: boolean | ClickStackTeamDefaultsOptions;
|
|
621
726
|
}
|
|
622
727
|
/** Build-time options for inline credentials with internal Mongo. */
|
|
623
728
|
export type ClickStackInlineInternalMongoBuildOptions = ClickStackBuildOptionsBase & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/factories/clickstack/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/factories/clickstack/types.ts"],"names":[],"mappings":"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"}
|