sonamu 0.7.10 → 0.7.11
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/database/puri.d.ts +17 -1
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +47 -1
- package/dist/database/puri.types.d.ts +28 -0
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +2 -3
- package/dist/database/upsert-builder.d.ts +3 -1
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +19 -4
- package/dist/naite/naite-reporter.d.ts +7 -4
- package/dist/naite/naite-reporter.d.ts.map +1 -1
- package/dist/naite/naite-reporter.js +45 -21
- package/dist/template/implementations/model.template.js +2 -2
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +4 -2
- package/dist/types/types.d.ts +1 -0
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +4 -1
- package/dist/utils/console-util.js +2 -2
- package/package.json +3 -3
- package/src/database/puri.ts +80 -0
- package/src/database/puri.types.ts +33 -2
- package/src/database/upsert-builder.ts +27 -9
- package/src/naite/naite-reporter.ts +51 -20
- package/src/template/implementations/model.template.ts +1 -1
- package/src/template/zod-converter.ts +3 -0
- package/src/types/types.ts +3 -0
- package/src/utils/console-util.ts +1 -1
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri.types.ts는 다양한 타입을 사용하고 있습니다. */
|
|
2
|
-
export { };
|
|
1
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri.types.ts는 다양한 타입을 사용하고 있습니다. */ export { };
|
|
3
2
|
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJpLnR5cGVzLnRz64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUZvcmVpZ25LZXlzLCBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHR5cGUgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8g64K067aAIO2DgOyehSDtgqQgKOuplO2DgOuNsOydtO2EsClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG50eXBlIEZ1bGx0ZXh0S2V5ID0gXCJfX2Z1bGx0ZXh0X19cIjtcbnR5cGUgVmlydHVhbEtleSA9IFwiX192aXJ0dWFsX19cIjtcbnR5cGUgTGVmdEpvaW5lZEtleSA9IFwiX19sZWZ0Sm9pbmVkX19cIjtcbnR5cGUgSGFzRGVmYXVsdCA9IFwiX19oYXNEZWZhdWx0X19cIjtcbnR5cGUgR2VuZXJhdGVkS2V5ID0gXCJfX2dlbmVyYXRlZF9fXCI7XG5cbnR5cGUgSW50ZXJuYWxUeXBlS2V5cyA9IEZ1bGx0ZXh0S2V5IHwgVmlydHVhbEtleSB8IExlZnRKb2luZWRLZXkgfCBIYXNEZWZhdWx0IHwgR2VuZXJhdGVkS2V5O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8g7YOA7J6FIOycoO2LuOumrO2LsFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8g7YWM7J2067iU66qFIO2DgOyehVxuZXhwb3J0IHR5cGUgVGFibGVOYW1lPFRTY2hlbWE+ID0ga2V5b2YgVFNjaGVtYSAmIHN0cmluZztcblxuLy8gdmlydHVhbCDsu6zrn7wg7YOA7J6FIOy2lOy2nFxudHlwZSBWaXJ0dWFsS2V5czxUPiA9IFQgZXh0ZW5kcyB7IFtLIGluIFZpcnR1YWxLZXldOiByZWFkb25seSAoaW5mZXIgVilbXSB9ID8gViAmIHN0cmluZyA6IG5ldmVyO1xuXG4vLyB2aXJ0dWFsIOy7rOufvCDsoJzqsbBcbnR5cGUgU3RyaXBWaXJ0dWFsPFQ+ID0gT21pdDxULCBWaXJ0dWFsS2V5czxUPj47XG5cbi8vIExFRlQgSk9JTiDrp4jsu6QgLSBudWxsYWJsZSBGS+uhnCDsobDsnbjrkJwg7YWM7J2067iUXG4vLyDsnbQg66eI7Luk64qUIG51bGxhYmxlIEZLICsgbGVmdEpvaW4g7KGw7ZWp7JeQ7ISc66eMIOu2meyKteuLiOuLpC5cbi8vIGpvaW4gKyBGSyBudWxsYWJsZSAtPiDslYgg67aZ7J2MXG4vLyBqb2luICsgRksgbm9uLW51bGxhYmxlIC0+IOyViCDrtpnsnYxcbi8vIGxlZnRKb2luICsgRksgbm9uLW51bGxhYmxlIC0+IOyViCDrtpnsnYxcbi8vIGxlZnRKb2luICsgRksgbnVsbGFibGUgLT4g67aZ7J2MIVxuZXhwb3J0IHR5cGUgTGVmdEpvaW5lZE1hcmtlciA9IHsgW0sgaW4gTGVmdEpvaW5lZEtleV06IHRydWUgfTtcblxuLy8g66mU7YOA642w7J207YSwIO2VhOuTnCDsoJzsmbjtlZwg7Iuk7KCcIOyXlO2LsO2LsCDsu6zrn7xcbmV4cG9ydCB0eXBlIENvbHVtbktleXM8VD4gPSBFeGNsdWRlPGtleW9mIFN0cmlwVmlydHVhbDxUPiwgSW50ZXJuYWxUeXBlS2V5cz4gJiBzdHJpbmc7XG5cbi8vIHZpcnR1YWwg7Lus65+8IOygnOqxsCDtm4QgX19mdWxsdGV4dF9fIOycoOyngFxuZXhwb3J0IHR5cGUgUHVyaVRhYmxlPFQ+ID0gT21pdDxTdHJpcFZpcnR1YWw8VD4sIFZpcnR1YWxLZXk+O1xuXG4vLyDrgrTrtoAg7YOA7J6FIO2CpCDsoJzsmbggKOyLpOygnCDsu6zrn7zrp4wg64Ko6rmAKVxuZXhwb3J0IHR5cGUgT21pdEludGVybmFsVHlwZUtleXM8VD4gPSBPbWl0PFQsIEludGVybmFsVHlwZUtleXM+O1xuXG4vLyBUVGFibGVz7J2YIOuqqOuToCDthYzsnbTruJTsl5DshJwg7IKs7JqpIOqwgOuKpe2VnCDsu6zrn7wg6rK966GcXG5leHBvcnQgdHlwZSBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwge1xuICAgICAgW1RBbGlhcyBpbiBrZXlvZiBUVGFibGVzXTogYCR7VEFsaWFzICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFRhYmxlc1tUQWxpYXNdPn1gO1xuICAgIH1ba2V5b2YgVFRhYmxlc11cbiAgfCAoSXNTaW5nbGVLZXk8VFRhYmxlcz4gZXh0ZW5kcyB0cnVlXG4gICAgICA/IENvbHVtbktleXM8VFRhYmxlc1trZXlvZiBUVGFibGVzXT4gLy8g64uo7J28IO2FjOydtOu4lOydtOuptCDsu6zrn7zrqoXrp4zrj4Qg7ZeI7JqpXG4gICAgICA6IG5ldmVyKTtcblxuLy8g7Iir7J6QIO2DgOyehSDsu6zrn7zrp4wg7LaU7Lac7ZWY64qUIOycoO2LuOumrO2LsCDtg4DsnoVcbnR5cGUgTnVtZXJpY0NvbHVtbktleXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50IHwgbnVsbCB8IHVuZGVmaW5lZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF0gJlxuICBzdHJpbmc7XG5cbi8vIFRUYWJsZXPsnZgg66qo65OgIO2FjOydtOu4lOyXkOyEnCDsiKvsnpAg7YOA7J6FIOy7rOufvOunjCDstpTstpxcbmV4cG9ydCB0eXBlIE51bWVyaWNDb2x1bW5zPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwge1xuICAgICAgW1RBbGlhcyBpbiBrZXlvZiBUVGFibGVzXTogYCR7VEFsaWFzICYgc3RyaW5nfS4ke051bWVyaWNDb2x1bW5LZXlzPFRUYWJsZXNbVEFsaWFzXT59YDtcbiAgICB9W2tleW9mIFRUYWJsZXNdXG4gIHwgKElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZVxuICAgICAgPyBOdW1lcmljQ29sdW1uS2V5czxUVGFibGVzW2tleW9mIFRUYWJsZXNdPiAvLyDri6jsnbwg7YWM7J2067iU7J2066m0IOy7rOufvOuqheunjOuPhCDtl4jsmqlcbiAgICAgIDogbmV2ZXIpO1xuXG4vLyBHcm91cCBCeSwgT3JkZXIgQnksIEhhdmluZyDrk7Hsl5DshJwg7ISg7YOdIOqwgOuKpe2VnCDsu6zrn7xcbmV4cG9ydCB0eXBlIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFRSZXN1bHQgPSBhbnk+ID1cbiAgfCBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+XG4gIHwgYCR7a2V5b2YgVFJlc3VsdCAmIHN0cmluZ31gO1xuXG4vLyBTZWxlY3Qg6rCSIO2DgOyehSDtmZXsnqUgKOuLqOydvCDsu6zrn7wg65iQ64qUIFNRTCDtkZztmITsi50pXG5leHBvcnQgdHlwZSBTZWxlY3RWYWx1ZTxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPVxuICB8IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz5cbiAgfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcImRhdGVcIj47XG5cbi8vIOykkeyyqSBTZWxlY3Qg6rCd7LK0IO2DgOyehSAo7J6s6reA7KCBKVxuLy8g7JiIOiB7IHBhcmVudDogeyBpZDogXCJwYXJlbnQuaWRcIiwgbmFtZTogXCJwYXJlbnQubmFtZVwiIH0gfVxuZXhwb3J0IHR5cGUgTmVzdGVkU2VsZWN0T2JqZWN0PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgW2tleTogc3RyaW5nXTogU2VsZWN0VmFsdWU8VFRhYmxlcz4gfCBOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcz47XG59O1xuXG4vLyBTZWxlY3Qg6rCd7LK0IO2DgOyehSAoZmxhdCDrmJDripQg7KSR7LKpIO2XiOyaqSlcbmV4cG9ydCB0eXBlIFNlbGVjdE9iamVjdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcz47XG5cbi8vIOqwkuydtCDspJHssqkg6rCd7LK07J247KeAIO2MkOuzhO2VmOuKlCDtl6ztjbwg7YOA7J6FXG50eXBlIElzTmVzdGVkT2JqZWN0PFQ+ID0gVCBleHRlbmRzIHN0cmluZ1xuICA/IGZhbHNlXG4gIDogVCBleHRlbmRzIFNxbEV4cHJlc3Npb248YW55PlxuICAgID8gZmFsc2VcbiAgICA6IFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICA/IHRydWVcbiAgICAgIDogZmFsc2U7XG5cbi8vIOy7rOufvOydtCBudWxsYWJsZeyduOyngCDtmZXsnbggKOyKpO2CpOuniOyXkOyEnCDsp4HsoJEg7LaU7LacKVxuLy8g7JiIOiBJc051bGxhYmxlQ29sdW1uPFRUYWJsZXMsIFwiZW1wbG95ZWVzLmRlcGFydG1lbnRfaWRcIj4g4oaSIGRlcGFydG1lbnRfaWTqsIAgbnVtYmVyIHwgbnVsbOydtOuptCB0cnVlXG5leHBvcnQgdHlwZSBJc051bGxhYmxlQ29sdW1uPFxuICBUVGFibGVzLFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBudWxsIGV4dGVuZHMgVFRhYmxlc1tUQWxpYXNdW1RDb2x1bW5dXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGZhbHNlXG4gICAgICA6IGZhbHNlXG4gICAgOiBmYWxzZVxuICA6IGZhbHNlO1xuXG4vLyBGSyBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw66W4IOuniOy7pCDtg4DsnoUg6rKw7KCVXG4vLyBudWxsYWJsZSBGS+uhnCBsZWZ0Sm9pbiDihpIgTGVmdEpvaW5lZE1hcmtlciAo6rCd7LK0IOyekOyytOqwgCBudWxs7J28IOyImCDsnojsnYwpXG4vLyBub24tbnVsbCBGS+uhnCBsZWZ0Sm9pbiDihpIg66eI7LukIOyXhuydjCAo67aA66qo6rCAIOyeiOycvOuptCDsnpDsi53rj4Qg67CY65Oc7IucIOyeiOydjClcbmV4cG9ydCB0eXBlIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFBhdGggZXh0ZW5kcyBzdHJpbmc+ID0gSXNOdWxsYWJsZUNvbHVtbjxcbiAgVFRhYmxlcyxcbiAgUGF0aFxuPiBleHRlbmRzIHRydWVcbiAgPyBMZWZ0Sm9pbmVkTWFya2VyXG4gIDoge307XG5cbi8vIOyjvOyWtOynhCDthYzsnbTruJTsnbQgRksgbnVsbGFibGXroZwgbGVmdEpvaW4g65CcIO2FjOydtOu4lOyduOyngCDtmZXsnbjtlanri4jri6QuXG4vLyDsgqzsi6QgTGVmdEpvaW5NYXJrZXLqsIAg67aZ7JeI64qU7KeAIO2ZleyduO2VmOuKlOqyjCDri6TsnoXri4jri6QuXG4vLyDsnbQg66eI7Luk64qUIEZLIG51bGxhYmxlICsgbGVmdEpvaW4g7KGw7ZWp7JeQ7ISc66eMIOu2meyKteuLiOuLpC5cbnR5cGUgSXNOdWxsYWJsZUpvaW5lZFRhYmxlPFRUYWJsZXMsIFRhYmxlS2V5PiA9IFRhYmxlS2V5IGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICA/IFRUYWJsZXNbVGFibGVLZXldIGV4dGVuZHMgTGVmdEpvaW5lZE1hcmtlclxuICAgID8gdHJ1ZSAvLyBMZWZ0Sm9pbmVkTWFya2Vy6rCAIOyeiOycvOuptCBudWxsYWJsZVxuICAgIDogZmFsc2VcbiAgOiBmYWxzZTtcblxuLy8g6rK966GcIOyhsO2VqSDtl6ztjbwgKHByZWZpeOqwgCDsl4bsnLzrqbQga2V566eMLCDsnojsnLzrqbQgcHJlZml4X19rZXkpXG50eXBlIEpvaW5QYXRoPFByZWZpeCBleHRlbmRzIHN0cmluZywgS2V5IGV4dGVuZHMgc3RyaW5nPiA9IFByZWZpeCBleHRlbmRzIFwiXCJcbiAgPyBLZXlcbiAgOiBgJHtQcmVmaXh9X18ke0tleX1gO1xuXG4vLyBTZWxlY3Qg6rKw6rO8IO2DgOyeheydhCDstpTroaDtlbTso7zripQg7Lmc6rWs7J6F64uI64ukLlxuLy8g7J20IO2DgOyeheydgCBQdXJp7J2YIHNlbGVjdCwgYXBwZW5kU2VsZWN07JeQ7IScIFRSZXN1bHTroZwg7IKs7Jqp65Cp64uI64ukLlxuLy9cbi8vIFNjaGVtYeulvCDsnb3slrTshJwgRkvsnZggbnVsbGFiaWxpdHnsl5Ag65Sw6528IGpvaW7rkJwg6rCd7LK07J2YIO2DgOyeheydhCDstpTroaDtlbTso7zripQg6riw64ql7J20IOyeiOyKteuLiOuLpC5cbi8vIOydtOqyjCDrrLTsiqgg7IaM66as64OQPyBGS+qwgCBudWxsYWJsZeyduOuNsCBsZWZ0Sm9pbuuQmOyXiOuLpOuptCwg7ZW064u5IOqwneyytOuKlCBudWxsYWJsZSDtlbTslbwg7ZWo7J2EIO2DgOyehSDstpTroaDsnLzroZwg67CY7JiB7ZW07KSA64uk64qUIOqyg+yeheuLiOuLpC5cbi8vIOuwmOuptCBGS+qwgCBub24tbnVsbGFibGXsnbTqsbDrgpgg6re464OlIGpvaW7snLzroZwg7J207Ja07KGM64uk66m0IO2VtOuLuSDqsJ3ssrTripQgbm9uLW51bGxhYmxl7ZWgIOqygeuLiOuLpC5cbi8vIOusvOuhoCDqsJ3ssrQg64K067aA7J2YIG51bGxhYmlsaXR564qUIOuYkCDrs4TqsJzroZwg7LaU66Gg65Cp64uI64ukLiBcbi8vIFxuLy8g7JWE656Y7JeQ64+EIFBhcnNlU2VsZWN0T2JqZWN0V2l0aFBhdGjrpbwg67mE66Gv7ZW0IEV4dHJhY3RDb2x1bW5UeXBlLCBFeHRyYWN0Q29sdW1uVHlwZVJhdyDrk7HsnZgg7YOA7J6F7J20IOyeiOyKteuLiOuLpC5cbi8vIOydtOuTpOydmCDsl63tlaDsnYAg64uk7J2M6rO8IOqwmeyKteuLiOuLpDpcbi8vIC0gUGFyc2UqOiDqsJ3ssrQg66CI67Ko7JeQ7IScIOykkeyyqSDqtazsobDrpbwg7Iic7ZqM7ZWY66mwIOqwneyytOyXkCB8IG51bGzsnYQg67aZ7J287KeAIOqysOygle2VqeuLiOuLpC5cbi8vIC0gRXh0cmFjdCo6IO2VhOuTnCDroIjrsqjsl5DshJwgXCJ0YWJsZS5jb2x1bW5cIiDqsr3roZzroZzrtoDthLAg7Iuk7KCcIO2DgOyeheydhCDstpTstpztlanri4jri6QuXG4vL1xuLy8g7JiI7IucOlxuLy8gLnNlbGVjdCh7XG4vLyAgIGlkOiBcInVzZXJzLmlkXCIsICAgICAgICAgICAvLyDihpAgRXh0cmFjdENvbHVtblR5cGXsnZgg6rKw6rO864qUIG51bWJlcuyeheuLiOuLpC5cbi8vICAgZGVwYXJ0bWVudDogeyAgICAgICAgICAgICAvLyDihpAgUGFyc2VTZWxlY3RPYmplY3RJbm5lcuyXkCDsnZjtlbQgbnVsbGFibGUg6rCd7LK066GcIOy2lOuhoOuQqeuLiOuLpC5cbi8vICAgICBpZDogXCJkZXBhcnRtZW50LmlkXCIsICAgIC8vIOKGkCBFeHRyYWN0Q29sdW1uVHlwZVJhd+ydmCDqsrDqs7zripQgbnVtYmVy7J6F64uI64ukLlxuLy8gICAgIG5hbWU6IFwiZGVwYXJ0bWVudC5uYW1lXCIgLy8g4oaQIEV4dHJhY3RDb2x1bW5UeXBlUmF37J2YIOqysOqzvOuKlCBzdHJpbmfsnoXri4jri6QuXG4vLyAgIH1cbi8vIH0pXG5leHBvcnQgdHlwZSBQYXJzZVNlbGVjdE9iamVjdDxcbiAgVFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFRTZWxlY3QgZXh0ZW5kcyBTZWxlY3RPYmplY3Q8VFRhYmxlcz4sXG4+ID0gUGFyc2VTZWxlY3RPYmplY3RXaXRoUGF0aDxUVGFibGVzLCBUU2VsZWN0LCBcIlwiPjtcblxuLy8g6rK966Gc66W8IOy2lOygge2VmOuptOyEnCBTZWxlY3Qg6rKw6rO8IO2DgOyeheydhCDstpTroaDtlanri4jri6QuXG50eXBlIFBhcnNlU2VsZWN0T2JqZWN0V2l0aFBhdGg8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+LFxuICBQcmVmaXggZXh0ZW5kcyBzdHJpbmcsXG4+ID0gRXhwYW5kPHtcbiAgW0sgaW4ga2V5b2YgVFNlbGVjdF06IFRTZWxlY3RbS10gZXh0ZW5kcyBTcWxFeHByZXNzaW9uPGluZmVyIFI+XG4gICAgPyBSIGV4dGVuZHMgXCJzdHJpbmdcIlxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogUiBleHRlbmRzIFwibnVtYmVyXCJcbiAgICAgICAgPyBudW1iZXJcbiAgICAgICAgOiBSIGV4dGVuZHMgXCJib29sZWFuXCJcbiAgICAgICAgICA/IGJvb2xlYW5cbiAgICAgICAgICA6IFIgZXh0ZW5kcyBcImRhdGVcIlxuICAgICAgICAgICAgPyBEYXRlXG4gICAgICAgICAgICA6IG5ldmVyXG4gICAgOiBJc05lc3RlZE9iamVjdDxUU2VsZWN0W0tdPiBleHRlbmRzIHRydWVcbiAgICAgID8gVFNlbGVjdFtLXSBleHRlbmRzIE5lc3RlZFNlbGVjdE9iamVjdDxUVGFibGVzPlxuICAgICAgICA/IElzTnVsbGFibGVKb2luZWRUYWJsZTxUVGFibGVzLCBKb2luUGF0aDxQcmVmaXgsIEsgJiBzdHJpbmc+PiBleHRlbmRzIHRydWUgLy8g7KO87Ja07KeEIO2FjOydtOu4lOydtCBGSyBudWxsYWJsZeyXkCBsZWZ0Sm9pbuuQmOyXiOuKlOyngCDsl6zrtoDsl5Ag65Sw6528IHNlbGVjdCDqsrDqs7wg6rCd7LK07J2YIO2DgOyeheydtCDri6zrnbzsp5Hri4jri6QuXG4gICAgICAgICAgPyBFeHBhbmQ8UGFyc2VTZWxlY3RPYmplY3RJbm5lcjxUVGFibGVzLCBUU2VsZWN0W0tdLCBKb2luUGF0aDxQcmVmaXgsIEsgJiBzdHJpbmc+Pj4gfCBudWxsIC8vIOunjOyVvSDtlbTri7ntlZzri6TrqbQg7ZW064u5IOqwneyytCDsnpDssrTripQgbnVsbGFibGUg7ZWY66mwLFxuICAgICAgICAgIDogRXhwYW5kPFBhcnNlU2VsZWN0T2JqZWN0SW5uZXI8VFRhYmxlcywgVFNlbGVjdFtLXSwgSm9pblBhdGg8UHJlZml4LCBLICYgc3RyaW5nPj4+IC8vIOq3uOugh+yngCDslYrri6TrqbQgbm9uLW51bGxhYmxlIO2VqeuLiOuLpC5cbiAgICAgICAgOiBuZXZlclxuICAgICAgOiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBUU2VsZWN0W0tdICYgc3RyaW5nPjtcbn0+O1xuXG4vLyDspJHssqkg6rCd7LK0IOuCtOu2gOyaqSAtIGxlZnRKb2luIG51bGxhYmxl7J2EIOqwneyytCDroIjrsqjsl5DshJwg7J2066+4IOyymOumrO2WiOycvOuvgOuhnCDtlYTrk5zripQg7JuQ67O4IO2DgOyeheydhCDsgqzsmqntlanri4jri6QuXG4vLyBQYXJzZVNlbGVjdE9iamVjdFdpdGhQYXRo7JmAIOqxsOydmCDrj5nsnbztlZjrgpgsIOuniOyngOunieyXkCBFeHRyYWN0Q29sdW1uVHlwZSDrjIDsi6AgRXh0cmFjdENvbHVtblR5cGVSYXfrpbwg7IKs7Jqp7ZWY7JesXG4vLyDtlYTrk5wg66CI67Ko7JeQ7IScIOykkeuzteycvOuhnCB8IG51bGzsnbQg7LaU6rCA65CY64qUIOqyg+ydhCDrsKnsp4Dtlanri4jri6QuXG50eXBlIFBhcnNlU2VsZWN0T2JqZWN0SW5uZXI8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+LFxuICBQcmVmaXggZXh0ZW5kcyBzdHJpbmcsXG4+ID0gRXhwYW5kPHtcbiAgW0sgaW4ga2V5b2YgVFNlbGVjdF06IFRTZWxlY3RbS10gZXh0ZW5kcyBTcWxFeHByZXNzaW9uPGluZmVyIFI+XG4gICAgPyBSIGV4dGVuZHMgXCJzdHJpbmdcIlxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogUiBleHRlbmRzIFwibnVtYmVyXCJcbiAgICAgICAgPyBudW1iZXJcbiAgICAgICAgOiBSIGV4dGVuZHMgXCJib29sZWFuXCJcbiAgICAgICAgICA/IGJvb2xlYW5cbiAgICAgICAgICA6IFIgZXh0ZW5kcyBcImRhdGVcIlxuICAgICAgICAgICAgPyBEYXRlXG4gICAgICAgICAgICA6IG5ldmVyXG4gICAgOiBJc05lc3RlZE9iamVjdDxUU2VsZWN0W0tdPiBleHRlbmRzIHRydWVcbiAgICAgID8gVFNlbGVjdFtLXSBleHRlbmRzIE5lc3RlZFNlbGVjdE9iamVjdDxUVGFibGVzPlxuICAgICAgICA/IElzTnVsbGFibGVKb2luZWRUYWJsZTxUVGFibGVzLCBKb2luUGF0aDxQcmVmaXgsIEsgJiBzdHJpbmc+PiBleHRlbmRzIHRydWVcbiAgICAgICAgICA/IEV4cGFuZDxQYXJzZVNlbGVjdE9iamVjdElubmVyPFRUYWJsZXMsIFRTZWxlY3RbS10sIEpvaW5QYXRoPFByZWZpeCwgSyAmIHN0cmluZz4+PiB8IG51bGxcbiAgICAgICAgICA6IEV4cGFuZDxQYXJzZVNlbGVjdE9iamVjdElubmVyPFRUYWJsZXMsIFRTZWxlY3RbS10sIEpvaW5QYXRoPFByZWZpeCwgSyAmIHN0cmluZz4+PlxuICAgICAgICA6IG5ldmVyXG4gICAgICA6IEV4dHJhY3RDb2x1bW5UeXBlUmF3PFRUYWJsZXMsIFRTZWxlY3RbS10gJiBzdHJpbmc+OyAvLyBsZWZ0Sm9pbiBudWxsYWJsZSDrrLTsi5xcbn0+O1xuXG4vLyDsu6zrn7wg6rK966Gc7JeQ7IScIO2DgOyeheydhCDstpTstpztlanri4jri6QuIExlZnRKb2luZWRNYXJrZXLqsIAg7J6I7Jy866m0IHwgbnVsbOydhCDstpTqsIDtlanri4jri6QuXG4vLyDstZzsg4HsnIQgc2VsZWN0IO2VhOuTnOyXkOyEnCDsgqzsmqnrkKnri4jri6QuXG5leHBvcnQgdHlwZSBFeHRyYWN0Q29sdW1uVHlwZTxcbiAgVFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFBhdGggZXh0ZW5kcyBzdHJpbmcsXG4+ID0gUGF0aCBleHRlbmRzIGAke2luZmVyIFRBbGlhc30uJHtpbmZlciBUQ29sdW1ufWBcbiAgPyBUQWxpYXMgZXh0ZW5kcyBrZXlvZiBUVGFibGVzXG4gICAgPyBUQ29sdW1uIGV4dGVuZHMga2V5b2YgVFRhYmxlc1tUQWxpYXNdXG4gICAgICA/IFRUYWJsZXNbVEFsaWFzXSBleHRlbmRzIExlZnRKb2luZWRNYXJrZXJcbiAgICAgICAgPyBUVGFibGVzW1RBbGlhc11bVENvbHVtbl0gfCBudWxsIC8vIExFRlQgSk9JTiAobnVsbGFibGUgRkspIOKGkiBudWxsYWJsZVxuICAgICAgICA6IFRUYWJsZXNbVEFsaWFzXVtUQ29sdW1uXSAvLyBJTk5FUiBKT0lOIOuYkOuKlCBub24tbnVsbCBGSyBsZWZ0Sm9pbiDihpIgbm9uLW51bGxhYmxlXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlclxuICA6IElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZVxuICAgID8gUGF0aCBleHRlbmRzIGtleW9mIFRUYWJsZXNba2V5b2YgVFRhYmxlc11cbiAgICAgID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXVtQYXRoXVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG5cbi8vIOy7rOufvCDqsr3roZzsl5DshJwg7YOA7J6F7J2EIOy2lOy2nO2VqeuLiOuLpC4gbGVmdEpvaW4g7Jes67aA7JmAIOq0gOqzhOyXhuydtCDsm5Drs7gg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbi8vIOykkeyyqSDqsJ3ssrQg64K067aAIO2VhOuTnOyXkOyEnCDsgqzsmqnrkKnri4jri6QuICjqsJ3ssrQg66CI67Ko7JeQ7IScIOydtOuvuCB8IG51bGwg7LKY66as6rCAIOyZhOujjOuQmOyXiOycvOuvgOuhnClcbnR5cGUgRXh0cmFjdENvbHVtblR5cGVSYXc8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBUVGFibGVzW1RBbGlhc11bVENvbHVtbl0gLy8gbGVmdEpvaW4g7Jes67aA7JmAIOq0gOqzhOyXhuydtCDsm5Drs7gg7YOA7J6FXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlclxuICA6IElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZVxuICAgID8gUGF0aCBleHRlbmRzIGtleW9mIFRUYWJsZXNba2V5b2YgVFRhYmxlc11cbiAgICAgID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXVtQYXRoXVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXI7XG5cbi8vIFdoZXJlIOyhsOqxtCDqsJ3ssrQg7YOA7J6FXG4vLyDsmIg6IHsgXCJ1LmlkXCI6IDEsIFwidS5zdGF0dXNcIjogXCJhY3RpdmVcIiB9XG5leHBvcnQgdHlwZSBXaGVyZUNvbmRpdGlvbjxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtrZXkgaW4gQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPl0/OiBFeHRyYWN0Q29sdW1uVHlwZTxUVGFibGVzLCBrZXkgJiBzdHJpbmc+O1xufTtcblxuLy8gRnVsbHRleHQgaW5kZXgg7Lus65+8IOy2lOy2nCDtg4DsnoVcbmV4cG9ydCB0eXBlIEZ1bGx0ZXh0Q29sdW1uczxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSB7XG4gIFtUQWxpYXMgaW4ga2V5b2YgVFRhYmxlc106IFRUYWJsZXNbVEFsaWFzXSBleHRlbmRzIHtcbiAgICBbSyBpbiBGdWxsdGV4dEtleV06IHJlYWRvbmx5IChpbmZlciBDb2wpW107XG4gIH1cbiAgICA/IENvbCBleHRlbmRzIHN0cmluZ1xuICAgICAgPyBgJHtUQWxpYXMgJiBzdHJpbmd9LiR7Q29sfWBcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBUVGFibGVzXTtcblxuLy8g67mE6rWQIOyXsOyCsOyekFxuZXhwb3J0IHR5cGUgQ29tcGFyaXNvbk9wZXJhdG9yID0gXCI9XCIgfCBcIj5cIiB8IFwiPj1cIiB8IFwiPFwiIHwgXCI8PVwiIHwgXCI8PlwiIHwgXCIhPVwiO1xuLy8g7KGw6rG0IOyXsOyCsOyekDog67mE6rWQIOyXsOyCsOyekCArIO2MqO2EtCDrp6Tsua0g7Jew7IKw7J6QXG5leHBvcnQgdHlwZSBXaGVyZU9wZXJhdG9yID0gQ29tcGFyaXNvbk9wZXJhdG9yIHwgXCJsaWtlXCIgfCBcIm5vdCBsaWtlXCI7XG5cbi8vIFNRTCBFeHByZXNzaW9uIO2DgOyehSDsoJXsnZhcbmV4cG9ydCB0eXBlIFNxbEV4cHJlc3Npb248VCBleHRlbmRzIFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcImRhdGVcIj4gPSB7XG4gIF90eXBlOiBcInNxbF9leHByZXNzaW9uXCI7IC8vIOuYkOuKlCBcImNvbXB1dGVkX3ZhbHVlXCJcbiAgX3JldHVybjogVDtcbiAgX3NxbDogc3RyaW5nO1xufTtcblxuLy8g6rKw6rO8IO2DgOyehSDqsIDrj4XshLHsnYQg7JyE7ZWcIO2DgOyehSDtmZXsnqVcbmV4cG9ydCB0eXBlIEV4cGFuZDxUPiA9IFQgZXh0ZW5kcyBhbnlbXVxuICA/IHsgW0sgaW4ga2V5b2YgVFswXV06IFRbMF1bS10gfVtdIC8vIOuwsOyXtOydtOuptCDssqsg67KI7Ke4IOyalOyGjOulvCBFeHBhbmTtlZjqs6Ag67Cw7Je066GcIOqwkOyMiFxuICA6IFQgZXh0ZW5kcyBvYmplY3RcbiAgICA/IHsgW0sgaW4ga2V5b2YgVF06IFRbS10gfVxuICAgIDogVDtcblxudHlwZSBJc1NpbmdsZUtleTxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBrZXlvZiBUVGFibGVzIGV4dGVuZHMgaW5mZXIgS1xuICA/IEsgZXh0ZW5kcyBrZXlvZiBUVGFibGVzXG4gICAgPyBrZXlvZiBUVGFibGVzIGV4dGVuZHMgSyAvLyDsl63rsKntlqUg7LK07YGs66GcIOuLqOydvCDtgqQg7ZmV7J24XG4gICAgICA/IHRydWVcbiAgICAgIDogZmFsc2VcbiAgICA6IGZhbHNlXG4gIDogZmFsc2U7XG5cbmV4cG9ydCB0eXBlIFNpbmdsZVRhYmxlVmFsdWU8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID1cbiAgSXNTaW5nbGVLZXk8VFRhYmxlcz4gZXh0ZW5kcyB0cnVlID8gVFRhYmxlc1trZXlvZiBUVGFibGVzXSA6IG5ldmVyO1xuXG4vLyBfX2hhc0RlZmF1bHRfX+yXkCDtj6ztlajrkJwg7YKk65Ok7J2EIFB1cmlUYWJsZTxUPuydmCDtgqTroZwg7KCc7ZWcXG50eXBlIEhhc0RlZmF1bHRLZXlzPFQ+ID0gVCBleHRlbmRzIHsgX19oYXNEZWZhdWx0X186IHJlYWRvbmx5IChpbmZlciBLKVtdIH1cbiAgPyBFeHRyYWN0PEssIGtleW9mIFB1cmlUYWJsZTxUPj5cbiAgOiBuZXZlcjtcblxuLy8gX19nZW5lcmF0ZWRfX+yXkCDtj6ztlajrkJwg7YKk65OkIChJTlNFUlQg7IucIOygnOyZuO2VtOyVvCDtlagpXG50eXBlIEdlbmVyYXRlZEtleXM8VD4gPSBUIGV4dGVuZHMgeyBfX2dlbmVyYXRlZF9fOiByZWFkb25seSAoaW5mZXIgSylbXSB9XG4gID8gRXh0cmFjdDxLLCBrZXlvZiBQdXJpVGFibGU8VD4+XG4gIDogbmV2ZXI7XG5cbi8vIEluc2VydCDtg4DsnoU6IOuplO2DgOuNsOydtO2EsCDsoJzqsbAg7ZuELCBfX2hhc0RlZmF1bHRfXyDsu6zrn7zrk6Trp4wgb3B0aW9uYWzroZwg7LKY66asLCBfX2dlbmVyYXRlZF9fIOy7rOufvOydgCDsmYTsoITtnogg7KCc7Jm4XG5leHBvcnQgdHlwZSBJbnNlcnREYXRhPFQ+ID0gT21pdDxcbiAgUHVyaVRhYmxlPFQ+LFxuICBJbnRlcm5hbFR5cGVLZXlzIHwgSGFzRGVmYXVsdEtleXM8VD4gfCBHZW5lcmF0ZWRLZXlzPFQ+XG4+ICYge1xuICBbSyBpbiBIYXNEZWZhdWx0S2V5czxUPl0/OiBQdXJpVGFibGU8VD5bS107XG59O1xuXG4vLyBJbnNlcnQgUmVzdWx0IO2DgOyehVxuZXhwb3J0IHR5cGUgSW5zZXJ0UmVzdWx0ID0gUGljazxRdWVyeVJlc3VsdDxhbnk+LCBcImNvbW1hbmRcIiB8IFwicm93Q291bnRcIiB8IFwicm93c1wiIHwgXCJvaWRcIj47XG5cbi8vIFN1YnNldFF1ZXJ566W8IOychO2VnCDtg4DsnoUg7Jyg7Yu466as7YuwXG50eXBlIEV4dHJhY3RUVGFibGVzPFQgZXh0ZW5kcyBQdXJpPGFueSwgYW55LCBhbnk+PiA9IFQgZXh0ZW5kcyBQdXJpPGFueSwgaW5mZXIgVFRhYmxlcywgYW55PlxuICA/IFRUYWJsZXNcbiAgOiBuZXZlcjtcbmV4cG9ydCB0eXBlIFVuaW9uRXh0cmFjdGVkVFRhYmxlczxcbiAgU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBTdWJzZXRRdWVyaWVzIGV4dGVuZHMgUmVjb3JkPFxuICAgIFN1YnNldEtleSxcbiAgICAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IFB1cmk8YW55LCBhbnksIGFueT5cbiAgPixcbj4gPSB7XG4gIFtLIGluIFN1YnNldEtleV06IEV4dHJhY3RUVGFibGVzPFJldHVyblR5cGU8U3Vic2V0UXVlcmllc1tLXT4+O1xufVtTdWJzZXRLZXldO1xuXG4vLyBPTiBDT05GTElDVCDrjIDsg4Eg7YOA7J6FXG4vLyAtIOuLqOydvCDsu6zrn7w6IFwiZW1haWxcIlxuLy8gLSDrs7XsiJgg7Lus65+8OiBbXCJ1c2VyX2lkXCIsIFwicHJvZHVjdF9pZFwiXVxuZXhwb3J0IHR5cGUgT25Db25mbGljdFRhcmdldCA9IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4vLyBPTiBDT05GTElDVCDslaHshZgg7YOA7J6FXG4vLyAtIFwibm90aGluZ1wiOiBETyBOT1RISU5HXG4vLyAtIHsgdXBkYXRlOiBbLi4uXSB9OiBETyBVUERBVEVcbmV4cG9ydCB0eXBlIE9uQ29uZmxpY3RBY3Rpb248VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9XG4gIHwgXCJub3RoaW5nXCJcbiAgfCB7XG4gICAgICB1cGRhdGU6XG4gICAgICAgIHwgQXZhaWxhYmxlQ29sdW1uczxUVGFibGVzPltdIC8vIOuwsOyXtCDtmJXtg5wgLSBbXCJuYW1lXCIsIFwiZW1haWxcIl1cbiAgICAgICAgfCBXaGVyZUNvbmRpdGlvbjxUVGFibGVzPjsgLy8g6rCd7LK0IO2Yle2DnCAtIHsgbmFtZTogXCJKb2huXCIsIGNvdW50OiBQdXJpLnJhd051bWJlciguLi4pIH1cbiAgICB9O1xuXG4vLyBGSyDsu6zrn7zrqoUg7LaU7LacIOycoO2LuOumrO2LsCDtg4DsnoUgLSBEYXRhYmFzZUZvcmVpZ25LZXlzIO2ZnOyaqVxuZXhwb3J0IHR5cGUgRm9yZWlnbktleUNvbHVtbnM8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4gPVxuICBUVGFibGUgZXh0ZW5kcyBrZXlvZiBEYXRhYmFzZUZvcmVpZ25LZXlzID8gRGF0YWJhc2VGb3JlaWduS2V5c1tUVGFibGVdIDogbmV2ZXI7XG5cbi8vIFVuaW9u7J2EIEludGVyc2VjdGlvbuycvOuhnCDrs4DtmZjtlZjripQg7Jyg7Yu466as7YuwXG50eXBlIFVuaW9uVG9JbnRlcnNlY3Rpb248VT4gPSAoVSBleHRlbmRzIGFueSA/IChrOiBVKSA9PiB2b2lkIDogbmV2ZXIpIGV4dGVuZHMgKGs6IGluZmVyIEkpID0+IHZvaWRcbiAgPyBJXG4gIDogbmV2ZXI7XG5cbi8vIFNlbGVjdEFsbCDsi5wg66qo65OgIOyhsOyduOuQnCDthYzsnbTruJTsnZgg7Lus65+8IO2PrO2VqFxuZXhwb3J0IHR5cGUgU2VsZWN0QWxsUmVzdWx0PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IFVuaW9uVG9JbnRlcnNlY3Rpb248XG4gIHtcbiAgICBbSyBpbiBrZXlvZiBUVGFibGVzXTogVFRhYmxlc1tLXSBleHRlbmRzIGluZmVyIFRcbiAgICAgID8gVCBleHRlbmRzIExlZnRKb2luZWRNYXJrZXJcbiAgICAgICAgPyBQYXJ0aWFsPE9taXRJbnRlcm5hbFR5cGVLZXlzPFQ+PiAvLyBMRUZUIEpPSU7snYAgbnVsbGFibGUsIOuplO2DgOuNsOydtO2EsCDsoJzqsbBcbiAgICAgICAgOiBPbWl0SW50ZXJuYWxUeXBlS2V5czxUPiAvLyBJTk5FUiBKT0lO7J2AIG5vbi1udWxsYWJsZSwg66mU7YOA642w7J207YSwIOygnOqxsFxuICAgICAgOiBuZXZlcjtcbiAgfVtrZXlvZiBUVGFibGVzXVxuPjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxzRkFBc0YsR0F3V3RGLGdDQUFnQztBQUNoQyxXQVFFIn0=
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJpLnR5cGVzLnRz64qUIOuLpOyWke2VnCDtg4DsnoXsnYQg7IKs7Jqp7ZWY6rOgIOyeiOyKteuLiOuLpC4gKi9cblxuaW1wb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZUZvcmVpZ25LZXlzLCBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBQdXJpIH0gZnJvbSBcIi4vcHVyaVwiO1xuaW1wb3J0IHR5cGUgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8g64K067aAIO2DgOyehSDtgqQgKOuplO2DgOuNsOydtO2EsClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG50eXBlIEZ1bGx0ZXh0S2V5ID0gXCJfX2Z1bGx0ZXh0X19cIjtcbnR5cGUgVmlydHVhbEtleSA9IFwiX192aXJ0dWFsX19cIjtcbnR5cGUgTGVmdEpvaW5lZEtleSA9IFwiX19sZWZ0Sm9pbmVkX19cIjtcbnR5cGUgSGFzRGVmYXVsdCA9IFwiX19oYXNEZWZhdWx0X19cIjtcbnR5cGUgR2VuZXJhdGVkS2V5ID0gXCJfX2dlbmVyYXRlZF9fXCI7XG5cbnR5cGUgSW50ZXJuYWxUeXBlS2V5cyA9IEZ1bGx0ZXh0S2V5IHwgVmlydHVhbEtleSB8IExlZnRKb2luZWRLZXkgfCBIYXNEZWZhdWx0IHwgR2VuZXJhdGVkS2V5O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8g7YOA7J6FIOycoO2LuOumrO2LsFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLy8g7YWM7J2067iU66qFIO2DgOyehVxuZXhwb3J0IHR5cGUgVGFibGVOYW1lPFRTY2hlbWE+ID0ga2V5b2YgVFNjaGVtYSAmIHN0cmluZztcblxuLy8gdmlydHVhbCDsu6zrn7wg7YOA7J6FIOy2lOy2nFxudHlwZSBWaXJ0dWFsS2V5czxUPiA9IFQgZXh0ZW5kcyB7IFtLIGluIFZpcnR1YWxLZXldOiByZWFkb25seSAoaW5mZXIgVilbXSB9ID8gViAmIHN0cmluZyA6IG5ldmVyO1xuXG4vLyB2aXJ0dWFsIOy7rOufvCDsoJzqsbBcbnR5cGUgU3RyaXBWaXJ0dWFsPFQ+ID0gT21pdDxULCBWaXJ0dWFsS2V5czxUPj47XG5cbi8vIExFRlQgSk9JTiDrp4jsu6QgLSBudWxsYWJsZSBGS+uhnCDsobDsnbjrkJwg7YWM7J2067iUXG4vLyDsnbQg66eI7Luk64qUIG51bGxhYmxlIEZLICsgbGVmdEpvaW4g7KGw7ZWp7JeQ7ISc66eMIOu2meyKteuLiOuLpC5cbi8vIGpvaW4gKyBGSyBudWxsYWJsZSAtPiDslYgg67aZ7J2MXG4vLyBqb2luICsgRksgbm9uLW51bGxhYmxlIC0+IOyViCDrtpnsnYxcbi8vIGxlZnRKb2luICsgRksgbm9uLW51bGxhYmxlIC0+IOyViCDrtpnsnYxcbi8vIGxlZnRKb2luICsgRksgbnVsbGFibGUgLT4g67aZ7J2MIVxuZXhwb3J0IHR5cGUgTGVmdEpvaW5lZE1hcmtlciA9IHsgW0sgaW4gTGVmdEpvaW5lZEtleV06IHRydWUgfTtcblxuLy8g66mU7YOA642w7J207YSwIO2VhOuTnCDsoJzsmbjtlZwg7Iuk7KCcIOyXlO2LsO2LsCDsu6zrn7xcbmV4cG9ydCB0eXBlIENvbHVtbktleXM8VD4gPSBFeGNsdWRlPGtleW9mIFN0cmlwVmlydHVhbDxUPiwgSW50ZXJuYWxUeXBlS2V5cz4gJiBzdHJpbmc7XG5cbi8vIHZpcnR1YWwg7Lus65+8IOygnOqxsCDtm4QgX19mdWxsdGV4dF9fIOycoOyngFxuZXhwb3J0IHR5cGUgUHVyaVRhYmxlPFQ+ID0gT21pdDxTdHJpcFZpcnR1YWw8VD4sIFZpcnR1YWxLZXk+O1xuXG4vLyDrgrTrtoAg7YOA7J6FIO2CpCDsoJzsmbggKOyLpOygnCDsu6zrn7zrp4wg64Ko6rmAKVxuZXhwb3J0IHR5cGUgT21pdEludGVybmFsVHlwZUtleXM8VD4gPSBPbWl0PFQsIEludGVybmFsVHlwZUtleXM+O1xuXG4vLyBUVGFibGVz7J2YIOuqqOuToCDthYzsnbTruJTsl5DshJwg7IKs7JqpIOqwgOuKpe2VnCDsu6zrn7wg6rK966GcXG5leHBvcnQgdHlwZSBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwge1xuICAgICAgW1RBbGlhcyBpbiBrZXlvZiBUVGFibGVzXTogYCR7VEFsaWFzICYgc3RyaW5nfS4ke0NvbHVtbktleXM8VFRhYmxlc1tUQWxpYXNdPn1gO1xuICAgIH1ba2V5b2YgVFRhYmxlc11cbiAgfCAoSXNTaW5nbGVLZXk8VFRhYmxlcz4gZXh0ZW5kcyB0cnVlXG4gICAgICA/IENvbHVtbktleXM8VFRhYmxlc1trZXlvZiBUVGFibGVzXT4gLy8g64uo7J28IO2FjOydtOu4lOydtOuptCDsu6zrn7zrqoXrp4zrj4Qg7ZeI7JqpXG4gICAgICA6IG5ldmVyKTtcblxuLy8g7Iir7J6QIO2DgOyehSDsu6zrn7zrp4wg7LaU7Lac7ZWY64qUIOycoO2LuOumrO2LsCDtg4DsnoVcbnR5cGUgTnVtZXJpY0NvbHVtbktleXM8VD4gPSB7XG4gIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50IHwgbnVsbCB8IHVuZGVmaW5lZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF0gJlxuICBzdHJpbmc7XG5cbi8vIFRUYWJsZXPsnZgg66qo65OgIO2FjOydtOu4lOyXkOyEnCDsiKvsnpAg7YOA7J6FIOy7rOufvOunjCDstpTstpxcbmV4cG9ydCB0eXBlIE51bWVyaWNDb2x1bW5zPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIHwge1xuICAgICAgW1RBbGlhcyBpbiBrZXlvZiBUVGFibGVzXTogYCR7VEFsaWFzICYgc3RyaW5nfS4ke051bWVyaWNDb2x1bW5LZXlzPFRUYWJsZXNbVEFsaWFzXT59YDtcbiAgICB9W2tleW9mIFRUYWJsZXNdXG4gIHwgKElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZVxuICAgICAgPyBOdW1lcmljQ29sdW1uS2V5czxUVGFibGVzW2tleW9mIFRUYWJsZXNdPiAvLyDri6jsnbwg7YWM7J2067iU7J2066m0IOy7rOufvOuqheunjOuPhCDtl4jsmqlcbiAgICAgIDogbmV2ZXIpO1xuXG4vLyBHcm91cCBCeSwgT3JkZXIgQnksIEhhdmluZyDrk7Hsl5DshJwg7ISg7YOdIOqwgOuKpe2VnCDsu6zrn7xcbmV4cG9ydCB0eXBlIFJlc3VsdEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sIFRSZXN1bHQgPSBhbnk+ID1cbiAgfCBBdmFpbGFibGVDb2x1bW5zPFRUYWJsZXM+XG4gIHwgYCR7a2V5b2YgVFJlc3VsdCAmIHN0cmluZ31gO1xuXG4vLyBTZWxlY3Qg6rCSIO2DgOyehSDtmZXsnqUgKOuLqOydvCDsu6zrn7wg65iQ64qUIFNRTCDtkZztmITsi50pXG5leHBvcnQgdHlwZSBTZWxlY3RWYWx1ZTxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPVxuICB8IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz5cbiAgfCBTcWxFeHByZXNzaW9uPFwic3RyaW5nXCIgfCBcIm51bWJlclwiIHwgXCJib29sZWFuXCIgfCBcImRhdGVcIj47XG5cbi8vIOykkeyyqSBTZWxlY3Qg6rCd7LK0IO2DgOyehSAo7J6s6reA7KCBKVxuLy8g7JiIOiB7IHBhcmVudDogeyBpZDogXCJwYXJlbnQuaWRcIiwgbmFtZTogXCJwYXJlbnQubmFtZVwiIH0gfVxuZXhwb3J0IHR5cGUgTmVzdGVkU2VsZWN0T2JqZWN0PFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgW2tleTogc3RyaW5nXTogU2VsZWN0VmFsdWU8VFRhYmxlcz4gfCBOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcz47XG59O1xuXG4vLyBTZWxlY3Qg6rCd7LK0IO2DgOyehSAoZmxhdCDrmJDripQg7KSR7LKpIO2XiOyaqSlcbmV4cG9ydCB0eXBlIFNlbGVjdE9iamVjdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcz47XG5cbi8vIOqwkuydtCDspJHssqkg6rCd7LK07J247KeAIO2MkOuzhO2VmOuKlCDtl6ztjbwg7YOA7J6FXG50eXBlIElzTmVzdGVkT2JqZWN0PFQ+ID0gVCBleHRlbmRzIHN0cmluZ1xuICA/IGZhbHNlXG4gIDogVCBleHRlbmRzIFNxbEV4cHJlc3Npb248YW55PlxuICAgID8gZmFsc2VcbiAgICA6IFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICA/IHRydWVcbiAgICAgIDogZmFsc2U7XG5cbi8vIOy7rOufvOydtCBudWxsYWJsZeyduOyngCDtmZXsnbggKOyKpO2CpOuniOyXkOyEnCDsp4HsoJEg7LaU7LacKVxuLy8g7JiIOiBJc051bGxhYmxlQ29sdW1uPFRUYWJsZXMsIFwiZW1wbG95ZWVzLmRlcGFydG1lbnRfaWRcIj4g4oaSIGRlcGFydG1lbnRfaWTqsIAgbnVtYmVyIHwgbnVsbOydtOuptCB0cnVlXG5leHBvcnQgdHlwZSBJc051bGxhYmxlQ29sdW1uPFxuICBUVGFibGVzLFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBudWxsIGV4dGVuZHMgVFRhYmxlc1tUQWxpYXNdW1RDb2x1bW5dXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGZhbHNlXG4gICAgICA6IGZhbHNlXG4gICAgOiBmYWxzZVxuICA6IGZhbHNlO1xuXG4vLyBGSyBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw66W4IOuniOy7pCDtg4DsnoUg6rKw7KCVXG4vLyBudWxsYWJsZSBGS+uhnCBsZWZ0Sm9pbiDihpIgTGVmdEpvaW5lZE1hcmtlciAo6rCd7LK0IOyekOyytOqwgCBudWxs7J28IOyImCDsnojsnYwpXG4vLyBub24tbnVsbCBGS+uhnCBsZWZ0Sm9pbiDihpIg66eI7LukIOyXhuydjCAo67aA66qo6rCAIOyeiOycvOuptCDsnpDsi53rj4Qg67CY65Oc7IucIOyeiOydjClcbmV4cG9ydCB0eXBlIExlZnRKb2luTWFya2VyRm9yPFRUYWJsZXMsIFBhdGggZXh0ZW5kcyBzdHJpbmc+ID0gSXNOdWxsYWJsZUNvbHVtbjxcbiAgVFRhYmxlcyxcbiAgUGF0aFxuPiBleHRlbmRzIHRydWVcbiAgPyBMZWZ0Sm9pbmVkTWFya2VyXG4gIDoge307XG5cbi8vIOyjvOyWtOynhCDthYzsnbTruJTsnbQgRksgbnVsbGFibGXroZwgbGVmdEpvaW4g65CcIO2FjOydtOu4lOyduOyngCDtmZXsnbjtlanri4jri6QuXG4vLyDsgqzsi6QgTGVmdEpvaW5NYXJrZXLqsIAg67aZ7JeI64qU7KeAIO2ZleyduO2VmOuKlOqyjCDri6TsnoXri4jri6QuXG4vLyDsnbQg66eI7Luk64qUIEZLIG51bGxhYmxlICsgbGVmdEpvaW4g7KGw7ZWp7JeQ7ISc66eMIOu2meyKteuLiOuLpC5cbnR5cGUgSXNOdWxsYWJsZUpvaW5lZFRhYmxlPFRUYWJsZXMsIFRhYmxlS2V5PiA9IFRhYmxlS2V5IGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICA/IFRUYWJsZXNbVGFibGVLZXldIGV4dGVuZHMgTGVmdEpvaW5lZE1hcmtlclxuICAgID8gdHJ1ZSAvLyBMZWZ0Sm9pbmVkTWFya2Vy6rCAIOyeiOycvOuptCBudWxsYWJsZVxuICAgIDogZmFsc2VcbiAgOiBmYWxzZTtcblxuLy8g6rK966GcIOyhsO2VqSDtl6ztjbwgKHByZWZpeOqwgCDsl4bsnLzrqbQga2V566eMLCDsnojsnLzrqbQgcHJlZml4X19rZXkpXG50eXBlIEpvaW5QYXRoPFByZWZpeCBleHRlbmRzIHN0cmluZywgS2V5IGV4dGVuZHMgc3RyaW5nPiA9IFByZWZpeCBleHRlbmRzIFwiXCJcbiAgPyBLZXlcbiAgOiBgJHtQcmVmaXh9X18ke0tleX1gO1xuXG4vLyBTZWxlY3Qg6rKw6rO8IO2DgOyeheydhCDstpTroaDtlbTso7zripQg7Lmc6rWs7J6F64uI64ukLlxuLy8g7J20IO2DgOyeheydgCBQdXJp7J2YIHNlbGVjdCwgYXBwZW5kU2VsZWN07JeQ7IScIFRSZXN1bHTroZwg7IKs7Jqp65Cp64uI64ukLlxuLy9cbi8vIFNjaGVtYeulvCDsnb3slrTshJwgRkvsnZggbnVsbGFiaWxpdHnsl5Ag65Sw6528IGpvaW7rkJwg6rCd7LK07J2YIO2DgOyeheydhCDstpTroaDtlbTso7zripQg6riw64ql7J20IOyeiOyKteuLiOuLpC5cbi8vIOydtOqyjCDrrLTsiqgg7IaM66as64OQPyBGS+qwgCBudWxsYWJsZeyduOuNsCBsZWZ0Sm9pbuuQmOyXiOuLpOuptCwg7ZW064u5IOqwneyytOuKlCBudWxsYWJsZSDtlbTslbwg7ZWo7J2EIO2DgOyehSDstpTroaDsnLzroZwg67CY7JiB7ZW07KSA64uk64qUIOqyg+yeheuLiOuLpC5cbi8vIOuwmOuptCBGS+qwgCBub24tbnVsbGFibGXsnbTqsbDrgpgg6re464OlIGpvaW7snLzroZwg7J207Ja07KGM64uk66m0IO2VtOuLuSDqsJ3ssrTripQgbm9uLW51bGxhYmxl7ZWgIOqygeuLiOuLpC5cbi8vIOusvOuhoCDqsJ3ssrQg64K067aA7J2YIG51bGxhYmlsaXR564qUIOuYkCDrs4TqsJzroZwg7LaU66Gg65Cp64uI64ukLlxuLy9cbi8vIOyVhOuemOyXkOuPhCBQYXJzZVNlbGVjdE9iamVjdFdpdGhQYXRo66W8IOu5hOuhr+2VtCBFeHRyYWN0Q29sdW1uVHlwZSwgRXh0cmFjdENvbHVtblR5cGVSYXcg65Ox7J2YIO2DgOyeheydtCDsnojsirXri4jri6QuXG4vLyDsnbTrk6TsnZgg7Jet7ZWg7J2AIOuLpOydjOqzvCDqsJnsirXri4jri6Q6XG4vLyAtIFBhcnNlKjog6rCd7LK0IOugiOuyqOyXkOyEnCDspJHssqkg6rWs7KGw66W8IOyInO2ajO2VmOupsCDqsJ3ssrTsl5AgfCBudWxs7J2EIOu2meydvOyngCDqsrDsoJXtlanri4jri6QuXG4vLyAtIEV4dHJhY3QqOiDtlYTrk5wg66CI67Ko7JeQ7IScIFwidGFibGUuY29sdW1uXCIg6rK966Gc66Gc67aA7YSwIOyLpOygnCDtg4DsnoXsnYQg7LaU7Lac7ZWp64uI64ukLlxuLy9cbi8vIOyYiOyLnDpcbi8vIC5zZWxlY3Qoe1xuLy8gICBpZDogXCJ1c2Vycy5pZFwiLCAgICAgICAgICAgLy8g4oaQIEV4dHJhY3RDb2x1bW5UeXBl7J2YIOqysOqzvOuKlCBudW1iZXLsnoXri4jri6QuXG4vLyAgIGRlcGFydG1lbnQ6IHsgICAgICAgICAgICAgLy8g4oaQIFBhcnNlU2VsZWN0T2JqZWN0SW5uZXLsl5Ag7J2Y7ZW0IG51bGxhYmxlIOqwneyytOuhnCDstpTroaDrkKnri4jri6QuXG4vLyAgICAgaWQ6IFwiZGVwYXJ0bWVudC5pZFwiLCAgICAvLyDihpAgRXh0cmFjdENvbHVtblR5cGVSYXfsnZgg6rKw6rO864qUIG51bWJlcuyeheuLiOuLpC5cbi8vICAgICBuYW1lOiBcImRlcGFydG1lbnQubmFtZVwiIC8vIOKGkCBFeHRyYWN0Q29sdW1uVHlwZVJhd+ydmCDqsrDqs7zripQgc3RyaW5n7J6F64uI64ukLlxuLy8gICB9XG4vLyB9KVxuZXhwb3J0IHR5cGUgUGFyc2VTZWxlY3RPYmplY3Q8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBUU2VsZWN0IGV4dGVuZHMgU2VsZWN0T2JqZWN0PFRUYWJsZXM+LFxuPiA9IFBhcnNlU2VsZWN0T2JqZWN0V2l0aFBhdGg8VFRhYmxlcywgVFNlbGVjdCwgXCJcIj47XG5cbi8vIOqyveuhnOulvCDstpTsoIHtlZjrqbTshJwgU2VsZWN0IOqysOqzvCDtg4DsnoXsnYQg7LaU66Gg7ZWp64uI64ukLlxudHlwZSBQYXJzZVNlbGVjdE9iamVjdFdpdGhQYXRoPFxuICBUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVFNlbGVjdCBleHRlbmRzIFNlbGVjdE9iamVjdDxUVGFibGVzPixcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuPiA9IEV4cGFuZDx7XG4gIFtLIGluIGtleW9mIFRTZWxlY3RdOiBUU2VsZWN0W0tdIGV4dGVuZHMgU3FsRXhwcmVzc2lvbjxpbmZlciBSPlxuICAgID8gUiBleHRlbmRzIFwic3RyaW5nXCJcbiAgICAgID8gc3RyaW5nXG4gICAgICA6IFIgZXh0ZW5kcyBcIm51bWJlclwiXG4gICAgICAgID8gbnVtYmVyXG4gICAgICAgIDogUiBleHRlbmRzIFwiYm9vbGVhblwiXG4gICAgICAgICAgPyBib29sZWFuXG4gICAgICAgICAgOiBSIGV4dGVuZHMgXCJkYXRlXCJcbiAgICAgICAgICAgID8gRGF0ZVxuICAgICAgICAgICAgOiBuZXZlclxuICAgIDogSXNOZXN0ZWRPYmplY3Q8VFNlbGVjdFtLXT4gZXh0ZW5kcyB0cnVlXG4gICAgICA/IFRTZWxlY3RbS10gZXh0ZW5kcyBOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcz5cbiAgICAgICAgPyBJc051bGxhYmxlSm9pbmVkVGFibGU8VFRhYmxlcywgSm9pblBhdGg8UHJlZml4LCBLICYgc3RyaW5nPj4gZXh0ZW5kcyB0cnVlIC8vIOyjvOyWtOynhCDthYzsnbTruJTsnbQgRksgbnVsbGFibGXsl5AgbGVmdEpvaW7rkJjsl4jripTsp4Ag7Jes67aA7JeQIOuUsOudvCBzZWxlY3Qg6rKw6rO8IOqwneyytOydmCDtg4DsnoXsnbQg64us65287KeR64uI64ukLlxuICAgICAgICAgID8gRXhwYW5kPFBhcnNlU2VsZWN0T2JqZWN0SW5uZXI8VFRhYmxlcywgVFNlbGVjdFtLXSwgSm9pblBhdGg8UHJlZml4LCBLICYgc3RyaW5nPj4+IHwgbnVsbCAvLyDrp4zslb0g7ZW064u57ZWc64uk66m0IO2VtOuLuSDqsJ3ssrQg7J6Q7LK064qUIG51bGxhYmxlIO2VmOupsCxcbiAgICAgICAgICA6IEV4cGFuZDxQYXJzZVNlbGVjdE9iamVjdElubmVyPFRUYWJsZXMsIFRTZWxlY3RbS10sIEpvaW5QYXRoPFByZWZpeCwgSyAmIHN0cmluZz4+PiAvLyDqt7jroIfsp4Ag7JWK64uk66m0IG5vbi1udWxsYWJsZSDtlanri4jri6QuXG4gICAgICAgIDogbmV2ZXJcbiAgICAgIDogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywgVFNlbGVjdFtLXSAmIHN0cmluZz47XG59PjtcblxuLy8g7KSR7LKpIOqwneyytCDrgrTrtoDsmqkgLSBsZWZ0Sm9pbiBudWxsYWJsZeydhCDqsJ3ssrQg66CI67Ko7JeQ7IScIOydtOuvuCDsspjrpqztlojsnLzrr4DroZwg7ZWE65Oc64qUIOybkOuzuCDtg4DsnoXsnYQg7IKs7Jqp7ZWp64uI64ukLlxuLy8gUGFyc2VTZWxlY3RPYmplY3RXaXRoUGF0aOyZgCDqsbDsnZgg64+Z7J287ZWY64KYLCDrp4jsp4Drp4nsl5AgRXh0cmFjdENvbHVtblR5cGUg64yA7IugIEV4dHJhY3RDb2x1bW5UeXBlUmF366W8IOyCrOyaqe2VmOyXrFxuLy8g7ZWE65OcIOugiOuyqOyXkOyEnCDspJHrs7XsnLzroZwgfCBudWxs7J20IOy2lOqwgOuQmOuKlCDqsoPsnYQg67Cp7KeA7ZWp64uI64ukLlxudHlwZSBQYXJzZVNlbGVjdE9iamVjdElubmVyPFxuICBUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgVFNlbGVjdCBleHRlbmRzIFNlbGVjdE9iamVjdDxUVGFibGVzPixcbiAgUHJlZml4IGV4dGVuZHMgc3RyaW5nLFxuPiA9IEV4cGFuZDx7XG4gIFtLIGluIGtleW9mIFRTZWxlY3RdOiBUU2VsZWN0W0tdIGV4dGVuZHMgU3FsRXhwcmVzc2lvbjxpbmZlciBSPlxuICAgID8gUiBleHRlbmRzIFwic3RyaW5nXCJcbiAgICAgID8gc3RyaW5nXG4gICAgICA6IFIgZXh0ZW5kcyBcIm51bWJlclwiXG4gICAgICAgID8gbnVtYmVyXG4gICAgICAgIDogUiBleHRlbmRzIFwiYm9vbGVhblwiXG4gICAgICAgICAgPyBib29sZWFuXG4gICAgICAgICAgOiBSIGV4dGVuZHMgXCJkYXRlXCJcbiAgICAgICAgICAgID8gRGF0ZVxuICAgICAgICAgICAgOiBuZXZlclxuICAgIDogSXNOZXN0ZWRPYmplY3Q8VFNlbGVjdFtLXT4gZXh0ZW5kcyB0cnVlXG4gICAgICA/IFRTZWxlY3RbS10gZXh0ZW5kcyBOZXN0ZWRTZWxlY3RPYmplY3Q8VFRhYmxlcz5cbiAgICAgICAgPyBJc051bGxhYmxlSm9pbmVkVGFibGU8VFRhYmxlcywgSm9pblBhdGg8UHJlZml4LCBLICYgc3RyaW5nPj4gZXh0ZW5kcyB0cnVlXG4gICAgICAgICAgPyBFeHBhbmQ8UGFyc2VTZWxlY3RPYmplY3RJbm5lcjxUVGFibGVzLCBUU2VsZWN0W0tdLCBKb2luUGF0aDxQcmVmaXgsIEsgJiBzdHJpbmc+Pj4gfCBudWxsXG4gICAgICAgICAgOiBFeHBhbmQ8UGFyc2VTZWxlY3RPYmplY3RJbm5lcjxUVGFibGVzLCBUU2VsZWN0W0tdLCBKb2luUGF0aDxQcmVmaXgsIEsgJiBzdHJpbmc+Pj5cbiAgICAgICAgOiBuZXZlclxuICAgICAgOiBFeHRyYWN0Q29sdW1uVHlwZVJhdzxUVGFibGVzLCBUU2VsZWN0W0tdICYgc3RyaW5nPjsgLy8gbGVmdEpvaW4gbnVsbGFibGUg66y07IucXG59PjtcblxuLy8g7Lus65+8IOqyveuhnOyXkOyEnCDtg4DsnoXsnYQg7LaU7Lac7ZWp64uI64ukLiBMZWZ0Sm9pbmVkTWFya2Vy6rCAIOyeiOycvOuptCB8IG51bGzsnYQg7LaU6rCA7ZWp64uI64ukLlxuLy8g7LWc7IOB7JyEIHNlbGVjdCDtlYTrk5zsl5DshJwg7IKs7Jqp65Cp64uI64ukLlxuZXhwb3J0IHR5cGUgRXh0cmFjdENvbHVtblR5cGU8XG4gIFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBQYXRoIGV4dGVuZHMgc3RyaW5nLFxuPiA9IFBhdGggZXh0ZW5kcyBgJHtpbmZlciBUQWxpYXN9LiR7aW5mZXIgVENvbHVtbn1gXG4gID8gVEFsaWFzIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8gVENvbHVtbiBleHRlbmRzIGtleW9mIFRUYWJsZXNbVEFsaWFzXVxuICAgICAgPyBUVGFibGVzW1RBbGlhc10gZXh0ZW5kcyBMZWZ0Sm9pbmVkTWFya2VyXG4gICAgICAgID8gVFRhYmxlc1tUQWxpYXNdW1RDb2x1bW5dIHwgbnVsbCAvLyBMRUZUIEpPSU4gKG51bGxhYmxlIEZLKSDihpIgbnVsbGFibGVcbiAgICAgICAgOiBUVGFibGVzW1RBbGlhc11bVENvbHVtbl0gLy8gSU5ORVIgSk9JTiDrmJDripQgbm9uLW51bGwgRksgbGVmdEpvaW4g4oaSIG5vbi1udWxsYWJsZVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXJcbiAgOiBJc1NpbmdsZUtleTxUVGFibGVzPiBleHRlbmRzIHRydWVcbiAgICA/IFBhdGggZXh0ZW5kcyBrZXlvZiBUVGFibGVzW2tleW9mIFRUYWJsZXNdXG4gICAgICA/IFRUYWJsZXNba2V5b2YgVFRhYmxlc11bUGF0aF1cbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xuXG4vLyDsu6zrn7wg6rK966Gc7JeQ7IScIO2DgOyeheydhCDstpTstpztlanri4jri6QuIGxlZnRKb2luIOyXrOu2gOyZgCDqtIDqs4Tsl4bsnbQg7JuQ67O4IO2DgOyeheydhCDrsJjtmZjtlanri4jri6QuXG4vLyDspJHssqkg6rCd7LK0IOuCtOu2gCDtlYTrk5zsl5DshJwg7IKs7Jqp65Cp64uI64ukLiAo6rCd7LK0IOugiOuyqOyXkOyEnCDsnbTrr7ggfCBudWxsIOyymOumrOqwgCDsmYTro4zrkJjsl4jsnLzrr4DroZwpXG50eXBlIEV4dHJhY3RDb2x1bW5UeXBlUmF3PFxuICBUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgUGF0aCBleHRlbmRzIHN0cmluZyxcbj4gPSBQYXRoIGV4dGVuZHMgYCR7aW5mZXIgVEFsaWFzfS4ke2luZmVyIFRDb2x1bW59YFxuICA/IFRBbGlhcyBleHRlbmRzIGtleW9mIFRUYWJsZXNcbiAgICA/IFRDb2x1bW4gZXh0ZW5kcyBrZXlvZiBUVGFibGVzW1RBbGlhc11cbiAgICAgID8gVFRhYmxlc1tUQWxpYXNdW1RDb2x1bW5dIC8vIGxlZnRKb2luIOyXrOu2gOyZgCDqtIDqs4Tsl4bsnbQg7JuQ67O4IO2DgOyehVxuICAgICAgOiBuZXZlclxuICAgIDogbmV2ZXJcbiAgOiBJc1NpbmdsZUtleTxUVGFibGVzPiBleHRlbmRzIHRydWVcbiAgICA/IFBhdGggZXh0ZW5kcyBrZXlvZiBUVGFibGVzW2tleW9mIFRUYWJsZXNdXG4gICAgICA/IFRUYWJsZXNba2V5b2YgVFRhYmxlc11bUGF0aF1cbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xuXG4vLyBXaGVyZSDsobDqsbQg6rCd7LK0IO2DgOyehVxuLy8g7JiIOiB7IFwidS5pZFwiOiAxLCBcInUuc3RhdHVzXCI6IFwiYWN0aXZlXCIgfVxuZXhwb3J0IHR5cGUgV2hlcmVDb25kaXRpb248VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBba2V5IGluIEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz5dPzogRXh0cmFjdENvbHVtblR5cGU8VFRhYmxlcywga2V5ICYgc3RyaW5nPjtcbn07XG5cbi8vIEZ1bGx0ZXh0IGluZGV4IOy7rOufvCDstpTstpwg7YOA7J6FXG5leHBvcnQgdHlwZSBGdWxsdGV4dENvbHVtbnM8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ge1xuICBbVEFsaWFzIGluIGtleW9mIFRUYWJsZXNdOiBUVGFibGVzW1RBbGlhc10gZXh0ZW5kcyB7XG4gICAgW0sgaW4gRnVsbHRleHRLZXldOiByZWFkb25seSAoaW5mZXIgQ29sKVtdO1xuICB9XG4gICAgPyBDb2wgZXh0ZW5kcyBzdHJpbmdcbiAgICAgID8gYCR7VEFsaWFzICYgc3RyaW5nfS4ke0NvbH1gXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlcjtcbn1ba2V5b2YgVFRhYmxlc107XG5cbi8vIOu5hOq1kCDsl7DsgrDsnpBcbmV4cG9ydCB0eXBlIENvbXBhcmlzb25PcGVyYXRvciA9IFwiPVwiIHwgXCI+XCIgfCBcIj49XCIgfCBcIjxcIiB8IFwiPD1cIiB8IFwiPD5cIiB8IFwiIT1cIjtcbi8vIOyhsOqxtCDsl7DsgrDsnpA6IOu5hOq1kCDsl7DsgrDsnpAgKyDtjKjthLQg66ek7LmtIOyXsOyCsOyekFxuZXhwb3J0IHR5cGUgV2hlcmVPcGVyYXRvciA9IENvbXBhcmlzb25PcGVyYXRvciB8IFwibGlrZVwiIHwgXCJub3QgbGlrZVwiO1xuXG4vLyBTUUwgRXhwcmVzc2lvbiDtg4DsnoUg7KCV7J2YXG5leHBvcnQgdHlwZSBTcWxFeHByZXNzaW9uPFQgZXh0ZW5kcyBcInN0cmluZ1wiIHwgXCJudW1iZXJcIiB8IFwiYm9vbGVhblwiIHwgXCJkYXRlXCI+ID0ge1xuICBfdHlwZTogXCJzcWxfZXhwcmVzc2lvblwiOyAvLyDrmJDripQgXCJjb21wdXRlZF92YWx1ZVwiXG4gIF9yZXR1cm46IFQ7XG4gIF9zcWw6IHN0cmluZztcbn07XG5cbi8vIOqysOqzvCDtg4DsnoUg6rCA64+F7ISx7J2EIOychO2VnCDtg4DsnoUg7ZmV7J6lXG5leHBvcnQgdHlwZSBFeHBhbmQ8VD4gPSBUIGV4dGVuZHMgYW55W11cbiAgPyB7IFtLIGluIGtleW9mIFRbMF1dOiBUWzBdW0tdIH1bXSAvLyDrsLDsl7TsnbTrqbQg7LKrIOuyiOynuCDsmpTshozrpbwgRXhwYW5k7ZWY6rOgIOuwsOyXtOuhnCDqsJDsjIhcbiAgOiBUIGV4dGVuZHMgb2JqZWN0XG4gICAgPyB7IFtLIGluIGtleW9mIFRdOiBUW0tdIH1cbiAgICA6IFQ7XG5cbnR5cGUgSXNTaW5nbGVLZXk8VFRhYmxlcyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+ID0ga2V5b2YgVFRhYmxlcyBleHRlbmRzIGluZmVyIEtcbiAgPyBLIGV4dGVuZHMga2V5b2YgVFRhYmxlc1xuICAgID8ga2V5b2YgVFRhYmxlcyBleHRlbmRzIEsgLy8g7Jet67Cp7ZalIOyytO2BrOuhnCDri6jsnbwg7YKkIO2ZleyduFxuICAgICAgPyB0cnVlXG4gICAgICA6IGZhbHNlXG4gICAgOiBmYWxzZVxuICA6IGZhbHNlO1xuXG5leHBvcnQgdHlwZSBTaW5nbGVUYWJsZVZhbHVlPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9XG4gIElzU2luZ2xlS2V5PFRUYWJsZXM+IGV4dGVuZHMgdHJ1ZSA/IFRUYWJsZXNba2V5b2YgVFRhYmxlc10gOiBuZXZlcjtcblxuLy8gX19oYXNEZWZhdWx0X1/sl5Ag7Y+s7ZWo65CcIO2CpOuTpOydhCBQdXJpVGFibGU8VD7snZgg7YKk66GcIOygnO2VnFxudHlwZSBIYXNEZWZhdWx0S2V5czxUPiA9IFQgZXh0ZW5kcyB7IF9faGFzRGVmYXVsdF9fOiByZWFkb25seSAoaW5mZXIgSylbXSB9XG4gID8gRXh0cmFjdDxLLCBrZXlvZiBQdXJpVGFibGU8VD4+XG4gIDogbmV2ZXI7XG5cbi8vIF9fZ2VuZXJhdGVkX1/sl5Ag7Y+s7ZWo65CcIO2CpOuTpCAoSU5TRVJUIOyLnCDsoJzsmbjtlbTslbwg7ZWoKVxudHlwZSBHZW5lcmF0ZWRLZXlzPFQ+ID0gVCBleHRlbmRzIHsgX19nZW5lcmF0ZWRfXzogcmVhZG9ubHkgKGluZmVyIEspW10gfVxuICA/IEV4dHJhY3Q8Sywga2V5b2YgUHVyaVRhYmxlPFQ+PlxuICA6IG5ldmVyO1xuXG4vLyBJbnNlcnQg7YOA7J6FOiDrqZTtg4DrjbDsnbTthLAg7KCc6rGwIO2bhCwgX19oYXNEZWZhdWx0X18g7Lus65+865Ok66eMIG9wdGlvbmFs66GcIOyymOumrCwgX19nZW5lcmF0ZWRfXyDsu6zrn7zsnYAg7JmE7KCE7Z6IIOygnOyZuFxuZXhwb3J0IHR5cGUgSW5zZXJ0RGF0YTxUPiA9IE9taXQ8XG4gIFB1cmlUYWJsZTxUPixcbiAgSW50ZXJuYWxUeXBlS2V5cyB8IEhhc0RlZmF1bHRLZXlzPFQ+IHwgR2VuZXJhdGVkS2V5czxUPlxuPiAmIHtcbiAgW0sgaW4gSGFzRGVmYXVsdEtleXM8VD5dPzogUHVyaVRhYmxlPFQ+W0tdO1xufTtcblxuLy8gSW5zZXJ0IFJlc3VsdCDtg4DsnoVcbmV4cG9ydCB0eXBlIEluc2VydFJlc3VsdCA9IFBpY2s8UXVlcnlSZXN1bHQ8YW55PiwgXCJjb21tYW5kXCIgfCBcInJvd0NvdW50XCIgfCBcInJvd3NcIiB8IFwib2lkXCI+O1xuXG4vLyBTdWJzZXRRdWVyeeulvCDsnITtlZwg7YOA7J6FIOycoO2LuOumrO2LsFxudHlwZSBFeHRyYWN0VFRhYmxlczxUIGV4dGVuZHMgUHVyaTxhbnksIGFueSwgYW55Pj4gPSBUIGV4dGVuZHMgUHVyaTxhbnksIGluZmVyIFRUYWJsZXMsIGFueT5cbiAgPyBUVGFibGVzXG4gIDogbmV2ZXI7XG5leHBvcnQgdHlwZSBVbmlvbkV4dHJhY3RlZFRUYWJsZXM8XG4gIFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgU3Vic2V0UXVlcmllcyBleHRlbmRzIFJlY29yZDxcbiAgICBTdWJzZXRLZXksXG4gICAgKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiBQdXJpPGFueSwgYW55LCBhbnk+XG4gID4sXG4+ID0ge1xuICBbSyBpbiBTdWJzZXRLZXldOiBFeHRyYWN0VFRhYmxlczxSZXR1cm5UeXBlPFN1YnNldFF1ZXJpZXNbS10+Pjtcbn1bU3Vic2V0S2V5XTtcblxuLy8gT04gQ09ORkxJQ1Qg64yA7IOBIO2DgOyehVxuLy8gLSDri6jsnbwg7Lus65+8OiBcImVtYWlsXCJcbi8vIC0g67O17IiYIOy7rOufvDogW1widXNlcl9pZFwiLCBcInByb2R1Y3RfaWRcIl1cbmV4cG9ydCB0eXBlIE9uQ29uZmxpY3RUYXJnZXQgPSBzdHJpbmcgfCBzdHJpbmdbXTtcblxuLy8gT04gQ09ORkxJQ1Qg7JWh7IWYIO2DgOyehVxuLy8gLSBcIm5vdGhpbmdcIjogRE8gTk9USElOR1xuLy8gLSB7IHVwZGF0ZTogWy4uLl0gfTogRE8gVVBEQVRFXG5leHBvcnQgdHlwZSBPbkNvbmZsaWN0QWN0aW9uPFRUYWJsZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gPVxuICB8IFwibm90aGluZ1wiXG4gIHwge1xuICAgICAgdXBkYXRlOlxuICAgICAgICB8IEF2YWlsYWJsZUNvbHVtbnM8VFRhYmxlcz5bXSAvLyDrsLDsl7Qg7ZiV7YOcIC0gW1wibmFtZVwiLCBcImVtYWlsXCJdXG4gICAgICAgIHwgV2hlcmVDb25kaXRpb248VFRhYmxlcz47IC8vIOqwneyytCDtmJXtg5wgLSB7IG5hbWU6IFwiSm9oblwiLCBjb3VudDogUHVyaS5yYXdOdW1iZXIoLi4uKSB9XG4gICAgfTtcblxuLy8gRksg7Lus65+866qFIOy2lOy2nCDsnKDti7jrpqzti7Ag7YOA7J6FIC0gRGF0YWJhc2VGb3JlaWduS2V5cyDtmZzsmqlcbmV4cG9ydCB0eXBlIEZvcmVpZ25LZXlDb2x1bW5zPFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxEYXRhYmFzZVNjaGVtYUV4dGVuZD4+ID1cbiAgVFRhYmxlIGV4dGVuZHMga2V5b2YgRGF0YWJhc2VGb3JlaWduS2V5cyA/IERhdGFiYXNlRm9yZWlnbktleXNbVFRhYmxlXSA6IG5ldmVyO1xuXG4vLyBVbmlvbuydhCBJbnRlcnNlY3Rpb27snLzroZwg67OA7ZmY7ZWY64qUIOycoO2LuOumrO2LsFxudHlwZSBVbmlvblRvSW50ZXJzZWN0aW9uPFU+ID0gKFUgZXh0ZW5kcyBhbnkgPyAoazogVSkgPT4gdm9pZCA6IG5ldmVyKSBleHRlbmRzIChrOiBpbmZlciBJKSA9PiB2b2lkXG4gID8gSVxuICA6IG5ldmVyO1xuXG4vLyBTZWxlY3RBbGwg7IucIOuqqOuToCDsobDsnbjrkJwg7YWM7J2067iU7J2YIOy7rOufvCDtj6ztlahcbmV4cG9ydCB0eXBlIFNlbGVjdEFsbFJlc3VsdDxUVGFibGVzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4gPSBVbmlvblRvSW50ZXJzZWN0aW9uPFxuICB7XG4gICAgW0sgaW4ga2V5b2YgVFRhYmxlc106IFRUYWJsZXNbS10gZXh0ZW5kcyBpbmZlciBUXG4gICAgICA/IFQgZXh0ZW5kcyBMZWZ0Sm9pbmVkTWFya2VyXG4gICAgICAgID8gUGFydGlhbDxPbWl0SW50ZXJuYWxUeXBlS2V5czxUPj4gLy8gTEVGVCBKT0lO7J2AIG51bGxhYmxlLCDrqZTtg4DrjbDsnbTthLAg7KCc6rGwXG4gICAgICAgIDogT21pdEludGVybmFsVHlwZUtleXM8VD4gLy8gSU5ORVIgSk9JTuydgCBub24tbnVsbGFibGUsIOuplO2DgOuNsOydtO2EsCDsoJzqsbBcbiAgICAgIDogbmV2ZXI7XG4gIH1ba2V5b2YgVFRhYmxlc11cbj47XG5cbi8vIEZUUyDtg4DsnoVcbnR5cGUgVHNRdWVyeVBhcnNlciA9IFwidG9fdHNxdWVyeVwiIHwgXCJwbGFpbnRvX3RzcXVlcnlcIiB8IFwicGhyYXNldG9fdHNxdWVyeVwiIHwgXCJ3ZWJzZWFyY2hfdG9fdHNxdWVyeVwiO1xuZXhwb3J0IHR5cGUgVHNRdWVyeUNvbmZpZyA9IFwic2ltcGxlXCIgfCBcImVuZ2xpc2hcIjtcbmV4cG9ydCB0eXBlIFRzUXVlcnlPcHRpb25zID0ge1xuICBwYXJzZXI/OiBUc1F1ZXJ5UGFyc2VyO1xuICBjb25maWc/OiBUc1F1ZXJ5Q29uZmlnO1xufTtcblxuZXhwb3J0IHR5cGUgSGlnaGxpZ2h0T3B0aW9ucyA9IHtcbiAgLyoqIOy/vOumrCDrs4DtmZgg7ZWo7IiYICjquLDrs7jqsJI6IFwid2Vic2VhcmNoX3RvX3RzcXVlcnlcIikgKi9cbiAgcGFyc2VyPzogVHNRdWVyeVBhcnNlcjtcbiAgLyoqIO2FjeyKpO2KuCDqsoDsg4kg7ISk7KCVICjquLDrs7jqsJI6IFwic2ltcGxlXCIpICovXG4gIGNvbmZpZz86IFRzUXVlcnlDb25maWc7XG4gIC8qKiDstZzrjIAg64uo7Ja0IOyImCAo6riw67O46rCSOiAzNSkgKi9cbiAgbWF4V29yZHM/OiBudW1iZXI7XG4gIC8qKiDstZzshowg64uo7Ja0IOyImCAo6riw67O46rCSOiAxNSkgKi9cbiAgbWluV29yZHM/OiBudW1iZXI7XG4gIC8qKiDtl6Trk5zrnbzsnbgg7Iuc7J6RL+uBneyXkOyEnCDsoJzqsbDtlaAg7Ken7J2AIOuLqOyWtCDquLjsnbQgKOq4sOuzuOqwkjogMykgKi9cbiAgc2hvcnRXb3JkPzogbnVtYmVyO1xuICAvKiogdHJ1ZeuptCDsoITssrQg66y47ISc66W8IO2XpOuTnOudvOyduOycvOuhnCDsgqzsmqkgKOq4sOuzuOqwkjogZmFsc2UpICovXG4gIGhpZ2hsaWdodEFsbD86IGJvb2xlYW47XG4gIC8qKiDtkZzsi5ztlaAg7LWc64yAIO2FjeyKpO2KuCDsobDqsIEg7IiYICjquLDrs7jqsJI6IDAsIOyhsOqwgSDrr7jsgqzsmqkpICovXG4gIG1heEZyYWdtZW50cz86IG51bWJlcjtcbiAgLyoqIOy/vOumrCDri6jslrQg7Iuc7J6RIOq1rOu2hOyekCAo6riw67O46rCSOiBcIjxiPlwiKSAqL1xuICBzdGFydFNlbD86IHN0cmluZztcbiAgLyoqIOy/vOumrCDri6jslrQg64GdIOq1rOu2hOyekCAo6riw67O46rCSOiBcIjwvYj5cIikgKi9cbiAgc3RvcFNlbD86IHN0cmluZztcbiAgLyoqIOyhsOqwgSDqtazrtoTsnpAgKOq4sOuzuOqwkjogXCIgLi4uIFwiKSAqL1xuICBmcmFnbWVudERlbGltaXRlcj86IHN0cmluZztcbn07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0ZBQXNGLEdBMlh0RixXQXFCRSJ9
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { Knex } from "knex";
|
|
2
2
|
import type { DatabaseForeignKeys, DatabaseSchemaExtend, EntityIndex } from "../types/types";
|
|
3
|
-
import type { ForeignKeyColumns, TableName } from "./puri.types";
|
|
3
|
+
import type { ColumnKeys, ForeignKeyColumns, TableName } from "./puri.types";
|
|
4
4
|
/**
|
|
5
5
|
* FK 타입 추론을 위해 DatabaseForeignKeys export
|
|
6
6
|
* (module augmentation 자동 로드 보장)
|
|
7
7
|
*/
|
|
8
8
|
export type { DatabaseForeignKeys };
|
|
9
|
+
type InheritableColumns<TTable extends TableName<DatabaseSchemaExtend>> = TTable extends keyof DatabaseSchemaExtend ? ColumnKeys<DatabaseSchemaExtend[TTable]> : never;
|
|
9
10
|
type TableData = {
|
|
10
11
|
references: Set<string>;
|
|
11
12
|
rows: Record<string, unknown>[];
|
|
@@ -20,6 +21,7 @@ export type UBRef = {
|
|
|
20
21
|
export type UpsertOptions<TTable extends TableName<DatabaseSchemaExtend>> = {
|
|
21
22
|
chunkSize?: number;
|
|
22
23
|
cleanOrphans?: ForeignKeyColumns<TTable> | ForeignKeyColumns<TTable>[];
|
|
24
|
+
inherit?: InheritableColumns<TTable>[];
|
|
23
25
|
};
|
|
24
26
|
export type InsertOnlyOptions = {
|
|
25
27
|
chunkSize?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upsert-builder.d.ts","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7F,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"upsert-builder.d.ts","sourceRoot":"","sources":["../../src/database/upsert-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -203,12 +203,27 @@ export class UpsertBuilder {
|
|
|
203
203
|
resultRows = await wdb.insert(dataForDb).into(tableName).returning(selectFields);
|
|
204
204
|
} else {
|
|
205
205
|
// UPSERT 모드 - onConflict 사용 (unique index 없으면 PK fallback)
|
|
206
|
-
const conflictColumns = table.uniqueIndexes
|
|
206
|
+
const conflictColumns = table.uniqueIndexes[0]?.columns.map((c)=>c.name) ?? [
|
|
207
207
|
"id"
|
|
208
208
|
];
|
|
209
|
-
const
|
|
209
|
+
const allColumns = Object.keys(dataForDb[0]);
|
|
210
|
+
let updateColumns = allColumns.filter((c)=>!conflictColumns.includes(c));
|
|
211
|
+
// inherit 옵션 처리 - inherit 컬럼은 update 대상에서 제외
|
|
212
|
+
if (options?.inherit?.length) {
|
|
213
|
+
const inheritColumns = options.inherit;
|
|
214
|
+
const excludedFromUpdate = updateColumns.filter((c)=>inheritColumns.includes(c));
|
|
215
|
+
updateColumns = updateColumns.filter((c)=>!inheritColumns.includes(c));
|
|
216
|
+
// 실제로 제외된 컬럼 로깅
|
|
217
|
+
if (excludedFromUpdate.length) {
|
|
218
|
+
Naite.t("puri:ub-inherit", {
|
|
219
|
+
tableName,
|
|
220
|
+
inheritColumns,
|
|
221
|
+
excludedFromUpdate
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
210
225
|
// updateColumns가 비어있어도 merge()를 사용하여 모든 행이 RETURNING되도록 보장
|
|
211
|
-
const mergeColumns = updateColumns.length
|
|
226
|
+
const mergeColumns = updateColumns.length ? updateColumns : conflictColumns;
|
|
212
227
|
resultRows = await wdb.insert(dataForDb).into(tableName).onConflict(conflictColumns).merge(mergeColumns).returning(selectFields);
|
|
213
228
|
}
|
|
214
229
|
if (originalUuids.length !== resultRows.length) {
|
|
@@ -390,4 +405,4 @@ export class UpsertBuilder {
|
|
|
390
405
|
}
|
|
391
406
|
}
|
|
392
407
|
|
|
393
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS91cHNlcnQtYnVpbGRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGlzQXJyYXksIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VGb3JlaWduS2V5cywgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIEVudGl0eUluZGV4IH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBhc3NlcnREZWZpbmVkLCBjaHVuaywgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IGJhdGNoVXBkYXRlLCB0eXBlIFJvd1dpdGhJZCB9IGZyb20gXCIuL19iYXRjaF91cGRhdGVcIjtcbmltcG9ydCB0eXBlIHsgRm9yZWlnbktleUNvbHVtbnMsIFRhYmxlTmFtZSB9IGZyb20gXCIuL3B1cmkudHlwZXNcIjtcblxuLyoqXG4gKiBGSyDtg4DsnoUg7LaU66Gg7J2EIOychO2VtCBEYXRhYmFzZUZvcmVpZ25LZXlzIGV4cG9ydFxuICogKG1vZHVsZSBhdWdtZW50YXRpb24g7J6Q64+ZIOuhnOuTnCDrs7TsnqUpXG4gKi9cbmV4cG9ydCB0eXBlIHsgRGF0YWJhc2VGb3JlaWduS2V5cyB9O1xuXG4vLyDthYzsnbTruJQg642w7J207YSwIO2DgOyehVxudHlwZSBUYWJsZURhdGEgPSB7XG4gIHJlZmVyZW5jZXM6IFNldDxzdHJpbmc+O1xuICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuICB1bmlxdWVJbmRleGVzOiBFbnRpdHlJbmRleFtdO1xuICB1bmlxdWVzTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufTtcblxuLy8g7LC47KGwIO2VhOuTnCDtg4DsnoVcbmV4cG9ydCB0eXBlIFVCUmVmID0ge1xuICB1dWlkOiBzdHJpbmc7XG4gIG9mOiBzdHJpbmc7XG4gIHVzZT86IHN0cmluZztcbn07XG5cbi8vIHVwc2VydCDsmLXshZhcbmV4cG9ydCB0eXBlIFVwc2VydE9wdGlvbnM8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4gPSB7XG4gIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgY2xlYW5PcnBoYW5zPzogRm9yZWlnbktleUNvbHVtbnM8VFRhYmxlPiB8IEZvcmVpZ25LZXlDb2x1bW5zPFRUYWJsZT5bXTtcbn07XG5cbi8vIGluc2VydE9ubHkg7Ji17IWYXG5leHBvcnQgdHlwZSBJbnNlcnRPbmx5T3B0aW9ucyA9IHtcbiAgY2h1bmtTaXplPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVmRmllbGQoZmllbGQ6IHVua25vd24pOiBmaWVsZCBpcyBVQlJlZiB7XG4gIHJldHVybiAoXG4gICAgZmllbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgIGZpZWxkICE9PSBudWxsICYmXG4gICAgKGZpZWxkIGFzIFVCUmVmKT8ub2YgIT09IHVuZGVmaW5lZCAmJlxuICAgIChmaWVsZCBhcyBVQlJlZik/LnV1aWQgIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG5leHBvcnQgY2xhc3MgVXBzZXJ0QnVpbGRlciB7XG4gIHRhYmxlczogTWFwPHN0cmluZywgVGFibGVEYXRhPjtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy50YWJsZXMgPSBuZXcgTWFwKCk7XG4gIH1cblxuICBnZXRUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IFRhYmxlRGF0YSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUpIHtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZVNwZWMgPSAoKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEVudGl0eU1hbmFnZXIuZ2V0VGFibGVTcGVjKHRhYmxlTmFtZSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSkoKTtcblxuICAgIGNvbnN0IHRhYmxlRGF0YSA9IHtcbiAgICAgIHJlZmVyZW5jZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgcm93czogW10sXG4gICAgICB1bmlxdWVJbmRleGVzOiB0YWJsZVNwZWM/LnVuaXF1ZUluZGV4ZXMgPz8gW10sXG4gICAgICB1bmlxdWVzTWFwOiBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpLFxuICAgIH07XG4gICAgdGhpcy50YWJsZXMuc2V0KHRhYmxlTmFtZSwgdGFibGVEYXRhKTtcbiAgICByZXR1cm4gdGFibGVEYXRhO1xuICB9XG5cbiAgaGFzVGFibGUodGFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZXMuaGFzKHRhYmxlTmFtZSk7XG4gIH1cblxuICByZWdpc3RlcjxUIGV4dGVuZHMgc3RyaW5nPihcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICByb3c6IHtcbiAgICAgIFtrZXkgaW4gVF0/OiBVQlJlZiB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQgfCBudWxsIHwgb2JqZWN0IHwgdW5rbm93bjtcbiAgICB9LFxuICApOiBVQlJlZiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLmdldFRhYmxlKHRhYmxlTmFtZSk7XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iU7J2YIHVuaXF1ZSDsnbjrjbHsiqTrpbwg7Iic7ZqM7ZWY66mwIO2CpCDsg53shLFcbiAgICBjb25zdCB1bmlxdWVLZXlzID0gdGFibGUudW5pcXVlSW5kZXhlc1xuICAgICAgLm1hcCgodW5xSW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdW5pcXVlS2V5QXJyYXkgPSB1bnFJbmRleC5jb2x1bW5zLm1hcCgodW5xQ29sKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gcm93W3VucUNvbC5uYW1lIGFzIGtleW9mIHR5cGVvZiByb3ddO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWwudXVpZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJvd1t1bnFDb2wubmFtZSBhcyBrZXlvZiB0eXBlb2Ygcm93XSA/PyByYW5kb21VVUlEKCk7IC8vIG51bGxhYmxl7J24IOqyveyasCB1dWlk66GcIOuenOuNpOqwkiDsgr3snoVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIOqwkuydtCDrqqjrkZAgbnVsbOyduCDqsr3smrAg7YKkIOyDneyEsSDtjKjsiqRcbiAgICAgICAgaWYgKHVuaXF1ZUtleUFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmlxdWVLZXlBcnJheS5qb2luKFwiLS0tZGVsaW1pdGVyLS1cIik7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG5cbiAgICAvLyB1dWlkIOyDneyEsSDroZzsp4FcbiAgICBjb25zdCB7IHV1aWQsIGlzUmV1c2VkIH0gPSAoKCkgPT4ge1xuICAgICAgLy8g7YKk66W8IOyInO2ajO2VmOyXrCDsnbTrr7gg7KG07J6s7ZWY64qUIO2CpOqwgCDsnojripTsp4Ag7ZmV7J24XG4gICAgICBpZiAodW5pcXVlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgdW5pcXVlS2V5IG9mIHVuaXF1ZUtleXMpIHtcbiAgICAgICAgICBpZiAodGFibGUudW5pcXVlc01hcC5oYXModW5pcXVlS2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdXVpZDogYXNzZXJ0RGVmaW5lZCh0YWJsZS51bmlxdWVzTWFwLmdldCh1bmlxdWVLZXkpLCBcIlVuaXF1ZSBrZXkgbm90IGZvdW5kXCIpLFxuICAgICAgICAgICAgICBpc1JldXNlZDogdHJ1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOywvuydhCDsiJgg7JeG64qUIOqyveyasCDsg53shLFcbiAgICAgIHJldHVybiB7IHV1aWQ6IHJhbmRvbVVVSUQoKSwgaXNSZXVzZWQ6IGZhbHNlIH07XG4gICAgfSkoKTtcblxuICAgIC8vIOuqqOuToCDsnKDri4jtgaztgqTsl5Ag64yA7ZW0IOycoOuLiO2BrOunteyXkCB1dWlkIOyggOyepVxuICAgIGlmICh1bmlxdWVLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgdW5pcXVlS2V5IG9mIHVuaXF1ZUtleXMpIHtcbiAgICAgICAgdGFibGUudW5pcXVlc01hcC5zZXQodW5pcXVlS2V5LCB1dWlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsnbQg7YWM7J2067iU7JeQIOyCrOyaqeuQnCBSZWZGaWVsZOulvCDsiJztmoztlZjsl6wsIO2YhOyerCDthYzsnbTruJQg7KCV67O07JeQIOyWtOuWpCDtlYTrk5zrpbwg7LC47KGw7ZWY64qU7KeAIOy2lOqwgFxuICAgIC8vIOydtCDsoJXrs7Trpbwg64KY7KSR7JeQIOy5mO2ZmO2VoCDrlYwg7IKs7JqpXG4gICAgcm93ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5tYXAoKFtyb3dLZXksIHJvd1ZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoaXNSZWZGaWVsZChyb3dWYWx1ZSkpIHtcbiAgICAgICAgICByb3dWYWx1ZS51c2UgPz89IFwiaWRcIjtcbiAgICAgICAgICB0YWJsZS5yZWZlcmVuY2VzLmFkZChgJHtyb3dWYWx1ZS5vZn0uJHtyb3dWYWx1ZS51c2V9YCk7XG4gICAgICAgICAgcmV0dXJuIFtyb3dLZXksIHJvd1ZhbHVlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygcm93VmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIShyb3dWYWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgLy8gb2JqZWN07J24IOqyveyasCBKU09O7Jy866GcIOuzgO2ZmFxuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBKU09OLnN0cmluZ2lmeShyb3dWYWx1ZSldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZV07XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICkgYXMgeyBba2V5IGluIFRdPzogdW5rbm93biB9O1xuXG4gICAgdGFibGUucm93cy5wdXNoKHtcbiAgICAgIHV1aWQsXG4gICAgICAuLi5yb3csXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFVCUmVmID0ge1xuICAgICAgb2Y6IHRhYmxlTmFtZSxcbiAgICAgIHV1aWQ6IChyb3cgYXMgeyB1dWlkPzogc3RyaW5nIH0pLnV1aWQgPz8gdXVpZCxcbiAgICB9O1xuXG4gICAgTmFpdGUudChcInB1cmk6dWItcmVnaXN0ZXJcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgdXVpZDogcmVzdWx0LnV1aWQsXG4gICAgICBpc1V1aWRSZXVzZWQ6IGlzUmV1c2VkLFxuICAgICAgcm93LFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIHVwc2VydDxUVGFibGUgZXh0ZW5kcyBUYWJsZU5hbWU8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+PihcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBUVGFibGUsXG4gICAgb3B0aW9ucz86IFVwc2VydE9wdGlvbnM8VFRhYmxlPixcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcInVwc2VydFwiLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIGluc2VydE9ubHk8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4oXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIG9wdGlvbnM/OiBJbnNlcnRPbmx5T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnVwc2VydE9ySW5zZXJ0KHdkYiwgdGFibGVOYW1lLCBcImluc2VydFwiLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIHVwc2VydE9ySW5zZXJ0PFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxEYXRhYmFzZVNjaGVtYUV4dGVuZD4+KFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IFRUYWJsZSxcbiAgICBtb2RlOiBcInVwc2VydFwiIHwgXCJpbnNlcnRcIixcbiAgICBvcHRpb25zPzogVXBzZXJ0T3B0aW9uczxUVGFibGU+LFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgaWYgKHRoaXMuaGFzVGFibGUodGFibGVOYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMudGFibGVzLmdldCh0YWJsZU5hbWUpO1xuICAgIGlmICh0YWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQg7YWM7J2067iUICR7dGFibGVOYW1lfeyXkCB1cHNlcnQg7JqU7LKtYCk7XG4gICAgfSBlbHNlIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IO2VoCDrjbDsnbTthLDqsIAg7JeG7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRhYmxlLnJvd3Muc29tZSgocm93KSA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyhyb3cpLnNvbWUoKFssIHZhbHVlXSkgPT4gaXNSZWZGaWVsZCh2YWx1ZSkgJiYgdmFsdWUub2YgIT09IHRhYmxlTmFtZSksXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfSDtlbTqsrDrkJjsp4Ag7JWK7J2AIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgLy8g7KCE7LK0IO2FjOydtOu4lCDsiJztmoztlZjsl6wg7ZiE7J6sIO2FjOydtOu4lCDssLjsobDtlZjripQg66qo65OgIO2FjOydtOu4lCDstpTstpxcbiAgICBjb25zdCB7IHJlZmVyZW5jZXMsIHJlZlRhYmxlcyB9ID0gQXJyYXkuZnJvbSh0aGlzLnRhYmxlcykucmVkdWNlKFxuICAgICAgKHIsIFssIHRhYmxlXSkgPT4ge1xuICAgICAgICBjb25zdCByZWZlcmVuY2UgPSBBcnJheS5mcm9tKHRhYmxlLnJlZmVyZW5jZXMudmFsdWVzKCkpLmZpbmQoKHJlZikgPT5cbiAgICAgICAgICByZWYuaW5jbHVkZXMoYCR7dGFibGVOYW1lfS5gKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlZmVyZW5jZSkge1xuICAgICAgICAgIHIucmVmZXJlbmNlcy5wdXNoKHJlZmVyZW5jZSk7XG4gICAgICAgICAgci5yZWZUYWJsZXMucHVzaCh0YWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHJlZmVyZW5jZXM6IFtdIGFzIHN0cmluZ1tdLFxuICAgICAgICByZWZUYWJsZXM6IFtdIGFzIFRhYmxlRGF0YVtdLFxuICAgICAgfSxcbiAgICApO1xuICAgIGNvbnN0IGV4dHJhY3RGaWVsZHMgPSB1bmlxdWUocmVmZXJlbmNlcylcbiAgICAgIC5tYXAoKHJlZmVyZW5jZSkgPT4gcmVmZXJlbmNlLnNwbGl0KFwiLlwiKVsxXSlcbiAgICAgIC5maWx0ZXIoKGZpZWxkKTogZmllbGQgaXMgc3RyaW5nID0+IGZpZWxkICE9PSB1bmRlZmluZWQpO1xuXG4gICAgLy8g7J2Y7KG07ISxIOyInOyEnOyXkCDrlLDrnbwg66CI67Ko67OEIOq3uOujue2ZlCAo7J6Q6riwIOywuOyhsOqwgCDsl4bsnLzrqbQgTGV2ZWwgMCDtlZjrgpgpXG4gICAgY29uc3QgeyBsZXZlbHMsIGhhc0NpcmN1bGFyIH0gPSB0aGlzLmJ1aWxkSW5zZXJ0TGV2ZWxzKHRhYmxlLnJvd3MsIHRhYmxlTmFtZSk7XG5cbiAgICBpZiAoaGFzQ2lyY3VsYXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIOyInO2ZmCDsnpDquLAg7LC47KGw6rCAIOyeiOyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB1dWlkTWFwID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gICAgY29uc3QgYWxsSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgLy8g66CI67Ko67OE66GcIOyInOywqCDsspjrpqxcbiAgICBmb3IgKGNvbnN0IGxldmVsUm93cyBvZiBsZXZlbHMpIHtcbiAgICAgIC8vIOydtOyghCDroIjrsqjsl5DshJwg7Ja77J2AIElE66GcIOyekOq4sCDssLjsobAg7ZW06rKwXG4gICAgICBjb25zdCByZXNvbHZlZFJvd3MgPSBsZXZlbFJvd3MubWFwKChyb3cpID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSB7IC4uLnJvdyB9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyb3cpKSB7XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHV1aWRNYXAuZ2V0KHZhbHVlLnV1aWQpO1xuXG4gICAgICAgICAgICBpZiAoIXBhcmVudCkgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHt2YWx1ZS51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcblxuICAgICAgICAgICAgcmVzb2x2ZWRba2V5XSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3ZhbHVlLnVzZSA/PyBcImlkXCJdO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHZhbHVlLm9mLCB1dWlkOiB2YWx1ZS51dWlkLCB1c2U6IHZhbHVlLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkW2tleV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmVkO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIO2YhOyerCDroIjrsqggdXBzZXJ0XG4gICAgICBjb25zdCBjaHVua1NpemUgPSBvcHRpb25zPy5jaHVua1NpemU7XG4gICAgICBjb25zdCBsZXZlbENodW5rcyA9IGNodW5rU2l6ZSA/IGNodW5rKHJlc29sdmVkUm93cywgY2h1bmtTaXplKSA6IFtyZXNvbHZlZFJvd3NdO1xuICAgICAgY29uc3Qgc2VsZWN0RmllbGRzID0gdW5pcXVlKFtcImlkXCIsIC4uLmV4dHJhY3RGaWVsZHNdKTtcblxuICAgICAgZm9yIChjb25zdCBkYXRhQ2h1bmsgb2YgbGV2ZWxDaHVua3MpIHtcbiAgICAgICAgaWYgKGRhdGFDaHVuay5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIHV1aWTrpbwg67OE64+E66GcIOuztOq0gO2VmOqzoCwgRELsl5Ag7KCA7J6l7ZWgIOuNsOydtO2EsOyXkOyEnCDsoJzqsbBcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxVdWlkcyA9IGRhdGFDaHVuay5tYXAoKHIpID0+IHIudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgICBjb25zdCBkYXRhRm9yRGIgPSBkYXRhQ2h1bmsubWFwKCh7IHV1aWQsIC4uLnJlc3QgfSkgPT4gcmVzdCk7XG5cbiAgICAgICAgbGV0IHJlc3VsdFJvd3M6IHsgaWQ6IG51bWJlcjsgW2tleTogc3RyaW5nXTogdW5rbm93biB9W107XG5cbiAgICAgICAgaWYgKG1vZGUgPT09IFwiaW5zZXJ0XCIpIHtcbiAgICAgICAgICAvLyBJTlNFUlQg66qo65OcIC0gUkVUVVJOSU5HIOyCrOyaqVxuICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCB3ZGIuaW5zZXJ0KGRhdGFGb3JEYikuaW50byh0YWJsZU5hbWUpLnJldHVybmluZyhzZWxlY3RGaWVsZHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFVQU0VSVCDrqqjrk5wgLSBvbkNvbmZsaWN0IOyCrOyaqSAodW5pcXVlIGluZGV4IOyXhuycvOuptCBQSyBmYWxsYmFjaylcbiAgICAgICAgICBjb25zdCBjb25mbGljdENvbHVtbnMgPVxuICAgICAgICAgICAgdGFibGUudW5pcXVlSW5kZXhlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gdGFibGUudW5pcXVlSW5kZXhlc1swXS5jb2x1bW5zLm1hcCgoYykgPT4gYy5uYW1lKVxuICAgICAgICAgICAgICA6IFtcImlkXCJdO1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZUNvbHVtbnMgPSBPYmplY3Qua2V5cyhkYXRhRm9yRGJbMF0pLmZpbHRlcihcbiAgICAgICAgICAgIChjb2wpID0+ICFjb25mbGljdENvbHVtbnMuaW5jbHVkZXMoY29sKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgLy8gdXBkYXRlQ29sdW1uc+qwgCDruYTslrTsnojslrTrj4QgbWVyZ2UoKeulvCDsgqzsmqntlZjsl6wg66qo65OgIO2WieydtCBSRVRVUk5JTkfrkJjrj4TroZ0g67O07J6lXG4gICAgICAgICAgY29uc3QgbWVyZ2VDb2x1bW5zID0gdXBkYXRlQ29sdW1ucy5sZW5ndGggPiAwID8gdXBkYXRlQ29sdW1ucyA6IGNvbmZsaWN0Q29sdW1ucztcblxuICAgICAgICAgIHJlc3VsdFJvd3MgPSBhd2FpdCB3ZGJcbiAgICAgICAgICAgIC5pbnNlcnQoZGF0YUZvckRiKVxuICAgICAgICAgICAgLmludG8odGFibGVOYW1lKVxuICAgICAgICAgICAgLm9uQ29uZmxpY3QoY29uZmxpY3RDb2x1bW5zKVxuICAgICAgICAgICAgLm1lcmdlKG1lcmdlQ29sdW1ucylcbiAgICAgICAgICAgIC5yZXR1cm5pbmcoc2VsZWN0RmllbGRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcmlnaW5hbFV1aWRzLmxlbmd0aCAhPT0gcmVzdWx0Um93cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfTogcmVnaXN0ZXIvcmV0dXJuaW5nIOu2iOydvOy5mGApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRSb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdXVpZE1hcC5zZXQob3JpZ2luYWxVdWlkc1tpXSwgcmVzdWx0Um93c1tpXSk7XG4gICAgICAgICAgYWxsSWRzLnB1c2gocmVzdWx0Um93c1tpXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iUIOywuOyhsOulvCDsi6TsoJwg67C466WY66GcIOuzgOqyvVxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgcmVmVGFibGVzKSB7XG4gICAgICB0YWJsZS5yb3dzID0gdGFibGUucm93cy5tYXAoKHJvdykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyb3cpKSB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IHJvd1trZXldO1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHByb3ApICYmIHByb3Aub2YgPT09IHRhYmxlTmFtZSkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdXVpZE1hcC5nZXQocHJvcC51dWlkKTtcbiAgICAgICAgICAgIGlmICghcGFyZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocHJvcCk7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB1dWlkICR7cHJvcC51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkVmFsdWUgPSAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwcm9wLnVzZSA/PyBcImlkXCJdO1xuICAgICAgICAgICAgcm93W2tleV0gPSByZXNvbHZlZFZhbHVlO1xuXG4gICAgICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1yZWYtcmVzb2x2ZWRcIiwge1xuICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgIGZpZWxkOiBrZXksXG4gICAgICAgICAgICAgIGZyb206IHsgb2Y6IHByb3Aub2YsIHV1aWQ6IHByb3AudXVpZCwgdXNlOiBwcm9wLnVzZSA/PyBcImlkXCIgfSxcbiAgICAgICAgICAgICAgdG86IHJlc29sdmVkVmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zPy5jbGVhbk9ycGhhbnMpIHtcbiAgICAgIGNvbnN0IGNsZWFuT3JwaGFucyA9IG9wdGlvbnMuY2xlYW5PcnBoYW5zO1xuICAgICAgY29uc3QgZmtDb2x1bW5zID0gaXNBcnJheShjbGVhbk9ycGhhbnMpXG4gICAgICAgID8gKGNsZWFuT3JwaGFucyBhcyBGb3JlaWduS2V5Q29sdW1uczxUVGFibGU+W10pXG4gICAgICAgIDogW2NsZWFuT3JwaGFucyBhcyBGb3JlaWduS2V5Q29sdW1uczxUVGFibGU+XTtcblxuICAgICAgLy8g7ZiE7J6sIHJlZ2lzdGVy65CcIOugiOy9lOuTnOuTpOydmCBGSyDqsJLrk6Qg7LaU7LacXG4gICAgICBjb25zdCBma0NvbmRpdGlvbnMgPSBma0NvbHVtbnMubWFwKChma0NvbCkgPT4ge1xuICAgICAgICBjb25zdCBma1ZhbHVlcyA9IFsuLi5uZXcgU2V0KHRhYmxlLnJvd3MubWFwKChyb3cpID0+IHJvd1tma0NvbF0pLmZpbHRlcigodikgPT4gdiAhPSBudWxsKSldO1xuICAgICAgICByZXR1cm4geyBjb2x1bW46IGZrQ29sLCB2YWx1ZXM6IGZrVmFsdWVzIH07XG4gICAgICB9KTtcblxuICAgICAgLy8g66qo65OgIEZLIOy7rOufvOyXkCDqsJLsnbQg7J6I64qUIOqyveyasOyXkOunjCDsgq3soJwg7Iuk7ZaJXG4gICAgICBpZiAoZmtDb25kaXRpb25zLmV2ZXJ5KChmYykgPT4gZmMudmFsdWVzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIGxldCBkZWxldGVRdWVyeSA9IHdkYih0YWJsZU5hbWUpO1xuXG4gICAgICAgIC8vIOqwgSBGSyDsu6zrn7zsl5Ag64yA7ZWcIFdIRVJFIElOIOyhsOqxtCDstpTqsIBcbiAgICAgICAgZm9yIChjb25zdCB7IGNvbHVtbiwgdmFsdWVzIH0gb2YgZmtDb25kaXRpb25zKSB7XG4gICAgICAgICAgZGVsZXRlUXVlcnkgPSBkZWxldGVRdWVyeS53aGVyZUluKGNvbHVtbiwgdmFsdWVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuwqeq4iCB1cHNlcnTtlZwgSUTripQg7KCc7Jm4XG4gICAgICAgIGRlbGV0ZVF1ZXJ5ID0gZGVsZXRlUXVlcnkud2hlcmVOb3RJbihcImlkXCIsIGFsbElkcyk7XG5cbiAgICAgICAgY29uc3QgZGVsZXRlZENvdW50ID0gYXdhaXQgZGVsZXRlUXVlcnkuZGVsZXRlKCk7XG5cbiAgICAgICAgTmFpdGUudChcInB1cmk6dWItY2xlYW4tb3JwaGFuc1wiLCB7XG4gICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgIGNsZWFuT3JwaGFuczogZmtDb2x1bW5zLFxuICAgICAgICAgIGRlbGV0ZWRDb3VudCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZW064u5IO2FjOydtOu4lOydmCDrjbDsnbTthLAg7LSI6riw7ZmUXG4gICAgdGFibGUucm93cyA9IFtdO1xuICAgIHRhYmxlLnJlZmVyZW5jZXMuY2xlYXIoKTtcbiAgICB0YWJsZS51bmlxdWVzTWFwLmNsZWFyKCk7XG5cbiAgICBOYWl0ZS50KFwicHVyaTp1Yi11cHNlcnRlZFwiLCB7XG4gICAgICB0YWJsZU5hbWUsXG4gICAgICBtb2RlLFxuICAgICAgcm93Q291bnQ6IGFsbElkcy5sZW5ndGgsXG4gICAgICByZXR1cm5lZElkczogYWxsSWRzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFsbElkcztcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUJhdGNoKFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzoge1xuICAgICAgY2h1bmtTaXplPzogbnVtYmVyO1xuICAgICAgd2hlcmU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBvcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGNodW5rU2l6ZTogb3B0aW9ucz8uY2h1bmtTaXplID8/IDUwMCxcbiAgICAgIHdoZXJlOiBvcHRpb25zPy53aGVyZSA/PyBcImlkXCIsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmhhc1RhYmxlKHRhYmxlTmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZXMuZ2V0KHRhYmxlTmFtZSk7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDrk7HroZ3rkJjsp4Ag7JWK7J2AIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBkYXRlQmF0Y2gg7JqU7LKtYCk7XG4gICAgfSBlbHNlIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdoZXJlQ29sdW1ucyA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy53aGVyZSkgPyBvcHRpb25zLndoZXJlIDogW29wdGlvbnMud2hlcmUgPz8gXCJpZFwiXTtcbiAgICBjb25zdCByb3dzID0gdGFibGUucm93cy5tYXAoKF9yb3cpID0+IHtcbiAgICAgIGNvbnN0IHsgdXVpZDogXywgLi4ucm93IH0gPSBfcm93OyAvLyB1dWlkIOygnOyZuFxuICAgICAgcmV0dXJuIHJvdyBhcyBSb3dXaXRoSWQ8c3RyaW5nPjtcbiAgICB9KTtcblxuICAgIGF3YWl0IGJhdGNoVXBkYXRlKHdkYiwgdGFibGVOYW1lLCB3aGVyZUNvbHVtbnMsIHJvd3MsIG9wdGlvbnMuY2h1bmtTaXplKTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLWJhdGNoLXVwZGF0ZWRcIiwge1xuICAgICAgdGFibGVOYW1lLFxuICAgICAgcm93Q291bnQ6IHJvd3MubGVuZ3RoLFxuICAgICAgd2hlcmVDb2x1bW5zLFxuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlQmF0Y2gg7JmE66OMIO2bhCDsspjrpqzrkJwg642w7J207YSwIOygnOqxsFxuICAgIHRhYmxlLnJvd3MgPSBbXTtcbiAgICB0YWJsZS5yZWZlcmVuY2VzLmNsZWFyKCk7XG4gICAgdGFibGUudW5pcXVlc01hcC5jbGVhcigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcml2YXRlIEhlbHBlciBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogcm93c+ulvCDsnZjsobTshLEg7Iic7ISc7JeQIOuUsOudvCDroIjrsqjrs4TroZwg6re466O57ZmUXG4gICAqIC0g7J6Q6riwIOywuOyhsCDsl4bripQg6rK97JqwIDog66qo65OgIHJvd3PqsIAgTGV2ZWwgMFxuICAgKiAtIOyekOq4sCDssLjsobAg7J6I64qUIOqyveyasCA6IOyekOq4sCDssLjsobAg6rSA6rOE66W8IOychOyDgSDsoJXroKztlZjsl6wg66CI67Ko67OE66GcIOq3uOujue2ZlFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEluc2VydExldmVscyhcbiAgICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICApOiB7IGxldmVsczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXVtdOyBoYXNDaXJjdWxhcjogYm9vbGVhbiB9IHtcbiAgICAvLyAxLiDsnpDquLAg7LC47KGw6rCAIOyXhuycvOuptCDtlZwg66CI67Ko66GcIOyymOumrFxuICAgIGNvbnN0IGhhc1NlbGZSZWYgPSByb3dzXG4gICAgICAuZmxhdE1hcCgocm93KSA9PiBPYmplY3QudmFsdWVzKHJvdykpXG4gICAgICAuc29tZSgodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUpO1xuICAgIGlmICghaGFzU2VsZlJlZikgcmV0dXJuIHsgbGV2ZWxzOiBbcm93c10sIGhhc0NpcmN1bGFyOiBmYWxzZSB9O1xuXG4gICAgLy8gMi4gdXVpZCDihpIgcm93IOunpO2VkSAo7KSR67O1IHV1aWQg67Cp7KeAKVxuICAgIGNvbnN0IHJvd0J5VXVpZCA9IG5ldyBNYXA8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBjb25zdCB1dWlkID0gcm93LnV1aWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCF1dWlkKSB0aHJvdyBuZXcgRXJyb3IoYGJ1aWxkSW5zZXJ0TGV2ZWxzOiB1dWlk6rCAIOyXhuuKlCByb3cgLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICByb3dCeVV1aWQuc2V0KHV1aWQsIHJvdyk7XG4gICAgfVxuXG4gICAgbGV0IHBlbmRpbmcgPSBBcnJheS5mcm9tKHJvd0J5VXVpZC52YWx1ZXMoKSk7XG4gICAgY29uc3QgbGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW10gPSBbXTtcbiAgICBjb25zdCBpbnNlcnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgLy8gMy4g66CI67Ko67OEIOu2hOulmFxuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuICAgICAgY29uc3QgbmV4dFBlbmRpbmc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcGVuZGluZykge1xuICAgICAgICAvLyDsnbQgcm936rCAIOywuOyhsO2VmOuKlCDsnpDquLAg7LC47KGw65OkXG4gICAgICAgIGNvbnN0IHNlbGZSZWZzID0gT2JqZWN0LnZhbHVlcyhyb3cpLmZpbHRlcihcbiAgICAgICAgICAodmFsdWUpID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mID09PSB0YWJsZU5hbWUsXG4gICAgICAgICkgYXMgVUJSZWZbXTtcblxuICAgICAgICAvLyDssLjsobDtlZjripQg66qo65OgIHV1aWTqsIAg7J2066+4IGluc2VydGVk7JeQIOyeiOyWtOyVvCDsnbTrsogg66CI67Ko7JeQIO2PrO2VqFxuICAgICAgICBjb25zdCBjYW5JbnNlcnQgPSBzZWxmUmVmcy5ldmVyeSgocmVmKSA9PiB7XG4gICAgICAgICAgaWYgKCFyb3dCeVV1aWQuaGFzKHJlZi51dWlkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtyZWYudXVpZH0gLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpbnNlcnRlZC5oYXMocmVmLnV1aWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2FuSW5zZXJ0KSB7XG4gICAgICAgICAgY3VycmVudExldmVsLnB1c2gocm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXh0UGVuZGluZy5wdXNoKHJvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7Iic7ZmYIOywuOyhsCDqsJDsp4BcbiAgICAgIGlmIChjdXJyZW50TGV2ZWwubGVuZ3RoID09PSAwKSByZXR1cm4geyBsZXZlbHM6IFtdLCBoYXNDaXJjdWxhcjogdHJ1ZSB9O1xuXG4gICAgICAvLyDroIjrsqgg7ZmV7KCVICsgaW5zZXJ0ZWQg6rCx7IugXG4gICAgICBsZXZlbHMucHVzaChjdXJyZW50TGV2ZWwpO1xuICAgICAgZm9yIChjb25zdCByb3cgb2YgY3VycmVudExldmVsKSB7XG4gICAgICAgIGluc2VydGVkLmFkZChyb3cudXVpZCBhcyBzdHJpbmcpO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nID0gbmV4dFBlbmRpbmc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbGV2ZWxzLCBoYXNDaXJjdWxhcjogZmFsc2UgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbInJhbmRvbVVVSUQiLCJpc0FycmF5IiwidW5pcXVlIiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiYXNzZXJ0RGVmaW5lZCIsImNodW5rIiwibm9uTnVsbGFibGUiLCJiYXRjaFVwZGF0ZSIsImlzUmVmRmllbGQiLCJmaWVsZCIsInVuZGVmaW5lZCIsIm9mIiwidXVpZCIsIlVwc2VydEJ1aWxkZXIiLCJ0YWJsZXMiLCJNYXAiLCJnZXRUYWJsZSIsInRhYmxlTmFtZSIsInRhYmxlIiwiZ2V0IiwidGFibGVTcGVjIiwiZ2V0VGFibGVTcGVjIiwidGFibGVEYXRhIiwicmVmZXJlbmNlcyIsIlNldCIsInJvd3MiLCJ1bmlxdWVJbmRleGVzIiwidW5pcXVlc01hcCIsInNldCIsImhhc1RhYmxlIiwiaGFzIiwicmVnaXN0ZXIiLCJyb3ciLCJ1bmlxdWVLZXlzIiwibWFwIiwidW5xSW5kZXgiLCJ1bmlxdWVLZXlBcnJheSIsImNvbHVtbnMiLCJ1bnFDb2wiLCJ2YWwiLCJuYW1lIiwibGVuZ3RoIiwiam9pbiIsImZpbHRlciIsImlzUmV1c2VkIiwidW5pcXVlS2V5IiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwicm93S2V5Iiwicm93VmFsdWUiLCJ1c2UiLCJhZGQiLCJEYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsInB1c2giLCJyZXN1bHQiLCJ0IiwiaXNVdWlkUmV1c2VkIiwidXBzZXJ0Iiwid2RiIiwib3B0aW9ucyIsInVwc2VydE9ySW5zZXJ0IiwiaW5zZXJ0T25seSIsIm1vZGUiLCJFcnJvciIsInNvbWUiLCJ2YWx1ZSIsInJlZlRhYmxlcyIsIkFycmF5IiwiZnJvbSIsInJlZHVjZSIsInIiLCJyZWZlcmVuY2UiLCJ2YWx1ZXMiLCJmaW5kIiwicmVmIiwiaW5jbHVkZXMiLCJleHRyYWN0RmllbGRzIiwic3BsaXQiLCJsZXZlbHMiLCJoYXNDaXJjdWxhciIsImJ1aWxkSW5zZXJ0TGV2ZWxzIiwidXVpZE1hcCIsImFsbElkcyIsImxldmVsUm93cyIsInJlc29sdmVkUm93cyIsInJlc29sdmVkIiwia2V5IiwicGFyZW50IiwidG8iLCJjaHVua1NpemUiLCJsZXZlbENodW5rcyIsInNlbGVjdEZpZWxkcyIsImRhdGFDaHVuayIsIm9yaWdpbmFsVXVpZHMiLCJkYXRhRm9yRGIiLCJyZXN0IiwicmVzdWx0Um93cyIsImluc2VydCIsImludG8iLCJyZXR1cm5pbmciLCJjb25mbGljdENvbHVtbnMiLCJjIiwidXBkYXRlQ29sdW1ucyIsImtleXMiLCJjb2wiLCJtZXJnZUNvbHVtbnMiLCJvbkNvbmZsaWN0IiwibWVyZ2UiLCJpIiwiaWQiLCJwcm9wIiwiY29uc29sZSIsImVycm9yIiwicmVzb2x2ZWRWYWx1ZSIsImNsZWFuT3JwaGFucyIsImZrQ29sdW1ucyIsImZrQ29uZGl0aW9ucyIsImZrQ29sIiwiZmtWYWx1ZXMiLCJ2IiwiY29sdW1uIiwiZXZlcnkiLCJmYyIsImRlbGV0ZVF1ZXJ5Iiwid2hlcmVJbiIsIndoZXJlTm90SW4iLCJkZWxldGVkQ291bnQiLCJkZWxldGUiLCJjbGVhciIsInJvd0NvdW50IiwicmV0dXJuZWRJZHMiLCJ1cGRhdGVCYXRjaCIsIndoZXJlIiwid2hlcmVDb2x1bW5zIiwiX3JvdyIsIl8iLCJoYXNTZWxmUmVmIiwiZmxhdE1hcCIsInJvd0J5VXVpZCIsInBlbmRpbmciLCJpbnNlcnRlZCIsImN1cnJlbnRMZXZlbCIsIm5leHRQZW5kaW5nIiwic2VsZlJlZnMiLCJjYW5JbnNlcnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxTQUFTO0FBRXBDLFNBQVNDLE9BQU8sRUFBRUMsTUFBTSxRQUFRLFVBQVU7QUFDMUMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBRXZDLFNBQVNDLGFBQWEsRUFBRUMsS0FBSyxFQUFFQyxXQUFXLFFBQVEsb0JBQWlCO0FBQ25FLFNBQVNDLFdBQVcsUUFBd0IscUJBQWtCO0FBbUM5RCxPQUFPLFNBQVNDLFdBQVdDLEtBQWM7SUFDdkMsT0FDRUEsVUFBVUMsYUFDVkQsVUFBVSxRQUNWLEFBQUNBLE9BQWlCRSxPQUFPRCxhQUN6QixBQUFDRCxPQUFpQkcsU0FBU0Y7QUFFL0I7QUFFQSxPQUFPLE1BQU1HO0lBQ1hDLE9BQStCO0lBQy9CLGFBQWM7UUFDWixJQUFJLENBQUNBLE1BQU0sR0FBRyxJQUFJQztJQUNwQjtJQUVBQyxTQUFTQyxTQUFpQixFQUFhO1FBQ3JDLE1BQU1DLFFBQVEsSUFBSSxDQUFDSixNQUFNLENBQUNLLEdBQUcsQ0FBQ0Y7UUFDOUIsSUFBSUMsT0FBTztZQUNULE9BQU9BO1FBQ1Q7UUFFQSxNQUFNRSxZ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
|
|
408
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS91cHNlcnQtYnVpbGRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGlzQXJyYXksIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTmFpdGUgfSBmcm9tIFwiLi4vbmFpdGUvbmFpdGVcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VGb3JlaWduS2V5cywgRGF0YWJhc2VTY2hlbWFFeHRlbmQsIEVudGl0eUluZGV4IH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBhc3NlcnREZWZpbmVkLCBjaHVuaywgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IGJhdGNoVXBkYXRlLCB0eXBlIFJvd1dpdGhJZCB9IGZyb20gXCIuL19iYXRjaF91cGRhdGVcIjtcbmltcG9ydCB0eXBlIHsgQ29sdW1uS2V5cywgRm9yZWlnbktleUNvbHVtbnMsIFRhYmxlTmFtZSB9IGZyb20gXCIuL3B1cmkudHlwZXNcIjtcblxuLyoqXG4gKiBGSyDtg4DsnoUg7LaU66Gg7J2EIOychO2VtCBEYXRhYmFzZUZvcmVpZ25LZXlzIGV4cG9ydFxuICogKG1vZHVsZSBhdWdtZW50YXRpb24g7J6Q64+ZIOuhnOuTnCDrs7TsnqUpXG4gKi9cbmV4cG9ydCB0eXBlIHsgRGF0YWJhc2VGb3JlaWduS2V5cyB9O1xuXG50eXBlIEluaGVyaXRhYmxlQ29sdW1uczxUVGFibGUgZXh0ZW5kcyBUYWJsZU5hbWU8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+PiA9XG4gIFRUYWJsZSBleHRlbmRzIGtleW9mIERhdGFiYXNlU2NoZW1hRXh0ZW5kID8gQ29sdW1uS2V5czxEYXRhYmFzZVNjaGVtYUV4dGVuZFtUVGFibGVdPiA6IG5ldmVyO1xuXG4vLyDthYzsnbTruJQg642w7J207YSwIO2DgOyehVxudHlwZSBUYWJsZURhdGEgPSB7XG4gIHJlZmVyZW5jZXM6IFNldDxzdHJpbmc+O1xuICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuICB1bmlxdWVJbmRleGVzOiBFbnRpdHlJbmRleFtdO1xuICB1bmlxdWVzTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufTtcblxuLy8g7LC47KGwIO2VhOuTnCDtg4DsnoVcbmV4cG9ydCB0eXBlIFVCUmVmID0ge1xuICB1dWlkOiBzdHJpbmc7XG4gIG9mOiBzdHJpbmc7XG4gIHVzZT86IHN0cmluZztcbn07XG5cbi8vIHVwc2VydCDsmLXshZhcbmV4cG9ydCB0eXBlIFVwc2VydE9wdGlvbnM8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4gPSB7XG4gIGNodW5rU2l6ZT86IG51bWJlcjtcbiAgY2xlYW5PcnBoYW5zPzogRm9yZWlnbktleUNvbHVtbnM8VFRhYmxlPiB8IEZvcmVpZ25LZXlDb2x1bW5zPFRUYWJsZT5bXTtcbiAgaW5oZXJpdD86IEluaGVyaXRhYmxlQ29sdW1uczxUVGFibGU+W107XG59O1xuXG4vLyBpbnNlcnRPbmx5IOyYteyFmFxuZXhwb3J0IHR5cGUgSW5zZXJ0T25seU9wdGlvbnMgPSB7XG4gIGNodW5rU2l6ZT86IG51bWJlcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlZkZpZWxkKGZpZWxkOiB1bmtub3duKTogZmllbGQgaXMgVUJSZWYge1xuICByZXR1cm4gKFxuICAgIGZpZWxkICE9PSB1bmRlZmluZWQgJiZcbiAgICBmaWVsZCAhPT0gbnVsbCAmJlxuICAgIChmaWVsZCBhcyBVQlJlZik/Lm9mICE9PSB1bmRlZmluZWQgJiZcbiAgICAoZmllbGQgYXMgVUJSZWYpPy51dWlkICE9PSB1bmRlZmluZWRcbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIFVwc2VydEJ1aWxkZXIge1xuICB0YWJsZXM6IE1hcDxzdHJpbmcsIFRhYmxlRGF0YT47XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudGFibGVzID0gbmV3IE1hcCgpO1xuICB9XG5cbiAgZ2V0VGFibGUodGFibGVOYW1lOiBzdHJpbmcpOiBUYWJsZURhdGEge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy50YWJsZXMuZ2V0KHRhYmxlTmFtZSk7XG4gICAgaWYgKHRhYmxlKSB7XG4gICAgICByZXR1cm4gdGFibGU7XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGVTcGVjID0gKCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBFbnRpdHlNYW5hZ2VyLmdldFRhYmxlU3BlYyh0YWJsZU5hbWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICBjb25zdCB0YWJsZURhdGEgPSB7XG4gICAgICByZWZlcmVuY2VzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgIHJvd3M6IFtdLFxuICAgICAgdW5pcXVlSW5kZXhlczogdGFibGVTcGVjPy51bmlxdWVJbmRleGVzID8/IFtdLFxuICAgICAgdW5pcXVlc01hcDogbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSxcbiAgICB9O1xuICAgIHRoaXMudGFibGVzLnNldCh0YWJsZU5hbWUsIHRhYmxlRGF0YSk7XG4gICAgcmV0dXJuIHRhYmxlRGF0YTtcbiAgfVxuXG4gIGhhc1RhYmxlKHRhYmxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudGFibGVzLmhhcyh0YWJsZU5hbWUpO1xuICB9XG5cbiAgcmVnaXN0ZXI8VCBleHRlbmRzIHN0cmluZz4oXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgcm93OiB7XG4gICAgICBba2V5IGluIFRdPzogVUJSZWYgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50IHwgbnVsbCB8IG9iamVjdCB8IHVua25vd247XG4gICAgfSxcbiAgKTogVUJSZWYge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5nZXRUYWJsZSh0YWJsZU5hbWUpO1xuXG4gICAgLy8g7ZW064u5IO2FjOydtOu4lOydmCB1bmlxdWUg7J24642x7Iqk66W8IOyInO2ajO2VmOupsCDtgqQg7IOd7ISxXG4gICAgY29uc3QgdW5pcXVlS2V5cyA9IHRhYmxlLnVuaXF1ZUluZGV4ZXNcbiAgICAgIC5tYXAoKHVucUluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHVuaXF1ZUtleUFycmF5ID0gdW5xSW5kZXguY29sdW1ucy5tYXAoKHVucUNvbCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IHJvd1t1bnFDb2wubmFtZSBhcyBrZXlvZiB0eXBlb2Ygcm93XTtcbiAgICAgICAgICBpZiAoaXNSZWZGaWVsZCh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnV1aWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByb3dbdW5xQ29sLm5hbWUgYXMga2V5b2YgdHlwZW9mIHJvd10gPz8gcmFuZG9tVVVJRCgpOyAvLyBudWxsYWJsZeyduCDqsr3smrAgdXVpZOuhnCDrnpzrjaTqsJIg7IK97J6FXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyDqsJLsnbQg66qo65GQIG51bGzsnbgg6rK97JqwIO2CpCDsg53shLEg7Yyo7IqkXG4gICAgICAgIGlmICh1bmlxdWVLZXlBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5pcXVlS2V5QXJyYXkuam9pbihcIi0tLWRlbGltaXRlci0tXCIpO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuXG4gICAgLy8gdXVpZCDsg53shLEg66Gc7KeBXG4gICAgY29uc3QgeyB1dWlkLCBpc1JldXNlZCB9ID0gKCgpID0+IHtcbiAgICAgIC8vIO2CpOulvCDsiJztmoztlZjsl6wg7J2066+4IOyhtOyerO2VmOuKlCDtgqTqsIAg7J6I64qU7KeAIO2ZleyduFxuICAgICAgaWYgKHVuaXF1ZUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgICAgaWYgKHRhYmxlLnVuaXF1ZXNNYXAuaGFzKHVuaXF1ZUtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHV1aWQ6IGFzc2VydERlZmluZWQodGFibGUudW5pcXVlc01hcC5nZXQodW5pcXVlS2V5KSwgXCJVbmlxdWUga2V5IG5vdCBmb3VuZFwiKSxcbiAgICAgICAgICAgICAgaXNSZXVzZWQ6IHRydWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDssL7snYQg7IiYIOyXhuuKlCDqsr3smrAg7IOd7ISxXG4gICAgICByZXR1cm4geyB1dWlkOiByYW5kb21VVUlEKCksIGlzUmV1c2VkOiBmYWxzZSB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyDrqqjrk6Ag7Jyg64uI7YGs7YKk7JeQIOuMgO2VtCDsnKDri4jtgazrp7Xsl5AgdXVpZCDsoIDsnqVcbiAgICBpZiAodW5pcXVlS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICBmb3IgKGNvbnN0IHVuaXF1ZUtleSBvZiB1bmlxdWVLZXlzKSB7XG4gICAgICAgIHRhYmxlLnVuaXF1ZXNNYXAuc2V0KHVuaXF1ZUtleSwgdXVpZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7J20IO2FjOydtOu4lOyXkCDsgqzsmqnrkJwgUmVmRmllbGTrpbwg7Iic7ZqM7ZWY7JesLCDtmITsnqwg7YWM7J2067iUIOygleuztOyXkCDslrTrlqQg7ZWE65Oc66W8IOywuOyhsO2VmOuKlOyngCDstpTqsIBcbiAgICAvLyDsnbQg7KCV67O066W8IOuCmOykkeyXkCDsuZjtmZjtlaAg65WMIOyCrOyaqVxuICAgIHJvdyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHJvdykubWFwKChbcm93S2V5LCByb3dWYWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKGlzUmVmRmllbGQocm93VmFsdWUpKSB7XG4gICAgICAgICAgcm93VmFsdWUudXNlID8/PSBcImlkXCI7XG4gICAgICAgICAgdGFibGUucmVmZXJlbmNlcy5hZGQoYCR7cm93VmFsdWUub2Z9LiR7cm93VmFsdWUudXNlfWApO1xuICAgICAgICAgIHJldHVybiBbcm93S2V5LCByb3dWYWx1ZV07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJvd1ZhbHVlID09PSBcIm9iamVjdFwiICYmICEocm93VmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgIC8vIG9iamVjdOyduCDqsr3smrAgSlNPTuycvOuhnCDrs4DtmZhcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWUgPT09IG51bGwgPyBudWxsIDogSlNPTi5zdHJpbmdpZnkocm93VmFsdWUpXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW3Jvd0tleSwgcm93VmFsdWVdO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApIGFzIHsgW2tleSBpbiBUXT86IHVua25vd24gfTtcblxuICAgIHRhYmxlLnJvd3MucHVzaCh7XG4gICAgICB1dWlkLFxuICAgICAgLi4ucm93LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0OiBVQlJlZiA9IHtcbiAgICAgIG9mOiB0YWJsZU5hbWUsXG4gICAgICB1dWlkOiAocm93IGFzIHsgdXVpZD86IHN0cmluZyB9KS51dWlkID8/IHV1aWQsXG4gICAgfTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZ2lzdGVyXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHV1aWQ6IHJlc3VsdC51dWlkLFxuICAgICAgaXNVdWlkUmV1c2VkOiBpc1JldXNlZCxcbiAgICAgIHJvdyxcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyB1cHNlcnQ8VFRhYmxlIGV4dGVuZHMgVGFibGVOYW1lPERhdGFiYXNlU2NoZW1hRXh0ZW5kPj4oXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogVFRhYmxlLFxuICAgIG9wdGlvbnM/OiBVcHNlcnRPcHRpb25zPFRUYWJsZT4sXG4gICk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRPckluc2VydCh3ZGIsIHRhYmxlTmFtZSwgXCJ1cHNlcnRcIiwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyBpbnNlcnRPbmx5PFRUYWJsZSBleHRlbmRzIFRhYmxlTmFtZTxEYXRhYmFzZVNjaGVtYUV4dGVuZD4+KFxuICAgIHdkYjogS25leCxcbiAgICB0YWJsZU5hbWU6IFRUYWJsZSxcbiAgICBvcHRpb25zPzogSW5zZXJ0T25seU9wdGlvbnMsXG4gICk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICByZXR1cm4gdGhpcy51cHNlcnRPckluc2VydCh3ZGIsIHRhYmxlTmFtZSwgXCJpbnNlcnRcIiwgb3B0aW9ucyk7XG4gIH1cblxuICBhc3luYyB1cHNlcnRPckluc2VydDxUVGFibGUgZXh0ZW5kcyBUYWJsZU5hbWU8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+PihcbiAgICB3ZGI6IEtuZXgsXG4gICAgdGFibGVOYW1lOiBUVGFibGUsXG4gICAgbW9kZTogXCJ1cHNlcnRcIiB8IFwiaW5zZXJ0XCIsXG4gICAgb3B0aW9ucz86IFVwc2VydE9wdGlvbnM8VFRhYmxlPixcbiAgKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGlmICh0aGlzLmhhc1RhYmxlKHRhYmxlTmFtZSkgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAodGFibGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIO2FjOydtOu4lCAke3RhYmxlTmFtZX3sl5AgdXBzZXJ0IOyalOyyrWApO1xuICAgIH0gZWxzZSBpZiAodGFibGUucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV97JeQIHVwc2VydCDtlaAg642w7J207YSw6rCAIOyXhuyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0YWJsZS5yb3dzLnNvbWUoKHJvdykgPT5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMocm93KS5zb21lKChbLCB2YWx1ZV0pID0+IGlzUmVmRmllbGQodmFsdWUpICYmIHZhbHVlLm9mICE9PSB0YWJsZU5hbWUpLFxuICAgICAgKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RhYmxlTmFtZX0g7ZW06rKw65CY7KeAIOyViuydgCDssLjsobDqsIAg7J6I7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIC8vIOyghOyytCDthYzsnbTruJQg7Iic7ZqM7ZWY7JesIO2YhOyerCDthYzsnbTruJQg7LC47KGw7ZWY64qUIOuqqOuToCDthYzsnbTruJQg7LaU7LacXG4gICAgY29uc3QgeyByZWZlcmVuY2VzLCByZWZUYWJsZXMgfSA9IEFycmF5LmZyb20odGhpcy50YWJsZXMpLnJlZHVjZShcbiAgICAgIChyLCBbLCB0YWJsZV0pID0+IHtcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlID0gQXJyYXkuZnJvbSh0YWJsZS5yZWZlcmVuY2VzLnZhbHVlcygpKS5maW5kKChyZWYpID0+XG4gICAgICAgICAgcmVmLmluY2x1ZGVzKGAke3RhYmxlTmFtZX0uYCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZWZlcmVuY2UpIHtcbiAgICAgICAgICByLnJlZmVyZW5jZXMucHVzaChyZWZlcmVuY2UpO1xuICAgICAgICAgIHIucmVmVGFibGVzLnB1c2godGFibGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICByZWZlcmVuY2VzOiBbXSBhcyBzdHJpbmdbXSxcbiAgICAgICAgcmVmVGFibGVzOiBbXSBhcyBUYWJsZURhdGFbXSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCBleHRyYWN0RmllbGRzID0gdW5pcXVlKHJlZmVyZW5jZXMpXG4gICAgICAubWFwKChyZWZlcmVuY2UpID0+IHJlZmVyZW5jZS5zcGxpdChcIi5cIilbMV0pXG4gICAgICAuZmlsdGVyKChmaWVsZCk6IGZpZWxkIGlzIHN0cmluZyA9PiBmaWVsZCAhPT0gdW5kZWZpbmVkKTtcblxuICAgIC8vIOydmOyhtOyEsSDsiJzshJzsl5Ag65Sw6528IOugiOuyqOuzhCDqt7jro7ntmZQgKOyekOq4sCDssLjsobDqsIAg7JeG7Jy866m0IExldmVsIDAg7ZWY64KYKVxuICAgIGNvbnN0IHsgbGV2ZWxzLCBoYXNDaXJjdWxhciB9ID0gdGhpcy5idWlsZEluc2VydExldmVscyh0YWJsZS5yb3dzLCB0YWJsZU5hbWUpO1xuXG4gICAgaWYgKGhhc0NpcmN1bGFyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGFibGVOYW1lfeyXkCDsiJztmZgg7J6Q6riwIOywuOyhsOqwgCDsnojsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdXVpZE1hcCA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICAgIGNvbnN0IGFsbElkczogbnVtYmVyW10gPSBbXTtcblxuICAgIC8vIOugiOuyqOuzhOuhnCDsiJzssKgg7LKY66asXG4gICAgZm9yIChjb25zdCBsZXZlbFJvd3Mgb2YgbGV2ZWxzKSB7XG4gICAgICAvLyDsnbTsoIQg66CI67Ko7JeQ7IScIOyWu+ydgCBJROuhnCDsnpDquLAg7LC47KGwIO2VtOqysFxuICAgICAgY29uc3QgcmVzb2x2ZWRSb3dzID0gbGV2ZWxSb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0geyAuLi5yb3cgfTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocm93KSkge1xuICAgICAgICAgIGlmIChpc1JlZkZpZWxkKHZhbHVlKSAmJiB2YWx1ZS5vZiA9PT0gdGFibGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB1dWlkTWFwLmdldCh2YWx1ZS51dWlkKTtcblxuICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB1dWlkICR7dmFsdWUudXVpZH0gLS0gaW4gJHt0YWJsZU5hbWV9YCk7XG5cbiAgICAgICAgICAgIHJlc29sdmVkW2tleV0gPSAocGFyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVt2YWx1ZS51c2UgPz8gXCJpZFwiXTtcblxuICAgICAgICAgICAgTmFpdGUudChcInB1cmk6dWItcmVmLXJlc29sdmVkXCIsIHtcbiAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICBmaWVsZDoga2V5LFxuICAgICAgICAgICAgICBmcm9tOiB7IG9mOiB2YWx1ZS5vZiwgdXVpZDogdmFsdWUudXVpZCwgdXNlOiB2YWx1ZS51c2UgPz8gXCJpZFwiIH0sXG4gICAgICAgICAgICAgIHRvOiByZXNvbHZlZFtrZXldLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDtmITsnqwg66CI67KoIHVwc2VydFxuICAgICAgY29uc3QgY2h1bmtTaXplID0gb3B0aW9ucz8uY2h1bmtTaXplO1xuICAgICAgY29uc3QgbGV2ZWxDaHVua3MgPSBjaHVua1NpemUgPyBjaHVuayhyZXNvbHZlZFJvd3MsIGNodW5rU2l6ZSkgOiBbcmVzb2x2ZWRSb3dzXTtcbiAgICAgIGNvbnN0IHNlbGVjdEZpZWxkcyA9IHVuaXF1ZShbXCJpZFwiLCAuLi5leHRyYWN0RmllbGRzXSk7XG5cbiAgICAgIGZvciAoY29uc3QgZGF0YUNodW5rIG9mIGxldmVsQ2h1bmtzKSB7XG4gICAgICAgIGlmIChkYXRhQ2h1bmsubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAvLyB1dWlk66W8IOuzhOuPhOuhnCDrs7TqtIDtlZjqs6AsIERC7JeQIOyggOyepe2VoCDrjbDsnbTthLDsl5DshJwg7KCc6rGwXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVXVpZHMgPSBkYXRhQ2h1bmsubWFwKChyKSA9PiByLnV1aWQgYXMgc3RyaW5nKTtcbiAgICAgICAgY29uc3QgZGF0YUZvckRiID0gZGF0YUNodW5rLm1hcCgoeyB1dWlkLCAuLi5yZXN0IH0pID0+IHJlc3QpO1xuXG4gICAgICAgIGxldCByZXN1bHRSb3dzOiB7IGlkOiBudW1iZXI7IFtrZXk6IHN0cmluZ106IHVua25vd24gfVtdO1xuXG4gICAgICAgIGlmIChtb2RlID09PSBcImluc2VydFwiKSB7XG4gICAgICAgICAgLy8gSU5TRVJUIOuqqOuTnCAtIFJFVFVSTklORyDsgqzsmqlcbiAgICAgICAgICByZXN1bHRSb3dzID0gYXdhaXQgd2RiLmluc2VydChkYXRhRm9yRGIpLmludG8odGFibGVOYW1lKS5yZXR1cm5pbmcoc2VsZWN0RmllbGRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBVUFNFUlQg66qo65OcIC0gb25Db25mbGljdCDsgqzsmqkgKHVuaXF1ZSBpbmRleCDsl4bsnLzrqbQgUEsgZmFsbGJhY2spXG4gICAgICAgICAgY29uc3QgY29uZmxpY3RDb2x1bW5zID0gdGFibGUudW5pcXVlSW5kZXhlc1swXT8uY29sdW1ucy5tYXAoKGMpID0+IGMubmFtZSkgPz8gW1wiaWRcIl07XG5cbiAgICAgICAgICBjb25zdCBhbGxDb2x1bW5zID0gT2JqZWN0LmtleXMoZGF0YUZvckRiWzBdKTtcbiAgICAgICAgICBsZXQgdXBkYXRlQ29sdW1ucyA9IGFsbENvbHVtbnMuZmlsdGVyKChjKSA9PiAhY29uZmxpY3RDb2x1bW5zLmluY2x1ZGVzKGMpKTtcblxuICAgICAgICAgIC8vIGluaGVyaXQg7Ji17IWYIOyymOumrCAtIGluaGVyaXQg7Lus65+87J2AIHVwZGF0ZSDrjIDsg4Hsl5DshJwg7KCc7Jm4XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LmluaGVyaXQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgaW5oZXJpdENvbHVtbnMgPSBvcHRpb25zLmluaGVyaXQgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkRnJvbVVwZGF0ZSA9IHVwZGF0ZUNvbHVtbnMuZmlsdGVyKChjKSA9PiBpbmhlcml0Q29sdW1ucy5pbmNsdWRlcyhjKSk7XG4gICAgICAgICAgICB1cGRhdGVDb2x1bW5zID0gdXBkYXRlQ29sdW1ucy5maWx0ZXIoKGMpID0+ICFpbmhlcml0Q29sdW1ucy5pbmNsdWRlcyhjKSk7XG5cbiAgICAgICAgICAgIC8vIOyLpOygnOuhnCDsoJzsmbjrkJwg7Lus65+8IOuhnOq5hVxuICAgICAgICAgICAgaWYgKGV4Y2x1ZGVkRnJvbVVwZGF0ZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgTmFpdGUudChcInB1cmk6dWItaW5oZXJpdFwiLCB7XG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIGluaGVyaXRDb2x1bW5zLFxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVkRnJvbVVwZGF0ZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gdXBkYXRlQ29sdW1uc+qwgCDruYTslrTsnojslrTrj4QgbWVyZ2UoKeulvCDsgqzsmqntlZjsl6wg66qo65OgIO2WieydtCBSRVRVUk5JTkfrkJjrj4TroZ0g67O07J6lXG4gICAgICAgICAgY29uc3QgbWVyZ2VDb2x1bW5zID0gdXBkYXRlQ29sdW1ucy5sZW5ndGggPyB1cGRhdGVDb2x1bW5zIDogY29uZmxpY3RDb2x1bW5zO1xuXG4gICAgICAgICAgcmVzdWx0Um93cyA9IGF3YWl0IHdkYlxuICAgICAgICAgICAgLmluc2VydChkYXRhRm9yRGIpXG4gICAgICAgICAgICAuaW50byh0YWJsZU5hbWUpXG4gICAgICAgICAgICAub25Db25mbGljdChjb25mbGljdENvbHVtbnMpXG4gICAgICAgICAgICAubWVyZ2UobWVyZ2VDb2x1bW5zKVxuICAgICAgICAgICAgLnJldHVybmluZyhzZWxlY3RGaWVsZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9yaWdpbmFsVXVpZHMubGVuZ3RoICE9PSByZXN1bHRSb3dzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0YWJsZU5hbWV9OiByZWdpc3Rlci9yZXR1cm5pbmcg67aI7J287LmYYCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdFJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB1dWlkTWFwLnNldChvcmlnaW5hbFV1aWRzW2ldLCByZXN1bHRSb3dzW2ldKTtcbiAgICAgICAgICBhbGxJZHMucHVzaChyZXN1bHRSb3dzW2ldLmlkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2VtOuLuSDthYzsnbTruJQg7LC47KGw66W8IOyLpOygnCDrsLjrpZjroZwg67OA6rK9XG4gICAgZm9yIChjb25zdCB0YWJsZSBvZiByZWZUYWJsZXMpIHtcbiAgICAgIHRhYmxlLnJvd3MgPSB0YWJsZS5yb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJvdykpIHtcbiAgICAgICAgICBjb25zdCBwcm9wID0gcm93W2tleV07XG4gICAgICAgICAgaWYgKGlzUmVmRmllbGQocHJvcCkgJiYgcHJvcC5vZiA9PT0gdGFibGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSB1dWlkTWFwLmdldChwcm9wLnV1aWQpO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihwcm9wKTtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHV1aWQgJHtwcm9wLnV1aWR9IC0tIGluICR7dGFibGVOYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRWYWx1ZSA9IChwYXJlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3Byb3AudXNlID8/IFwiaWRcIl07XG4gICAgICAgICAgICByb3dba2V5XSA9IHJlc29sdmVkVmFsdWU7XG5cbiAgICAgICAgICAgIE5haXRlLnQoXCJwdXJpOnViLXJlZi1yZXNvbHZlZFwiLCB7XG4gICAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgZmllbGQ6IGtleSxcbiAgICAgICAgICAgICAgZnJvbTogeyBvZjogcHJvcC5vZiwgdXVpZDogcHJvcC51dWlkLCB1c2U6IHByb3AudXNlID8/IFwiaWRcIiB9LFxuICAgICAgICAgICAgICB0bzogcmVzb2x2ZWRWYWx1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnM/LmNsZWFuT3JwaGFucykge1xuICAgICAgY29uc3QgY2xlYW5PcnBoYW5zID0gb3B0aW9ucy5jbGVhbk9ycGhhbnM7XG4gICAgICBjb25zdCBma0NvbHVtbnMgPSBpc0FycmF5KGNsZWFuT3JwaGFucylcbiAgICAgICAgPyAoY2xlYW5PcnBoYW5zIGFzIEZvcmVpZ25LZXlDb2x1bW5zPFRUYWJsZT5bXSlcbiAgICAgICAgOiBbY2xlYW5PcnBoYW5zIGFzIEZvcmVpZ25LZXlDb2x1bW5zPFRUYWJsZT5dO1xuXG4gICAgICAvLyDtmITsnqwgcmVnaXN0ZXLrkJwg66CI7L2U65Oc65Ok7J2YIEZLIOqwkuuTpCDstpTstpxcbiAgICAgIGNvbnN0IGZrQ29uZGl0aW9ucyA9IGZrQ29sdW1ucy5tYXAoKGZrQ29sKSA9PiB7XG4gICAgICAgIGNvbnN0IGZrVmFsdWVzID0gWy4uLm5ldyBTZXQodGFibGUucm93cy5tYXAoKHJvdykgPT4gcm93W2ZrQ29sXSkuZmlsdGVyKCh2KSA9PiB2ICE9IG51bGwpKV07XG4gICAgICAgIHJldHVybiB7IGNvbHVtbjogZmtDb2wsIHZhbHVlczogZmtWYWx1ZXMgfTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrk6AgRksg7Lus65+87JeQIOqwkuydtCDsnojripQg6rK97Jqw7JeQ66eMIOyCreygnCDsi6TtlolcbiAgICAgIGlmIChma0NvbmRpdGlvbnMuZXZlcnkoKGZjKSA9PiBmYy52YWx1ZXMubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgbGV0IGRlbGV0ZVF1ZXJ5ID0gd2RiKHRhYmxlTmFtZSk7XG5cbiAgICAgICAgLy8g6rCBIEZLIOy7rOufvOyXkCDrjIDtlZwgV0hFUkUgSU4g7KGw6rG0IOy2lOqwgFxuICAgICAgICBmb3IgKGNvbnN0IHsgY29sdW1uLCB2YWx1ZXMgfSBvZiBma0NvbmRpdGlvbnMpIHtcbiAgICAgICAgICBkZWxldGVRdWVyeSA9IGRlbGV0ZVF1ZXJ5LndoZXJlSW4oY29sdW1uLCB2YWx1ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g67Cp6riIIHVwc2VydO2VnCBJROuKlCDsoJzsmbhcbiAgICAgICAgZGVsZXRlUXVlcnkgPSBkZWxldGVRdWVyeS53aGVyZU5vdEluKFwiaWRcIiwgYWxsSWRzKTtcblxuICAgICAgICBjb25zdCBkZWxldGVkQ291bnQgPSBhd2FpdCBkZWxldGVRdWVyeS5kZWxldGUoKTtcblxuICAgICAgICBOYWl0ZS50KFwicHVyaTp1Yi1jbGVhbi1vcnBoYW5zXCIsIHtcbiAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgY2xlYW5PcnBoYW5zOiBma0NvbHVtbnMsXG4gICAgICAgICAgZGVsZXRlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlbTri7kg7YWM7J2067iU7J2YIOuNsOydtO2EsCDstIjquLDtmZRcbiAgICB0YWJsZS5yb3dzID0gW107XG4gICAgdGFibGUucmVmZXJlbmNlcy5jbGVhcigpO1xuICAgIHRhYmxlLnVuaXF1ZXNNYXAuY2xlYXIoKTtcblxuICAgIE5haXRlLnQoXCJwdXJpOnViLXVwc2VydGVkXCIsIHtcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIG1vZGUsXG4gICAgICByb3dDb3VudDogYWxsSWRzLmxlbmd0aCxcbiAgICAgIHJldHVybmVkSWRzOiBhbGxJZHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWxsSWRzO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQmF0Y2goXG4gICAgd2RiOiBLbmV4LFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBjaHVua1NpemU/OiBudW1iZXI7XG4gICAgICB3aGVyZT86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY2h1bmtTaXplOiBvcHRpb25zPy5jaHVua1NpemUgPz8gNTAwLFxuICAgICAgd2hlcmU6IG9wdGlvbnM/LndoZXJlID8/IFwiaWRcIixcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuaGFzVGFibGUodGFibGVOYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLnRhYmxlcy5nZXQodGFibGVOYW1lKTtcbiAgICBpZiAoIXRhYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOuTseuhneuQmOyngCDslYrsnYAg7YWM7J2067iUICR7dGFibGVOYW1lfeyXkCB1cGRhdGVCYXRjaCDsmpTssq1gKTtcbiAgICB9IGVsc2UgaWYgKHRhYmxlLnJvd3MubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2hlcmVDb2x1bW5zID0gQXJyYXkuaXNBcnJheShvcHRpb25zLndoZXJlKSA/IG9wdGlvbnMud2hlcmUgOiBbb3B0aW9ucy53aGVyZSA/PyBcImlkXCJdO1xuICAgIGNvbnN0IHJvd3MgPSB0YWJsZS5yb3dzLm1hcCgoX3JvdykgPT4ge1xuICAgICAgY29uc3QgeyB1dWlkOiBfLCAuLi5yb3cgfSA9IF9yb3c7IC8vIHV1aWQg7KCc7Jm4XG4gICAgICByZXR1cm4gcm93IGFzIFJvd1dpdGhJZDxzdHJpbmc+O1xuICAgIH0pO1xuXG4gICAgYXdhaXQgYmF0Y2hVcGRhdGUod2RiLCB0YWJsZU5hbWUsIHdoZXJlQ29sdW1ucywgcm93cywgb3B0aW9ucy5jaHVua1NpemUpO1xuXG4gICAgTmFpdGUudChcInB1cmk6dWItYmF0Y2gtdXBkYXRlZFwiLCB7XG4gICAgICB0YWJsZU5hbWUsXG4gICAgICByb3dDb3VudDogcm93cy5sZW5ndGgsXG4gICAgICB3aGVyZUNvbHVtbnMsXG4gICAgfSk7XG5cbiAgICAvLyB1cGRhdGVCYXRjaCDsmYTro4wg7ZuEIOyymOumrOuQnCDrjbDsnbTthLAg7KCc6rGwXG4gICAgdGFibGUucm93cyA9IFtdO1xuICAgIHRhYmxlLnJlZmVyZW5jZXMuY2xlYXIoKTtcbiAgICB0YWJsZS51bmlxdWVzTWFwLmNsZWFyKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFByaXZhdGUgSGVscGVyIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiByb3dz66W8IOydmOyhtOyEsSDsiJzshJzsl5Ag65Sw6528IOugiOuyqOuzhOuhnCDqt7jro7ntmZRcbiAgICogLSDsnpDquLAg7LC47KGwIOyXhuuKlCDqsr3smrAgOiDrqqjrk6Agcm93c+qwgCBMZXZlbCAwXG4gICAqIC0g7J6Q6riwIOywuOyhsCDsnojripQg6rK97JqwIDog7J6Q6riwIOywuOyhsCDqtIDqs4Trpbwg7JyE7IOBIOygleugrO2VmOyXrCDroIjrsqjrs4TroZwg6re466O57ZmUXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkSW5zZXJ0TGV2ZWxzKFxuICAgIHJvd3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICk6IHsgbGV2ZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdW107IGhhc0NpcmN1bGFyOiBib29sZWFuIH0ge1xuICAgIC8vIDEuIOyekOq4sCDssLjsobDqsIAg7JeG7Jy866m0IO2VnCDroIjrsqjroZwg7LKY66asXG4gICAgY29uc3QgaGFzU2VsZlJlZiA9IHJvd3NcbiAgICAgIC5mbGF0TWFwKChyb3cpID0+IE9iamVjdC52YWx1ZXMocm93KSlcbiAgICAgIC5zb21lKCh2YWx1ZSkgPT4gaXNSZWZGaWVsZCh2YWx1ZSkgJiYgdmFsdWUub2YgPT09IHRhYmxlTmFtZSk7XG4gICAgaWYgKCFoYXNTZWxmUmVmKSByZXR1cm4geyBsZXZlbHM6IFtyb3dzXSwgaGFzQ2lyY3VsYXI6IGZhbHNlIH07XG5cbiAgICAvLyAyLiB1dWlkIOKGkiByb3cg66ek7ZWRICjspJHrs7UgdXVpZCDrsKnsp4ApXG4gICAgY29uc3Qgcm93QnlVdWlkID0gbmV3IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGNvbnN0IHV1aWQgPSByb3cudXVpZCBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIXV1aWQpIHRocm93IG5ldyBFcnJvcihgYnVpbGRJbnNlcnRMZXZlbHM6IHV1aWTqsIAg7JeG64qUIHJvdyAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgIHJvd0J5VXVpZC5zZXQodXVpZCwgcm93KTtcbiAgICB9XG5cbiAgICBsZXQgcGVuZGluZyA9IEFycmF5LmZyb20ocm93QnlVdWlkLnZhbHVlcygpKTtcbiAgICBjb25zdCBsZXZlbHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W11bXSA9IFtdO1xuICAgIGNvbnN0IGluc2VydGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICAvLyAzLiDroIjrsqjrs4Qg67aE66WYXG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY3VycmVudExldmVsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG4gICAgICBjb25zdCBuZXh0UGVuZGluZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBwZW5kaW5nKSB7XG4gICAgICAgIC8vIOydtCByb3fqsIAg7LC47KGw7ZWY64qUIOyekOq4sCDssLjsobDrk6RcbiAgICAgICAgY29uc3Qgc2VsZlJlZnMgPSBPYmplY3QudmFsdWVzKHJvdykuZmlsdGVyKFxuICAgICAgICAgICh2YWx1ZSkgPT4gaXNSZWZGaWVsZCh2YWx1ZSkgJiYgdmFsdWUub2YgPT09IHRhYmxlTmFtZSxcbiAgICAgICAgKSBhcyBVQlJlZltdO1xuXG4gICAgICAgIC8vIOywuOyhsO2VmOuKlCDrqqjrk6AgdXVpZOqwgCDsnbTrr7ggaW5zZXJ0ZWTsl5Ag7J6I7Ja07JW8IOydtOuyiCDroIjrsqjsl5Ag7Y+s7ZWoXG4gICAgICAgIGNvbnN0IGNhbkluc2VydCA9IHNlbGZSZWZzLmV2ZXJ5KChyZWYpID0+IHtcbiAgICAgICAgICBpZiAoIXJvd0J5VXVpZC5oYXMocmVmLnV1aWQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgdXVpZCAke3JlZi51dWlkfSAtLSBpbiAke3RhYmxlTmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGluc2VydGVkLmhhcyhyZWYudXVpZCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjYW5JbnNlcnQpIHtcbiAgICAgICAgICBjdXJyZW50TGV2ZWwucHVzaChyb3cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHRQZW5kaW5nLnB1c2gocm93KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDsiJztmZgg7LC47KGwIOqwkOyngFxuICAgICAgaWYgKGN1cnJlbnRMZXZlbC5sZW5ndGggPT09IDApIHJldHVybiB7IGxldmVsczogW10sIGhhc0NpcmN1bGFyOiB0cnVlIH07XG5cbiAgICAgIC8vIOugiOuyqCDtmZXsoJUgKyBpbnNlcnRlZCDqsLHsi6BcbiAgICAgIGxldmVscy5wdXNoKGN1cnJlbnRMZXZlbCk7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBjdXJyZW50TGV2ZWwpIHtcbiAgICAgICAgaW5zZXJ0ZWQuYWRkKHJvdy51dWlkIGFzIHN0cmluZyk7XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmcgPSBuZXh0UGVuZGluZztcbiAgICB9XG5cbiAgICByZXR1cm4geyBsZXZlbHMsIGhhc0NpcmN1bGFyOiBmYWxzZSB9O1xuICB9XG59XG4iXSwibmFtZXMiOlsicmFuZG9tVVVJRCIsImlzQXJyYXkiLCJ1bmlxdWUiLCJFbnRpdHlNYW5hZ2VyIiwiTmFpdGUiLCJhc3NlcnREZWZpbmVkIiwiY2h1bmsiLCJub25OdWxsYWJsZSIsImJhdGNoVXBkYXRlIiwiaXNSZWZGaWVsZCIsImZpZWxkIiwidW5kZWZpbmVkIiwib2YiLCJ1dWlkIiwiVXBzZXJ0QnVpbGRlciIsInRhYmxlcyIsIk1hcCIsImdldFRhYmxlIiwidGFibGVOYW1lIiwidGFibGUiLCJnZXQiLCJ0YWJsZVNwZWMiLCJnZXRUYWJsZVNwZWMiLCJ0YWJsZURhdGEiLCJyZWZlcmVuY2VzIiwiU2V0Iiwicm93cyIsInVuaXF1ZUluZGV4ZXMiLCJ1bmlxdWVzTWFwIiwic2V0IiwiaGFzVGFibGUiLCJoYXMiLCJyZWdpc3RlciIsInJvdyIsInVuaXF1ZUtleXMiLCJtYXAiLCJ1bnFJbmRleCIsInVuaXF1ZUtleUFycmF5IiwiY29sdW1ucyIsInVucUNvbCIsInZhbCIsIm5hbWUiLCJsZW5ndGgiLCJqb2luIiwiZmlsdGVyIiwiaXNSZXVzZWQiLCJ1bmlxdWVLZXkiLCJPYmplY3QiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJyb3dLZXkiLCJyb3dWYWx1ZSIsInVzZSIsImFkZCIsIkRhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwicHVzaCIsInJlc3VsdCIsInQiLCJpc1V1aWRSZXVzZWQiLCJ1cHNlcnQiLCJ3ZGIiLCJvcHRpb25zIiwidXBzZXJ0T3JJbnNlcnQiLCJpbnNlcnRPbmx5IiwibW9kZSIsIkVycm9yIiwic29tZSIsInZhbHVlIiwicmVmVGFibGVzIiwiQXJyYXkiLCJmcm9tIiwicmVkdWNlIiwiciIsInJlZmVyZW5jZSIsInZhbHVlcyIsImZpbmQiLCJyZWYiLCJpbmNsdWRlcyIsImV4dHJhY3RGaWVsZHMiLCJzcGxpdCIsImxldmVscyIsImhhc0NpcmN1bGFyIiwiYnVpbGRJbnNlcnRMZXZlbHMiLCJ1dWlkTWFwIiwiYWxsSWRzIiwibGV2ZWxSb3dzIiwicmVzb2x2ZWRSb3dzIiwicmVzb2x2ZWQiLCJrZXkiLCJwYXJlbnQiLCJ0byIsImNodW5rU2l6ZSIsImxldmVsQ2h1bmtzIiwic2VsZWN0RmllbGRzIiwiZGF0YUNodW5rIiwib3JpZ2luYWxVdWlkcyIsImRhdGFGb3JEYiIsInJlc3QiLCJyZXN1bHRSb3dzIiwiaW5zZXJ0IiwiaW50byIsInJldHVybmluZyIsImNvbmZsaWN0Q29sdW1ucyIsImMiLCJhbGxDb2x1bW5zIiwia2V5cyIsInVwZGF0ZUNvbHVtbnMiLCJpbmhlcml0IiwiaW5oZXJpdENvbHVtbnMiLCJleGNsdWRlZEZyb21VcGRhdGUiLCJtZXJnZUNvbHVtbnMiLCJvbkNvbmZsaWN0IiwibWVyZ2UiLCJpIiwiaWQiLCJwcm9wIiwiY29uc29sZSIsImVycm9yIiwicmVzb2x2ZWRWYWx1ZSIsImNsZWFuT3JwaGFucyIsImZrQ29sdW1ucyIsImZrQ29uZGl0aW9ucyIsImZrQ29sIiwiZmtWYWx1ZXMiLCJ2IiwiY29sdW1uIiwiZXZlcnkiLCJmYyIsImRlbGV0ZVF1ZXJ5Iiwid2hlcmVJbiIsIndoZXJlTm90SW4iLCJkZWxldGVkQ291bnQiLCJkZWxldGUiLCJjbGVhciIsInJvd0NvdW50IiwicmV0dXJuZWRJZHMiLCJ1cGRhdGVCYXRjaCIsIndoZXJlIiwid2hlcmVDb2x1bW5zIiwiX3JvdyIsIl8iLCJoYXNTZWxmUmVmIiwiZmxhdE1hcCIsInJvd0J5VXVpZCIsInBlbmRpbmciLCJpbnNlcnRlZCIsImN1cnJlbnRMZXZlbCIsIm5leHRQZW5kaW5nIiwic2VsZlJlZnMiLCJjYW5JbnNlcnQiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxTQUFTO0FBRXBDLFNBQVNDLE9BQU8sRUFBRUMsTUFBTSxRQUFRLFVBQVU7QUFDMUMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBRXZDLFNBQVNDLGFBQWEsRUFBRUMsS0FBSyxFQUFFQyxXQUFXLFFBQVEsb0JBQWlCO0FBQ25FLFNBQVNDLFdBQVcsUUFBd0IscUJBQWtCO0FBdUM5RCxPQUFPLFNBQVNDLFdBQVdDLEtBQWM7SUFDdkMsT0FDRUEsVUFBVUMsYUFDVkQsVUFBVSxRQUNWLEFBQUNBLE9BQWlCRSxPQUFPRCxhQUN6QixBQUFDRCxPQUFpQkcsU0FBU0Y7QUFFL0I7QUFFQSxPQUFPLE1BQU1HO0lBQ1hDLE9BQStCO0lBQy9CLGFBQWM7UUFDWixJQUFJLENBQUNBLE1BQU0sR0FBRyxJQUFJQztJQUNwQjtJQUVBQyxTQUFTQyxTQUFpQixFQUFhO1FBQ3JDLE1BQU1DLFFBQVEsSUFBSSxDQUFDSixNQUFNLENBQUNLLEdBQUcsQ0FBQ0Y7UUFDOUIsSUFBSUMsT0FBTztZQUNULE9BQU9BO1FBQ1Q7UUFFQSxNQUFNRSxZQUFZLEFBQUMsQ0FBQTtZ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
|
|
@@ -2,13 +2,16 @@
|
|
|
2
2
|
* NaiteReporter
|
|
3
3
|
*
|
|
4
4
|
* 테스트 결과와 Trace 정보를 Unix Socket으로 VS Code extension에 전달합니다.
|
|
5
|
-
* extension이 ~/.sonamu/naite.sock에 소켓 서버를 열어둡니다.
|
|
5
|
+
* extension이 ~/.sonamu/naite-{hash}.sock에 소켓 서버를 열어둡니다.
|
|
6
|
+
*
|
|
7
|
+
* 프로젝트별로 고유한 소켓을 사용하기 위해 sonamu.config.ts 경로의 해시를 사용합니다.
|
|
6
8
|
*
|
|
7
9
|
* fs mock 충돌을 피하기 위해 net 모듈만 사용합니다.
|
|
8
10
|
*/
|
|
9
11
|
/** biome-ignore-all lint/suspicious/noExplicitAny: Naite는 expect와 호응하도록 any를 허용함 */
|
|
10
12
|
import type { NaiteMessagingTypes } from "./messaging-types";
|
|
11
13
|
declare class NaiteReporterClass {
|
|
14
|
+
private socketPath;
|
|
12
15
|
private socket;
|
|
13
16
|
private connected;
|
|
14
17
|
private buffer;
|
|
@@ -24,17 +27,17 @@ declare class NaiteReporterClass {
|
|
|
24
27
|
* beforeAll에서 호출합니다.
|
|
25
28
|
* 테스트 run 시작을 알립니다 (데이터 클리어 신호).
|
|
26
29
|
*/
|
|
27
|
-
startTestRun(): void
|
|
30
|
+
startTestRun(): Promise<void>;
|
|
28
31
|
/**
|
|
29
32
|
* afterEach에서 호출합니다.
|
|
30
33
|
* 테스트 케이스 결과를 traces와 함께 전송합니다.
|
|
31
34
|
*/
|
|
32
|
-
reportTestResult(result: Omit<NaiteMessagingTypes.TestResult, "receivedAt">): void
|
|
35
|
+
reportTestResult(result: Omit<NaiteMessagingTypes.TestResult, "receivedAt">): Promise<void>;
|
|
33
36
|
/**
|
|
34
37
|
* afterAll에서 호출합니다.
|
|
35
38
|
* 테스트 run 종료를 알립니다.
|
|
36
39
|
*/
|
|
37
|
-
endTestRun(): void
|
|
40
|
+
endTestRun(): Promise<void>;
|
|
38
41
|
}
|
|
39
42
|
export declare const NaiteReporter: NaiteReporterClass;
|
|
40
43
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"naite-reporter.d.ts","sourceRoot":"","sources":["../../src/naite/naite-reporter.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"naite-reporter.d.ts","sourceRoot":"","sources":["../../src/naite/naite-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,oFAAoF;AAOpF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAyB7D,cAAM,kBAAkB;IACtB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAgB;IAE9B;;OAEG;YACW,gBAAgB;IAmC9B;;OAEG;YACW,IAAI;IAalB;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;;OAGG;IACG,gBAAgB,CACpB,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC;IAYhB;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAiBlC;AAED,eAAO,MAAM,aAAa,oBAA2B,CAAC"}
|
|
@@ -2,24 +2,48 @@
|
|
|
2
2
|
* NaiteReporter
|
|
3
3
|
*
|
|
4
4
|
* 테스트 결과와 Trace 정보를 Unix Socket으로 VS Code extension에 전달합니다.
|
|
5
|
-
* extension이 ~/.sonamu/naite.sock에 소켓 서버를 열어둡니다.
|
|
5
|
+
* extension이 ~/.sonamu/naite-{hash}.sock에 소켓 서버를 열어둡니다.
|
|
6
|
+
*
|
|
7
|
+
* 프로젝트별로 고유한 소켓을 사용하기 위해 sonamu.config.ts 경로의 해시를 사용합니다.
|
|
6
8
|
*
|
|
7
9
|
* fs mock 충돌을 피하기 위해 net 모듈만 사용합니다.
|
|
8
|
-
*/ /** biome-ignore-all lint/suspicious/noExplicitAny: Naite는 expect와 호응하도록 any를 허용함 */ import {
|
|
10
|
+
*/ /** biome-ignore-all lint/suspicious/noExplicitAny: Naite는 expect와 호응하도록 any를 허용함 */ import { createHash } from "crypto";
|
|
11
|
+
import { connect } from "net";
|
|
9
12
|
import { homedir } from "os";
|
|
10
13
|
import { join } from "path";
|
|
11
|
-
|
|
12
|
-
|
|
14
|
+
import { findApiRootPath } from "../utils/utils.js";
|
|
15
|
+
/**
|
|
16
|
+
* sonamu.config.ts 경로를 받아서 프로젝트별 고유 해시를 생성합니다.
|
|
17
|
+
* 익스텐션과 동일한 방식으로 계산해야 합니다.
|
|
18
|
+
*/ function getProjectHash(configPath) {
|
|
19
|
+
return createHash("md5").update(configPath).digest("hex").slice(0, 8);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 현재 프로젝트의 소켓 경로를 계산합니다.
|
|
23
|
+
* Sonamu.apiRootPath가 설정된 후에 호출해야 합니다.
|
|
24
|
+
*/ function getSocketPath() {
|
|
25
|
+
// sonamu.config.ts의 절대 경로 계산
|
|
26
|
+
// apiRootPath는 /project/api 형태이고, config는 /project/api/src/sonamu.config.ts에 있음
|
|
27
|
+
const configPath = join(findApiRootPath(), "src", "sonamu.config.ts");
|
|
28
|
+
const hash = getProjectHash(configPath);
|
|
29
|
+
return process.platform === "win32" ? `\\\\.\\pipe\\naite-${hash}` : join(homedir(), ".sonamu", `naite-${hash}.sock`);
|
|
30
|
+
}
|
|
13
31
|
class NaiteReporterClass {
|
|
32
|
+
socketPath = null;
|
|
14
33
|
socket = null;
|
|
15
34
|
connected = false;
|
|
16
35
|
buffer = [];
|
|
17
36
|
/**
|
|
18
37
|
* 소켓 연결 시도
|
|
19
|
-
*/ ensureConnection() {
|
|
20
|
-
if (this.connected || this.socket)
|
|
21
|
-
|
|
22
|
-
|
|
38
|
+
*/ async ensureConnection() {
|
|
39
|
+
if (this.connected || this.socket) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
return new Promise((res, rej)=>{
|
|
43
|
+
if (!this.socketPath) {
|
|
44
|
+
this.socketPath = getSocketPath();
|
|
45
|
+
}
|
|
46
|
+
this.socket = connect(this.socketPath);
|
|
23
47
|
this.socket.on("connect", ()=>{
|
|
24
48
|
this.connected = true;
|
|
25
49
|
// 버퍼에 쌓인 메시지 전송
|
|
@@ -27,25 +51,25 @@ class NaiteReporterClass {
|
|
|
27
51
|
this.socket?.write(msg);
|
|
28
52
|
}
|
|
29
53
|
this.buffer = [];
|
|
54
|
+
res();
|
|
30
55
|
});
|
|
31
|
-
this.socket.on("error", ()=>{
|
|
56
|
+
this.socket.on("error", (e)=>{
|
|
32
57
|
// 연결 실패 무시 (extension이 꺼져있을 수 있음)
|
|
33
58
|
this.connected = false;
|
|
34
59
|
this.socket = null;
|
|
60
|
+
rej(e);
|
|
35
61
|
});
|
|
36
62
|
this.socket.on("close", ()=>{
|
|
37
63
|
this.connected = false;
|
|
38
64
|
this.socket = null;
|
|
39
65
|
});
|
|
40
|
-
}
|
|
41
|
-
// 연결 실패 무시
|
|
42
|
-
}
|
|
66
|
+
});
|
|
43
67
|
}
|
|
44
68
|
/**
|
|
45
69
|
* 메시지 전송 (줄바꿈으로 구분)
|
|
46
|
-
*/ send(data) {
|
|
70
|
+
*/ async send(data) {
|
|
47
71
|
const msg = `${JSON.stringify(data)}\n`;
|
|
48
|
-
this.ensureConnection();
|
|
72
|
+
await this.ensureConnection().catch((_)=>{});
|
|
49
73
|
if (this.connected && this.socket) {
|
|
50
74
|
this.socket.write(msg);
|
|
51
75
|
} else {
|
|
@@ -56,11 +80,11 @@ class NaiteReporterClass {
|
|
|
56
80
|
/**
|
|
57
81
|
* beforeAll에서 호출합니다.
|
|
58
82
|
* 테스트 run 시작을 알립니다 (데이터 클리어 신호).
|
|
59
|
-
*/ startTestRun() {
|
|
83
|
+
*/ async startTestRun() {
|
|
60
84
|
if (process.env.CI) {
|
|
61
85
|
return;
|
|
62
86
|
}
|
|
63
|
-
this.send({
|
|
87
|
+
await this.send({
|
|
64
88
|
type: "run/start",
|
|
65
89
|
startedAt: new Date().toISOString()
|
|
66
90
|
});
|
|
@@ -68,11 +92,11 @@ class NaiteReporterClass {
|
|
|
68
92
|
/**
|
|
69
93
|
* afterEach에서 호출합니다.
|
|
70
94
|
* 테스트 케이스 결과를 traces와 함께 전송합니다.
|
|
71
|
-
*/ reportTestResult(result) {
|
|
95
|
+
*/ async reportTestResult(result) {
|
|
72
96
|
if (process.env.CI) {
|
|
73
97
|
return;
|
|
74
98
|
}
|
|
75
|
-
this.send({
|
|
99
|
+
await this.send({
|
|
76
100
|
type: "test/result",
|
|
77
101
|
receivedAt: new Date().toISOString(),
|
|
78
102
|
...result
|
|
@@ -81,11 +105,11 @@ class NaiteReporterClass {
|
|
|
81
105
|
/**
|
|
82
106
|
* afterAll에서 호출합니다.
|
|
83
107
|
* 테스트 run 종료를 알립니다.
|
|
84
|
-
*/ endTestRun() {
|
|
108
|
+
*/ async endTestRun() {
|
|
85
109
|
if (process.env.CI) {
|
|
86
110
|
return;
|
|
87
111
|
}
|
|
88
|
-
this.send({
|
|
112
|
+
await this.send({
|
|
89
113
|
type: "run/end",
|
|
90
114
|
endedAt: new Date().toISOString()
|
|
91
115
|
});
|
|
@@ -99,4 +123,4 @@ class NaiteReporterClass {
|
|
|
99
123
|
}
|
|
100
124
|
export const NaiteReporter = new NaiteReporterClass();
|
|
101
125
|
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uYWl0ZS9uYWl0ZS1yZXBvcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE5haXRlUmVwb3J0ZXJcbiAqXG4gKiDthYzsiqTtirgg6rKw6rO87JmAIFRyYWNlIOygleuztOulvCBVbml4IFNvY2tldOycvOuhnCBWUyBDb2RlIGV4dGVuc2lvbuyXkCDsoITri6ztlanri4jri6QuXG4gKiBleHRlbnNpb27snbQgfi8uc29uYW11L25haXRlLXtoYXNofS5zb2Nr7JeQIOyGjOy8kyDshJzrsoTrpbwg7Je07Ja065Gh64uI64ukLlxuICpcbiAqIO2UhOuhnOygne2KuOuzhOuhnCDqs6DsnKDtlZwg7IaM7LyT7J2EIOyCrOyaqe2VmOq4sCDsnITtlbQgc29uYW11LmNvbmZpZy50cyDqsr3roZzsnZgg7ZW07Iuc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqXG4gKiBmcyBtb2NrIOy2qeuPjOydhCDtlLztlZjquLAg7JyE7ZW0IG5ldCDrqqjrk4jrp4wg7IKs7Jqp7ZWp64uI64ukLlxuICovXG4vKiogYmlvbWUtaWdub3JlLWFsbCBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogTmFpdGXripQgZXhwZWN07JmAIO2YuOydke2VmOuPhOuhnSBhbnnrpbwg7ZeI7Jqp7ZWoICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBjb25uZWN0LCB0eXBlIFNvY2tldCB9IGZyb20gXCJuZXRcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwib3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IE5haXRlTWVzc2FnaW5nVHlwZXMgfSBmcm9tIFwiLi9tZXNzYWdpbmctdHlwZXNcIjtcblxuLyoqXG4gKiBzb25hbXUuY29uZmlnLnRzIOqyveuhnOulvCDrsJvslYTshJwg7ZSE66Gc7KCd7Yq467OEIOqzoOycoCDtlbTsi5zrpbwg7IOd7ISx7ZWp64uI64ukLlxuICog7J217Iqk7YWQ7IWY6rO8IOuPmeydvO2VnCDrsKnsi53snLzroZwg6rOE7IKw7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0UHJvamVjdEhhc2goY29uZmlnUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyZWF0ZUhhc2goXCJtZDVcIikudXBkYXRlKGNvbmZpZ1BhdGgpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCA4KTtcbn1cblxuLyoqXG4gKiDtmITsnqwg7ZSE66Gc7KCd7Yq47J2YIOyGjOy8kyDqsr3roZzrpbwg6rOE7IKw7ZWp64uI64ukLlxuICogU29uYW11LmFwaVJvb3RQYXRo6rCAIOyEpOygleuQnCDtm4Tsl5Ag7Zi47Lac7ZW07JW8IO2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gZ2V0U29ja2V0UGF0aCgpOiBzdHJpbmcge1xuICAvLyBzb25hbXUuY29uZmlnLnRz7J2YIOygiOuMgCDqsr3roZwg6rOE7IKwXG4gIC8vIGFwaVJvb3RQYXRo64qUIC9wcm9qZWN0L2FwaSDtmJXtg5zsnbTqs6AsIGNvbmZpZ+uKlCAvcHJvamVjdC9hcGkvc3JjL3NvbmFtdS5jb25maWcudHPsl5Ag7J6I7J2MXG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGZpbmRBcGlSb290UGF0aCgpLCBcInNyY1wiLCBcInNvbmFtdS5jb25maWcudHNcIik7XG4gIGNvbnN0IGhhc2ggPSBnZXRQcm9qZWN0SGFzaChjb25maWdQYXRoKTtcblxuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiXG4gICAgPyBgXFxcXFxcXFwuXFxcXHBpcGVcXFxcbmFpdGUtJHtoYXNofWBcbiAgICA6IGpvaW4oaG9tZWRpcigpLCBcIi5zb25hbXVcIiwgYG5haXRlLSR7aGFzaH0uc29ja2ApO1xufVxuXG5jbGFzcyBOYWl0ZVJlcG9ydGVyQ2xhc3Mge1xuICBwcml2YXRlIHNvY2tldFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHNvY2tldDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgYnVmZmVyOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiDshozsvJMg7Jew6rKwIOyLnOuPhFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVDb25uZWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNvbm5lY3RlZCB8fCB0aGlzLnNvY2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcbiAgICAgIGlmICghdGhpcy5zb2NrZXRQYXRoKSB7XG4gICAgICAgIHRoaXMuc29ja2V0UGF0aCA9IGdldFNvY2tldFBhdGgoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc29ja2V0ID0gY29ubmVjdCh0aGlzLnNvY2tldFBhdGgpO1xuXG4gICAgICB0aGlzLnNvY2tldC5vbihcImNvbm5lY3RcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIC8vIOuyhO2NvOyXkCDsjJPsnbgg66mU7Iuc7KeAIOyghOyGoVxuICAgICAgICBmb3IgKGNvbnN0IG1zZyBvZiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgIHRoaXMuc29ja2V0Py53cml0ZShtc2cpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgICAgIHJlcygpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uKFwiZXJyb3JcIiwgKGUpID0+IHtcbiAgICAgICAgLy8g7Jew6rKwIOyLpO2MqCDrrLTsi5wgKGV4dGVuc2lvbuydtCDqurzsoLjsnojsnYQg7IiYIOyeiOydjClcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgICByZWooZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zb2NrZXQub24oXCJjbG9zZVwiLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIOuplOyLnOyngCDsoITshqEgKOykhOuwlOq/iOycvOuhnCDqtazrtoQpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHNlbmQoZGF0YTogTmFpdGVNZXNzYWdpbmdUeXBlcy5OYWl0ZU1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtc2cgPSBgJHtKU09OLnN0cmluZ2lmeShkYXRhKX1cXG5gO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVDb25uZWN0aW9uKCkuY2F0Y2goKF8pID0+IHt9KTtcblxuICAgIGlmICh0aGlzLmNvbm5lY3RlZCAmJiB0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5zb2NrZXQud3JpdGUobXNnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7Jew6rKwIOuMgOq4sCDspJHsnbTrqbQg67KE7Y287JeQIOyggOyepVxuICAgICAgdGhpcy5idWZmZXIucHVzaChtc2cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiZWZvcmVBbGzsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyLnOyekeydhCDslYzrpr3ri4jri6QgKOuNsOydtO2EsCDtgbTrpqzslrQg7Iug7Zi4KS5cbiAgICovXG4gIGFzeW5jIHN0YXJ0VGVzdFJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuQ0kpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNlbmQoe1xuICAgICAgdHlwZTogXCJydW4vc3RhcnRcIixcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGFmdGVyRWFjaOyXkOyEnCDtmLjstpztlanri4jri6QuXG4gICAqIO2FjOyKpO2KuCDsvIDsnbTsiqQg6rKw6rO866W8IHRyYWNlc+yZgCDtlajqu5gg7KCE7Iah7ZWp64uI64ukLlxuICAgKi9cbiAgYXN5bmMgcmVwb3J0VGVzdFJlc3VsdChcbiAgICByZXN1bHQ6IE9taXQ8TmFpdGVNZXNzYWdpbmdUeXBlcy5UZXN0UmVzdWx0LCBcInJlY2VpdmVkQXRcIj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInRlc3QvcmVzdWx0XCIsXG4gICAgICByZWNlaXZlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi5yZXN1bHQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogYWZ0ZXJBbGzsl5DshJwg7Zi47Lac7ZWp64uI64ukLlxuICAgKiDthYzsiqTtirggcnVuIOyiheujjOulvCDslYzrpr3ri4jri6QuXG4gICAqL1xuICBhc3luYyBlbmRUZXN0UnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5DSSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICB0eXBlOiBcInJ1bi9lbmRcIixcbiAgICAgIGVuZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICB9KTtcblxuICAgIC8vIOyXsOqysCDsooXro4xcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuc29ja2V0LmVuZCgpO1xuICAgICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IE5haXRlUmVwb3J0ZXIgPSBuZXcgTmFpdGVSZXBvcnRlckNsYXNzKCk7XG4iXSwibmFtZXMiOlsiY3JlYXRlSGFzaCIsImNvbm5lY3QiLCJob21lZGlyIiwiam9pbiIsImZpbmRBcGlSb290UGF0aCIsImdldFByb2plY3RIYXNoIiwiY29uZmlnUGF0aCIsInVwZGF0ZSIsImRpZ2VzdCIsInNsaWNlIiwiZ2V0U29ja2V0UGF0aCIsImhhc2giLCJwcm9jZXNzIiwicGxhdGZvcm0iLCJOYWl0ZVJlcG9ydGVyQ2xhc3MiLCJzb2NrZXRQYXRoIiwic29ja2V0IiwiY29ubmVjdGVkIiwiYnVmZmVyIiwiZW5zdXJlQ29ubmVjdGlvbiIsIlByb21pc2UiLCJyZXMiLCJyZWoiLCJvbiIsIm1zZyIsIndyaXRlIiwiZSIsInNlbmQiLCJkYXRhIiwiSlNPTiIsInN0cmluZ2lmeSIsImNhdGNoIiwiXyIsInB1c2giLCJzdGFydFRlc3RSdW4iLCJlbnYiLCJDSSIsInR5cGUiLCJzdGFydGVkQXQiLCJEYXRlIiwidG9JU09TdHJpbmciLCJyZXBvcnRUZXN0UmVzdWx0IiwicmVzdWx0IiwicmVjZWl2ZWRBdCIsImVuZFRlc3RSdW4iLCJlbmRlZEF0IiwiZW5kIiwiTmFpdGVSZXBvcnRlciJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztDQVNDLEdBQ0Qsa0ZBQWtGLEdBRWxGLFNBQVNBLFVBQVUsUUFBUSxTQUFTO0FBQ3BDLFNBQVNDLE9BQU8sUUFBcUIsTUFBTTtBQUMzQyxTQUFTQyxPQUFPLFFBQVEsS0FBSztBQUM3QixTQUFTQyxJQUFJLFFBQVEsT0FBTztBQUM1QixTQUFTQyxlQUFlLFFBQVEsb0JBQWlCO0FBR2pEOzs7Q0FHQyxHQUNELFNBQVNDLGVBQWVDLFVBQWtCO0lBQ3hDLE9BQU9OLFdBQVcsT0FBT08sTUFBTSxDQUFDRCxZQUFZRSxNQUFNLENBQUMsT0FBT0MsS0FBSyxDQUFDLEdBQUc7QUFDckU7QUFFQTs7O0NBR0MsR0FDRCxTQUFTQztJQUNQLDZCQUE2QjtJQUM3QixnRkFBZ0Y7SUFD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
|