PackageDetails.test.js 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const PackageDetails_1 = require("./PackageDetails");
  4. describe("getPackageDetailsFromPatchFilename", () => {
  5. it("parses new-style patch filenames", () => {
  6. expect(PackageDetails_1.getPackageDetailsFromPatchFilename("banana++apple+0.4.2.patch"))
  7. .toMatchInlineSnapshot(`
  8. Object {
  9. "humanReadablePathSpecifier": "banana => apple",
  10. "isDevOnly": false,
  11. "isNested": true,
  12. "name": "apple",
  13. "packageNames": Array [
  14. "banana",
  15. "apple",
  16. ],
  17. "patchFilename": "banana++apple+0.4.2.patch",
  18. "path": "node_modules/banana/node_modules/apple",
  19. "pathSpecifier": "banana/apple",
  20. "sequenceName": undefined,
  21. "sequenceNumber": undefined,
  22. "version": "0.4.2",
  23. }
  24. `);
  25. expect(PackageDetails_1.getPackageDetailsFromPatchFilename("@types+banana++@types+apple++@mollusc+man+0.4.2-banana-tree.patch")).toMatchInlineSnapshot(`
  26. Object {
  27. "humanReadablePathSpecifier": "@types/banana => @types/apple => @mollusc/man",
  28. "isDevOnly": false,
  29. "isNested": true,
  30. "name": "@mollusc/man",
  31. "packageNames": Array [
  32. "@types/banana",
  33. "@types/apple",
  34. "@mollusc/man",
  35. ],
  36. "patchFilename": "@types+banana++@types+apple++@mollusc+man+0.4.2-banana-tree.patch",
  37. "path": "node_modules/@types/banana/node_modules/@types/apple/node_modules/@mollusc/man",
  38. "pathSpecifier": "@types/banana/@types/apple/@mollusc/man",
  39. "sequenceName": undefined,
  40. "sequenceNumber": undefined,
  41. "version": "0.4.2-banana-tree",
  42. }
  43. `);
  44. expect(PackageDetails_1.getPackageDetailsFromPatchFilename("@types+banana.patch++hello+0.4.2-banana-tree.patch")).toMatchInlineSnapshot(`
  45. Object {
  46. "humanReadablePathSpecifier": "@types/banana.patch => hello",
  47. "isDevOnly": false,
  48. "isNested": true,
  49. "name": "hello",
  50. "packageNames": Array [
  51. "@types/banana.patch",
  52. "hello",
  53. ],
  54. "patchFilename": "@types+banana.patch++hello+0.4.2-banana-tree.patch",
  55. "path": "node_modules/@types/banana.patch/node_modules/hello",
  56. "pathSpecifier": "@types/banana.patch/hello",
  57. "sequenceName": undefined,
  58. "sequenceNumber": undefined,
  59. "version": "0.4.2-banana-tree",
  60. }
  61. `);
  62. expect(PackageDetails_1.getPackageDetailsFromPatchFilename("@types+banana.patch++hello+0.4.2-banana-tree.dev.patch")).toMatchInlineSnapshot(`
  63. Object {
  64. "humanReadablePathSpecifier": "@types/banana.patch => hello",
  65. "isDevOnly": true,
  66. "isNested": true,
  67. "name": "hello",
  68. "packageNames": Array [
  69. "@types/banana.patch",
  70. "hello",
  71. ],
  72. "patchFilename": "@types+banana.patch++hello+0.4.2-banana-tree.dev.patch",
  73. "path": "node_modules/@types/banana.patch/node_modules/hello",
  74. "pathSpecifier": "@types/banana.patch/hello",
  75. "sequenceName": undefined,
  76. "sequenceNumber": undefined,
  77. "version": "0.4.2-banana-tree",
  78. }
  79. `);
  80. });
  81. it("works for ordered patches", () => {
  82. expect(PackageDetails_1.getPackageDetailsFromPatchFilename("left-pad+1.3.0+02+world"))
  83. .toMatchInlineSnapshot(`
  84. Object {
  85. "humanReadablePathSpecifier": "left-pad",
  86. "isDevOnly": false,
  87. "isNested": false,
  88. "name": "left-pad",
  89. "packageNames": Array [
  90. "left-pad",
  91. ],
  92. "patchFilename": "left-pad+1.3.0+02+world",
  93. "path": "node_modules/left-pad",
  94. "pathSpecifier": "left-pad",
  95. "sequenceName": "world",
  96. "sequenceNumber": 2,
  97. "version": "1.3.0",
  98. }
  99. `);
  100. expect(PackageDetails_1.getPackageDetailsFromPatchFilename("@microsoft/api-extractor+2.0.0+01+FixThing")).toMatchInlineSnapshot(`
  101. Object {
  102. "humanReadablePathSpecifier": "@microsoft/api-extractor",
  103. "isDevOnly": false,
  104. "isNested": false,
  105. "name": "@microsoft/api-extractor",
  106. "packageNames": Array [
  107. "@microsoft/api-extractor",
  108. ],
  109. "patchFilename": "@microsoft/api-extractor+2.0.0+01+FixThing",
  110. "path": "node_modules/@microsoft/api-extractor",
  111. "pathSpecifier": "@microsoft/api-extractor",
  112. "sequenceName": "FixThing",
  113. "sequenceNumber": 1,
  114. "version": "2.0.0",
  115. }
  116. `);
  117. });
  118. });
  119. describe("getPatchDetailsFromCliString", () => {
  120. it("handles a minimal package name", () => {
  121. expect(PackageDetails_1.getPatchDetailsFromCliString("patch-package")).toMatchInlineSnapshot(`
  122. Object {
  123. "humanReadablePathSpecifier": "patch-package",
  124. "isNested": false,
  125. "name": "patch-package",
  126. "packageNames": Array [
  127. "patch-package",
  128. ],
  129. "path": "node_modules/patch-package",
  130. "pathSpecifier": "patch-package",
  131. }
  132. `);
  133. });
  134. it("handles a scoped package name", () => {
  135. expect(PackageDetails_1.getPatchDetailsFromCliString("@david/patch-package")).toMatchInlineSnapshot(`
  136. Object {
  137. "humanReadablePathSpecifier": "@david/patch-package",
  138. "isNested": false,
  139. "name": "@david/patch-package",
  140. "packageNames": Array [
  141. "@david/patch-package",
  142. ],
  143. "path": "node_modules/@david/patch-package",
  144. "pathSpecifier": "@david/patch-package",
  145. }
  146. `);
  147. });
  148. it("handles a nested package name", () => {
  149. expect(PackageDetails_1.getPatchDetailsFromCliString("david/patch-package")).toMatchInlineSnapshot(`
  150. Object {
  151. "humanReadablePathSpecifier": "david => patch-package",
  152. "isNested": true,
  153. "name": "patch-package",
  154. "packageNames": Array [
  155. "david",
  156. "patch-package",
  157. ],
  158. "path": "node_modules/david/node_modules/patch-package",
  159. "pathSpecifier": "david/patch-package",
  160. }
  161. `);
  162. });
  163. it("handles a nested package name with scopes", () => {
  164. expect(PackageDetails_1.getPatchDetailsFromCliString("@david/patch-package/banana")).toMatchInlineSnapshot(`
  165. Object {
  166. "humanReadablePathSpecifier": "@david/patch-package => banana",
  167. "isNested": true,
  168. "name": "banana",
  169. "packageNames": Array [
  170. "@david/patch-package",
  171. "banana",
  172. ],
  173. "path": "node_modules/@david/patch-package/node_modules/banana",
  174. "pathSpecifier": "@david/patch-package/banana",
  175. }
  176. `);
  177. expect(PackageDetails_1.getPatchDetailsFromCliString("@david/patch-package/@david/banana")).toMatchInlineSnapshot(`
  178. Object {
  179. "humanReadablePathSpecifier": "@david/patch-package => @david/banana",
  180. "isNested": true,
  181. "name": "@david/banana",
  182. "packageNames": Array [
  183. "@david/patch-package",
  184. "@david/banana",
  185. ],
  186. "path": "node_modules/@david/patch-package/node_modules/@david/banana",
  187. "pathSpecifier": "@david/patch-package/@david/banana",
  188. }
  189. `);
  190. expect(PackageDetails_1.getPatchDetailsFromCliString("david/patch-package/@david/banana")).toMatchInlineSnapshot(`
  191. Object {
  192. "humanReadablePathSpecifier": "david => patch-package => @david/banana",
  193. "isNested": true,
  194. "name": "@david/banana",
  195. "packageNames": Array [
  196. "david",
  197. "patch-package",
  198. "@david/banana",
  199. ],
  200. "path": "node_modules/david/node_modules/patch-package/node_modules/@david/banana",
  201. "pathSpecifier": "david/patch-package/@david/banana",
  202. }
  203. `);
  204. });
  205. });
  206. describe("parseNameAndVersion", () => {
  207. it("works for good-looking names", () => {
  208. expect(PackageDetails_1.parseNameAndVersion("lodash+2.3.4")).toMatchInlineSnapshot(`
  209. Object {
  210. "packageName": "lodash",
  211. "version": "2.3.4",
  212. }
  213. `);
  214. expect(PackageDetails_1.parseNameAndVersion("patch-package+2.0.0-alpha.3"))
  215. .toMatchInlineSnapshot(`
  216. Object {
  217. "packageName": "patch-package",
  218. "version": "2.0.0-alpha.3",
  219. }
  220. `);
  221. });
  222. it("works for scoped package names", () => {
  223. expect(PackageDetails_1.parseNameAndVersion("@react-spring+rafz+2.0.0-alpha.3"))
  224. .toMatchInlineSnapshot(`
  225. Object {
  226. "packageName": "@react-spring/rafz",
  227. "version": "2.0.0-alpha.3",
  228. }
  229. `);
  230. expect(PackageDetails_1.parseNameAndVersion("@microsoft+api-extractor+2.2.3"))
  231. .toMatchInlineSnapshot(`
  232. Object {
  233. "packageName": "@microsoft/api-extractor",
  234. "version": "2.2.3",
  235. }
  236. `);
  237. });
  238. it("works for ordered patches", () => {
  239. expect(PackageDetails_1.parseNameAndVersion("patch-package+2.0.0+01"))
  240. .toMatchInlineSnapshot(`
  241. Object {
  242. "packageName": "patch-package",
  243. "sequenceNumber": 1,
  244. "version": "2.0.0",
  245. }
  246. `);
  247. expect(PackageDetails_1.parseNameAndVersion("@react-spring+rafz+2.0.0-alpha.3+23"))
  248. .toMatchInlineSnapshot(`
  249. Object {
  250. "packageName": "@react-spring/rafz",
  251. "sequenceNumber": 23,
  252. "version": "2.0.0-alpha.3",
  253. }
  254. `);
  255. expect(PackageDetails_1.parseNameAndVersion("@microsoft+api-extractor+2.0.0+001"))
  256. .toMatchInlineSnapshot(`
  257. Object {
  258. "packageName": "@microsoft/api-extractor",
  259. "sequenceNumber": 1,
  260. "version": "2.0.0",
  261. }
  262. `);
  263. });
  264. it("works for ordered patches with names", () => {
  265. expect(PackageDetails_1.parseNameAndVersion("patch-package+2.0.0+021+FixImportantThing"))
  266. .toMatchInlineSnapshot(`
  267. Object {
  268. "packageName": "patch-package",
  269. "sequenceName": "FixImportantThing",
  270. "sequenceNumber": 21,
  271. "version": "2.0.0",
  272. }
  273. `);
  274. expect(PackageDetails_1.parseNameAndVersion("@react-spring+rafz+2.0.0-alpha.3+000023+Foo"))
  275. .toMatchInlineSnapshot(`
  276. Object {
  277. "packageName": "@react-spring/rafz",
  278. "sequenceName": "Foo",
  279. "sequenceNumber": 23,
  280. "version": "2.0.0-alpha.3",
  281. }
  282. `);
  283. expect(PackageDetails_1.parseNameAndVersion("@microsoft+api-extractor+2.0.0+001+Bar"))
  284. .toMatchInlineSnapshot(`
  285. Object {
  286. "packageName": "@microsoft/api-extractor",
  287. "sequenceName": "Bar",
  288. "sequenceNumber": 1,
  289. "version": "2.0.0",
  290. }
  291. `);
  292. });
  293. });
  294. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2FnZURldGFpbHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QYWNrYWdlRGV0YWlscy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscURBSXlCO0FBRXpCLFFBQVEsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7SUFDbEQsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRTtRQUMxQyxNQUFNLENBQUMsbURBQWtDLENBQUMsMkJBQTJCLENBQUMsQ0FBQzthQUNwRSxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FpQjVCLENBQUMsQ0FBQTtRQUVFLE1BQU0sQ0FDSixtREFBa0MsQ0FDaEMsbUVBQW1FLENBQ3BFLENBQ0YsQ0FBQyxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0IzQixDQUFDLENBQUE7UUFFRSxNQUFNLENBQ0osbURBQWtDLENBQ2hDLG9EQUFvRCxDQUNyRCxDQUNGLENBQUMscUJBQXFCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUIzQixDQUFDLENBQUE7UUFFRSxNQUFNLENBQ0osbURBQWtDLENBQ2hDLHdEQUF3RCxDQUN6RCxDQUNGLENBQUMscUJBQXFCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUIzQixDQUFDLENBQUE7SUFDQSxDQUFDLENBQUMsQ0FBQTtJQUVGLEVBQUUsQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7UUFDbkMsTUFBTSxDQUFDLG1EQUFrQyxDQUFDLHlCQUF5QixDQUFDLENBQUM7YUFDbEUscUJBQXFCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FnQjVCLENBQUMsQ0FBQTtRQUVFLE1BQU0sQ0FDSixtREFBa0MsQ0FDaEMsNENBQTRDLENBQzdDLENBQ0YsQ0FBQyxxQkFBcUIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztDQWdCM0IsQ0FBQyxDQUFBO0lBQ0EsQ0FBQyxDQUFDLENBQUE7QUFDSixDQUFDLENBQUMsQ0FBQTtBQUVGLFFBQVEs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QTtRQUNFLE1BQU0sQ0FBQyxvQ0FBbUIsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO2FBQ2xFLHFCQUFxQixDQUFDOzs7Ozs7O0NBTzVCLENBQUMsQ0FBQTtJQUNBLENBQUMsQ0FBQyxDQUFBO0FBQ0osQ0FBQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBnZXRQYWNrYWdlRGV0YWlsc0Zyb21QYXRjaEZpbGVuYW1lLFxuICBnZXRQYXRjaERldGFpbHNGcm9tQ2xpU3RyaW5nLFxuICBwYXJzZU5hbWVBbmRWZXJzaW9uLFxufSBmcm9tIFwiLi9QYWNrYWdlRGV0YWlsc1wiXG5cbmRlc2NyaWJlKFwiZ2V0UGFja2FnZURldGFpbHNGcm9tUGF0Y2hGaWxlbmFtZVwiLCAoKSA9PiB7XG4gIGl0KFwicGFyc2VzIG5ldy1zdHlsZSBwYXRjaCBmaWxlbmFtZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChnZXRQYWNrYWdlRGV0YWlsc0Zyb21QYXRjaEZpbGVuYW1lKFwiYmFuYW5hKythcHBsZSswLjQuMi5wYXRjaFwiKSlcbiAgICAgIC50b01hdGNoSW5saW5lU25hcHNob3QoYFxuT2JqZWN0IHtcbiAgXCJodW1hblJlYWRhYmxlUGF0aFNwZWNpZmllclwiOiBcImJhbmFuYSA9PiBhcHBsZVwiLFxuICBcImlzRGV2T25seVwiOiBmYWxzZSxcbiAgXCJpc05lc3RlZFwiOiB0cnVlLFxuICBcIm5hbWVcIjogXCJhcHBsZVwiLFxuICBcInBhY2thZ2VOYW1lc1wiOiBBcnJheSBbXG4gICAgXCJiYW5hbmFcIixcbiAgICBcImFwcGxlXCIsXG4gIF0sXG4gIFwicGF0Y2hGaWxlbmFtZVwiOiBcImJhbmFuYSsrYXBwbGUrMC40LjIucGF0Y2hcIixcbiAgXCJwYXRoXCI6IFwibm9kZV9tb2R1bGVzL2JhbmFuYS9ub2RlX21vZHVsZXMvYXBwbGVcIixcbiAgXCJwYXRoU3BlY2lmaWVyXCI6IFwiYmFuYW5hL2FwcGxlXCIsXG4gIFwic2VxdWVuY2VOYW1lXCI6IHVuZGVmaW5lZCxcbiAgXCJzZXF1ZW5jZU51bWJlclwiOiB1bmRlZmluZWQsXG4gIFwidmVyc2lvblwiOiBcIjAuNC4yXCIsXG59XG5gKVxuXG4gICAgZXhwZWN0KFxuICAgICAgZ2V0UGFja2FnZURldGFpbHNGcm9tUGF0Y2hGaWxlbmFtZShcbiAgICAgICAgXCJAdHlwZXMrYmFuYW5hKytAdHlwZXMrYXBwbGUrK0Btb2xsdXNjK21hbiswLjQuMi1iYW5hbmEtdHJlZS5wYXRjaFwiLFxuICAgICAgKSxcbiAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChgXG5PYmplY3Qge1xuICBcImh1bWFuUmVhZGFibGVQYXRoU3BlY2lmaWVyXCI6IFwiQHR5cGVzL2JhbmFuYSA9PiBAdHlwZXMvYXBwbGUgPT4gQG1vbGx1c2MvbWFuXCIsXG4gIFwiaXNEZXZPbmx5XCI6IGZhbHNlLFxuICBcImlzTmVzdGVkXCI6IHRydWUsXG4gIFwibmFtZVwiOiBcIkBtb2xsdXNjL21hblwiLFxuICBcInBhY2thZ2VOYW1lc1wiOiBBcnJheSBbXG4gICAgXCJAdHlwZXMvYmFuYW5hXCIsXG4gICAgXCJAdHlwZXMvYXBwbGVcIixcbiAgICBcIkBtb2xsdXNjL21hblwiLFxuICBdLFxuICBcInBhdGNoRmlsZW5hbWVcIjogXCJAdHlwZXMrYmFuYW5hKytAdHlwZXMrYXBwbGUrK0Btb2xsdXNjK21hbiswLjQuMi1iYW5hbmEtdHJlZS5wYXRjaFwiLFxuICBcInBhdGhcIjogXCJub2RlX21vZHVsZXMvQHR5cGVzL2JhbmFuYS9ub2RlX21vZHVsZXMvQHR5cGVzL2FwcGxlL25vZGVfbW9kdWxlcy9AbW9sbHVzYy9tYW5cIixcbiAgXCJwYXRoU3BlY2lmaWVyXCI6IFwiQHR5cGVzL2JhbmFuYS9AdHlwZXMvYXBwbGUvQG1vbGx1c2MvbWFuXCIsXG4gIFwic2VxdWVuY2VOYW1lXCI6IHVuZGVmaW5lZCxcbiAgXCJzZXF1ZW5jZU51bWJlclwiOiB1bmRlZmluZWQsXG4gIFwidmVyc2lvblwiOiBcIjAuNC4yLWJhbmFuYS10cmVlXCIsXG59XG5gKVxuXG4gICAgZXhwZWN0KFxuICAgICAgZ2V0UGFja2FnZURldGFpbHNGcm9tUGF0Y2hGaWxlbmFtZShcbiAgICAgICAgXCJAdHlwZXMrYmFuYW5hLnBhdGNoKytoZWxsbyswLjQuMi1iYW5hbmEtdHJlZS5wYXRjaFwiLFxuICAgICAgKSxcbiAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChgXG5PYmplY3Qge1xuICBcImh1bWFuUmVhZGFibGVQYXRoU3BlY2lmaWVyXCI6IFwiQHR5cGVzL2JhbmFuYS5wYXRjaCA9PiBoZWxsb1wiLFxuICBcImlzRGV2T25seVwiOiBmYWxzZSxcbiAgXCJpc05lc3RlZFwiOiB0cnVlLFxuICBcIm5hbWVcIjogXCJoZWxsb1wiLFxuICBcInBhY2thZ2VOYW1lc1wiOiBBcnJheSBbXG4gICAgXCJAdHlwZXMvYmFuYW5hLnBhdGNoXCIsXG4gICAgXCJoZWxsb1wiLFxuICBdLFxuICBcInBhdGNoRmlsZW5hbWVcIjogXCJAdHlwZXMrYmFuYW5hLnBhdGNoKytoZWxsbyswLjQuMi1iYW5hbmEtdHJlZS5wYXRjaFwiLFxuICBcInBhdGhcIjogXCJub2RlX21vZHVsZXMvQHR5cGVzL2JhbmFuYS5wYXRjaC9ub2RlX21vZHVsZXMvaGVsbG9cIixcbiAgXCJwYXRoU3BlY2lmaWVyXCI6IFwiQHR5cGVzL2JhbmFuYS5wYXRjaC9oZWxsb1wiLFxuICBcInNlcXVlbmNlTmFtZVwiOiB1bmRlZmluZWQsXG4gIFwic2VxdWVuY2VOdW1iZXJcIjogdW5kZWZpbmVkLFxuICBcInZlcnNpb25cIjogXCIwLjQuMi1iYW5hbmEtdHJlZVwiLFxufVxuYClcblxuICAgIGV4cGVjdChcbiAgICAgIGdldFBhY2thZ2VEZXRhaWxzRnJvbVBhdGNoRmlsZW5hbWUoXG4gICAgICAgIFwiQHR5cGVzK2JhbmFuYS5wYXRjaCsraGVsbG8rMC40LjItYmFuYW5hLXRyZWUuZGV2LnBhdGNoXCIsXG4gICAgICApLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KGBcbk9iamVjdCB7XG4gIFwiaHVtYW5SZWFkYWJsZVBhdGhTcGVjaWZpZXJcIjogXCJAdHlwZXMvYmFuYW5hLnBhdGNoID0+IGhlbGxvXCIsXG4gIFwiaXNEZXZPbmx5XCI6IHRydWUsXG4gIFwiaXNOZXN0ZWRcIjogdHJ1ZSxcbiAgXCJuYW1lXCI6IFwiaGVsbG9cIixcbiAgXCJwYWNrYWdlTmFtZXNcIjogQXJyYXkgW1xuICAgIFwiQHR5cGVzL2JhbmFuYS5wYXRjaFwiLFxuICAgIFwiaGVsbG9cIixcbiAgXSxcbiAgXCJwYXRjaEZpbGVuYW1lXCI6IFwiQHR5cGVzK2JhbmFuYS5wYXRjaCsraGVsbG8rMC40LjItYmFuYW5hLXRyZWUuZGV2LnBhdGNoXCIsXG4gIFwicGF0aFwiOiBcIm5vZGVfbW9kdWxlcy9AdHlwZXMvYmFuYW5hLnBhdGNoL25vZGVfbW9kdWxlcy9oZWxsb1wiLFxuICBcInBhdGhTcGVjaWZpZXJcIjogXCJAdHlwZXMvYmFuYW5hLnBhdGNoL2hlbGxvXCIsXG4gIFwic2VxdWVuY2VOYW1lXCI6IHVuZGVmaW5lZCxcbiAgXCJzZXF1ZW5jZU51bWJlclwiOiB1bmRlZmluZWQsXG4gIFwidmVyc2lvblwiOiBcIjAuNC4yLWJhbmFuYS10cmVlXCIsXG59XG5gKVxuICB9KVxuXG4gIGl0KFwid29ya3MgZm9yIG9yZGVyZWQgcGF0Y2hlc1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KGdldFBhY2thZ2VEZXRhaWxzRnJvbVBhdGNoRmlsZW5hbWUoXCJsZWZ0LXBhZCsxLjMuMCswMit3b3JsZFwiKSlcbiAgICAgIC50b01hdGNoSW5saW5lU25hcHNob3QoYFxuT2JqZWN0IHtcbiAgXCJodW1hblJlYWRhYmxlUGF0aFNwZWNpZmllclwiOiBcImxlZnQtcGFkXCIsXG4gIFwiaXNEZXZPbmx5XCI6IGZhbHNlLFxuICBcImlzTmVzdGVkXCI6IGZhbHNlLFxuICBcIm5hbWVcIjogXCJsZWZ0LXBhZFwiLFxuICBcInBhY2thZ2VOYW1lc1wiOiBBcnJheSBbXG4gICAgXCJsZWZ0LXBhZFwiLFxuICBdLFxuICBcInBhdGNoRmlsZW5hbWVcIjogXCJsZWZ0LXBhZCsxLjMuMCswMit3b3JsZFwiLFxuICBcInBhdGhcIjogXCJub2RlX21vZHVsZXMvbGVmdC1wYWRcIixcbiAgXCJwYXRoU3BlY2lmaWVyXCI6IFwibGVmdC1wYWRcIixcbiAgXCJzZXF1ZW5jZU5hbWVcIjogXCJ3b3JsZFwiLFxuICBcInNlcXVlbmNlTnVtYmVyXCI6IDIsXG4gIFwidmVyc2lvblwiOiBcIjEuMy4wXCIsXG59XG5gKVxuXG4gICAgZXhwZWN0KFxuICAgICAgZ2V0UGFja2FnZURldGFpbHNGcm9tUGF0Y2hGaWxlbmFtZShcbiAgICAgICAgXCJAbWljcm9zb2Z0L2FwaS1leHRyYWN0b3IrMi4wLjArMDErRml4VGhpbmdcIixcbiAgICAgICksXG4gICAgKS50b01hdGNoSW5saW5lU25hcHNob3QoYFxuT2JqZWN0IHtcbiAgXCJodW1hblJlYWRhYmxlUGF0aFNwZWNpZmllclwiOiBcIkBtaWNyb3NvZnQvYXBpLWV4dHJhY3RvclwiLFxuICBcImlzRGV2T25seVwiOiBmYWxzZSxcbiAgXCJpc05lc3RlZFwiOiBmYWxzZSxcbiAgXCJuYW1lXCI6IFwiQG1pY3Jvc29mdC9hcGktZXh0cmFjdG9yXCIsXG4gIFwicGFja2FnZU5hbWVzXCI6IEFycmF5IFtcbiAgICBcIkBtaWNyb3NvZnQvYXBpLWV4dHJhY3RvclwiLFxuICBdLFxuICBcInBhdGNoRmlsZW5hbWVcIjogXCJAbWljcm9zb2Z0L2FwaS1leHRyYWN0b3IrMi4wLjArMDErRml4VGhpbmdcIixcbiAgXCJwYXRoXCI6IFwibm9kZV9tb2R1bGVzL0BtaWNyb3NvZnQvYXBpLWV4dHJhY3RvclwiLFxuICBcInBhdGhTcGVjaWZpZXJcIjogXCJAbWljcm9zb2Z0L2FwaS1leHRyYWN0b3JcIixcbiAgXCJzZXF1ZW5jZU5hbWVcIjogXCJGaXhUaGluZ1wiLFxuICBcInNlcXVlbmNlTnVtYmVyXCI6IDEsXG4gIFwidmVyc2lvblwiOiBcIjIuMC4wXCIsXG59XG5gKVxuICB9KVxufSlcblxuZGVzY3JpYmUoXCJnZXRQYXRjaERldGFpbHNGcm9tQ2xpU3RyaW5nXCIsICgpID0+IHtcbiAgaXQoXCJoYW5kbGVzIGEgbWluaW1hbCBwYWNrYWdlIG5hbWVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChnZXRQYXRjaERldGFpbHNGcm9tQ2xpU3RyaW5nKFwicGF0Y2gtcGFja2FnZVwiKSkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFxuT2JqZWN0IHtcbiAgXCJodW1hblJlYWRhYmxlUGF0aFNwZWNpZmllclwiOiBcInBhdGNoLXBhY2thZ2VcIixcbiAgXCJpc05lc3RlZFwiOiBmYWxzZSxcbiAgXCJuYW1lXCI6IFwicGF0Y2gtcGFja2FnZVwiLFxuICBcInBhY2thZ2VOYW1lc1wiOiBBcnJheSBbXG4gICAgXCJwYXRjaC1wYWNrYWdlXCIsXG4gIF0sXG4gIFwicGF0aFwiOiBcIm5vZGVfbW9kdWxlcy9wYXRjaC1wYWNrYWdlXCIsXG4gIFwicGF0aFNwZWNpZmllclwiOiBcInBhdGNoLXBhY2thZ2VcIixcbn1cbmAsXG4gICAgKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBhIHNjb3BlZCBwYWNrYWdlIG5hbWVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGdldFBhdGNoRGV0YWlsc0Zyb21DbGlTdHJpbmcoXCJAZGF2aWQvcGF0Y2gtcGFja2FnZVwiKSxcbiAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChcbiAgICAgIGBcbk9iamVjdCB7XG4gIFwiaHVtYW5SZWFkYWJsZVBhdGhTcGVjaWZpZXJcIjogXCJAZGF2aWQvcGF0Y2gtcGFja2FnZVwiLFxuICBcImlzTmVzdGVkXCI6IGZhbHNlLFxuICBcIm5hbWVcIjogXCJAZGF2aWQvcGF0Y2gtcGFja2FnZVwiLFxuICBcInBhY2thZ2VOYW1lc1wiOiBBcnJheSBbXG4gICAgXCJAZGF2aWQvcGF0Y2gtcGFja2FnZVwiLFxuICBdLFxuICBcInBhdGhcIjogXCJub2RlX21vZHVsZXMvQGRhdmlkL3BhdGNoLXBhY2thZ2VcIixcbiAgXCJwYXRoU3BlY2lmaWVyXCI6IFwiQGRhdmlkL3BhdGNoLXBhY2thZ2VcIixcbn1cbmAsXG4gICAgKVxuICB9KVxuXG4gIGl0KFwiaGFuZGxlcyBhIG5lc3RlZCBwYWNrYWdlIG5hbWVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGdldFBhdGNoRGV0YWlsc0Zyb21DbGlTdHJpbmcoXCJkYXZpZC9wYXRjaC1wYWNrYWdlXCIpLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFxuT2JqZWN0IHtcbiAgXCJodW1hblJlYWRhYmxlUGF0aFNwZWNpZmllclwiOiBcImRhdmlkID0+IHBhdGNoLXBhY2thZ2VcIixcbiAgXCJpc05lc3RlZFwiOiB0cnVlLFxuICBcIm5hbWVcIjogXCJwYXRjaC1wYWNrYWdlXCIsXG4gIFwicGFja2FnZU5hbWVzXCI6IEFycmF5IFtcbiAgICBcImRhdmlkXCIsXG4gICAgXCJwYXRjaC1wYWNrYWdlXCIsXG4gIF0sXG4gIFwicGF0aFwiOiBcIm5vZGVfbW9kdWxlcy9kYXZpZC9ub2RlX21vZHVsZXMvcGF0Y2gtcGFja2FnZVwiLFxuICBcInBhdGhTcGVjaWZpZXJcIjogXCJkYXZpZC9wYXRjaC1wYWNrYWdlXCIsXG59XG5gLFxuICAgIClcbiAgfSlcblxuICBpdChcImhhbmRsZXMgYSBuZXN0ZWQgcGFja2FnZSBuYW1lIHdpdGggc2NvcGVzXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBnZXRQYXRjaERldGFpbHNGcm9tQ2xpU3RyaW5nKFwiQGRhdmlkL3BhdGNoLXBhY2thZ2UvYmFuYW5hXCIpLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFxuT2JqZWN0IHtcbiAgXCJodW1hblJlYWRhYmxlUGF0aFNwZWNpZmllclwiOiBcIkBkYXZpZC9wYXRjaC1wYWNrYWdlID0+IGJhbmFuYVwiLFxuICBcImlzTmVzdGVkXCI6IHRydWUsXG4gIFwibmFtZVwiOiBcImJhbmFuYVwiLFxuICBcInBhY2thZ2VOYW1lc1wiOiBBcnJheSBbXG4gICAgXCJAZGF2aWQvcGF0Y2gtcGFja2FnZVwiLFxuICAgIFwiYmFuYW5hXCIsXG4gIF0sXG4gIFwicGF0aFwiOiBcIm5vZGVfbW9kdWxlcy9AZGF2aWQvcGF0Y2gtcGFja2FnZS9ub2RlX21vZHVsZXMvYmFuYW5hXCIsXG4gIFwicGF0aFNwZWNpZmllclwiOiBcIkBkYXZpZC9wYXRjaC1wYWNrYWdlL2JhbmFuYVwiLFxufVxuYCxcbiAgICApXG5cbiAgICBleHBlY3QoXG4gICAgICBnZXRQYXRjaERldGFpbHNGcm9tQ2xpU3RyaW5nKFwiQGRhdmlkL3BhdGNoLXBhY2thZ2UvQGRhdmlkL2JhbmFuYVwiKSxcbiAgICApLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChcbiAgICAgIGBcbk9iamVjdCB7XG4gIFwiaHVtYW5SZWFkYWJsZVBhdGhTcGVjaWZpZXJcIjogXCJAZGF2aWQvcGF0Y2gtcGFja2FnZSA9PiBAZGF2aWQvYmFuYW5hXCIsXG4gIFwiaXNOZXN0ZWRcIjogdHJ1ZSxcbiAgXCJuYW1lXCI6IFwiQGRhdmlkL2JhbmFuYVwiLFxuICBcInBhY2thZ2VOYW1lc1wiOiBBcnJheSBbXG4gICAgXCJAZGF2aWQvcGF0Y2gtcGFja2FnZVwiLFxuICAgIFwiQGRhdmlkL2JhbmFuYVwiLFxuICBdLFxuICBcInBhdGhcIjogXCJub2RlX21vZHVsZXMvQGRhdmlkL3BhdGNoLXBhY2thZ2Uvbm9kZV9tb2R1bGVzL0BkYXZpZC9iYW5hbmFcIixcbiAgXCJwYXRoU3BlY2lmaWVyXCI6IFwiQGRhdmlkL3BhdGNoLXBhY2thZ2UvQGRhdmlkL2JhbmFuYVwiLFxufVxuYCxcbiAgICApXG5cbiAgICBleHBlY3QoXG4gICAgICBnZXRQYXRjaERldGFpbHNGcm9tQ2xpU3RyaW5nKFwiZGF2aWQvcGF0Y2gtcGFja2FnZS9AZGF2aWQvYmFuYW5hXCIpLFxuICAgICkudG9NYXRjaElubGluZVNuYXBzaG90KFxuICAgICAgYFxuT2JqZWN0IHtcbiAgXCJodW1hblJlYWRhYmxlUGF0aFNwZWNpZmllclwiOiBcImRhdmlkID0+IHBhdGNoLXBhY2thZ2UgPT4gQGRhdmlkL2JhbmFuYVwiLFxuICBcImlzTmVzdGVkXCI6IHRydWUsXG4gIFwibmFtZVwiOiBcIkBkYXZpZC9iYW5hbmFcIixcbiAgXCJwYWNrYWdlTmFtZXNcIjogQXJyYXkgW1xuICAgIFwiZGF2aWRcIixcbiAgICBcInBhdGNoLXBhY2thZ2VcIixcbiAgICBcIkBkYXZpZC9iYW5hbmFcIixcbiAgXSxcbiAgXCJwYXRoXCI6IFwibm9kZV9tb2R1bGVzL2RhdmlkL25vZGVfbW9kdWxlcy9wYXRjaC1wYWNrYWdlL25vZGVfbW9kdWxlcy9AZGF2aWQvYmFuYW5hXCIsXG4gIFwicGF0aFNwZWNpZmllclwiOiBcImRhdmlkL3BhdGNoLXBhY2thZ2UvQGRhdmlkL2JhbmFuYVwiLFxufVxuYCxcbiAgICApXG4gIH0pXG59KVxuXG5kZXNjcmliZShcInBhcnNlTmFtZUFuZFZlcnNpb25cIiwgKCkgPT4ge1xuICBpdChcIndvcmtzIGZvciBnb29kLWxvb2tpbmcgbmFtZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5hbWVBbmRWZXJzaW9uKFwibG9kYXNoKzIuMy40XCIpKS50b01hdGNoSW5saW5lU25hcHNob3QoYFxuT2JqZWN0IHtcbiAgXCJwYWNrYWdlTmFtZVwiOiBcImxvZGFzaFwiLFxuICBcInZlcnNpb25cIjogXCIyLjMuNFwiLFxufVxuYClcbiAgICBleHBlY3QocGFyc2VOYW1lQW5kVmVyc2lvbihcInBhdGNoLXBhY2thZ2UrMi4wLjAtYWxwaGEuM1wiKSlcbiAgICAgIC50b01hdGNoSW5saW5lU25hcHNob3QoYFxuT2JqZWN0IHtcbiAgXCJwYWNrYWdlTmFtZVwiOiBcInBhdGNoLXBhY2thZ2VcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMi4wLjAtYWxwaGEuM1wiLFxufVxuYClcbiAgfSlcbiAgaXQoXCJ3b3JrcyBmb3Igc2NvcGVkIHBhY2thZ2UgbmFtZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwYXJzZU5hbWVBbmRWZXJzaW9uKFwiQHJlYWN0LXNwcmluZytyYWZ6KzIuMC4wLWFscGhhLjNcIikpXG4gICAgICAudG9NYXRjaElubGluZVNuYXBzaG90KGBcbk9iamVjdCB7XG4gIFwicGFja2FnZU5hbWVcIjogXCJAcmVhY3Qtc3ByaW5nL3JhZnpcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMi4wLjAtYWxwaGEuM1wiLFxufVxuYClcbiAgICBleHBlY3QocGFyc2VOYW1lQW5kVmVyc2lvbihcIkBtaWNyb3NvZnQrYXBpLWV4dHJhY3RvcisyLjIuM1wiKSlcbiAgICAgIC50b01hdGNoSW5saW5lU25hcHNob3QoYFxuT2JqZWN0IHtcbiAgXCJwYWNrYWdlTmFtZVwiOiBcIkBtaWNyb3NvZnQvYXBpLWV4dHJhY3RvclwiLFxuICBcInZlcnNpb25cIjogXCIyLjIuM1wiLFxufVxuYClcbiAgfSlcbiAgaXQoXCJ3b3JrcyBmb3Igb3JkZXJlZCBwYXRjaGVzXCIsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VOYW1lQW5kVmVyc2lvbihcInBhdGNoLXBhY2thZ2UrMi4wLjArMDFcIikpXG4gICAgICAudG9NYXRjaElubGluZVNuYXBzaG90KGBcbk9iamVjdCB7XG4gIFwicGFja2FnZU5hbWVcIjogXCJwYXRjaC1wYWNrYWdlXCIsXG4gIFwic2VxdWVuY2VOdW1iZXJcIjogMSxcbiAgXCJ2ZXJzaW9uXCI6IFwiMi4wLjBcIixcbn1cbmApXG4gICAgZXhwZWN0KHBhcnNlTmFtZUFuZFZlcnNpb24oXCJAcmVhY3Qtc3ByaW5nK3JhZnorMi4wLjAtYWxwaGEuMysyM1wiKSlcbiAgICAgIC50b01hdGNoSW5saW5lU25hcHNob3QoYFxuT2JqZWN0IHtcbiAgXCJwYWNrYWdlTmFtZVwiOiBcIkByZWFjdC1zcHJpbmcvcmFmelwiLFxuICBcInNlcXVlbmNlTnVtYmVyXCI6IDIzLFxuICBcInZlcnNpb25cIjogXCIyLjAuMC1hbHBoYS4zXCIsXG59XG5gKVxuICAgIGV4cGVjdChwYXJzZU5hbWVBbmRWZXJzaW9uKFwiQG1pY3Jvc29mdCthcGktZXh0cmFjdG9yKzIuMC4wKzAwMVwiKSlcbiAgICAgIC50b01hdGNoSW5saW5lU25hcHNob3QoYFxuT2JqZWN0IHtcbiAgXCJwYWNrYWdlTmFtZVwiOiBcIkBtaWNyb3NvZnQvYXBpLWV4dHJhY3RvclwiLFxuICBcInNlcXVlbmNlTnVtYmVyXCI6IDEsXG4gIFwidmVyc2lvblwiOiBcIjIuMC4wXCIsXG59XG5gKVxuICB9KVxuXG4gIGl0KFwid29ya3MgZm9yIG9yZGVyZWQgcGF0Y2hlcyB3aXRoIG5hbWVzXCIsICgpID0+IHtcbiAgICBleHBlY3QocGFyc2VOYW1lQW5kVmVyc2lvbihcInBhdGNoLXBhY2thZ2UrMi4wLjArMDIxK0ZpeEltcG9ydGFudFRoaW5nXCIpKVxuICAgICAgLnRvTWF0Y2hJbmxpbmVTbmFwc2hvdChgXG5PYmplY3Qge1xuICBcInBhY2thZ2VOYW1lXCI6IFwicGF0Y2gtcGFja2FnZVwiLFxuICBcInNlcXVlbmNlTmFtZVwiOiBcIkZpeEltcG9ydGFudFRoaW5nXCIsXG4gIFwic2VxdWVuY2VOdW1iZXJcIjogMjEsXG4gIFwidmVyc2lvblwiOiBcIjIuMC4wXCIsXG59XG5gKVxuICAgIGV4cGVjdChwYXJzZU5hbWVBbmRWZXJzaW9uKFwiQHJlYWN0LXNwcmluZytyYWZ6KzIuMC4wLWFscGhhLjMrMDAwMDIzK0Zvb1wiKSlcbiAgICAgIC50b01hdGNoSW5saW5lU25hcHNob3QoYFxuT2JqZWN0IHtcbiAgXCJwYWNrYWdlTmFtZVwiOiBcIkByZWFjdC1zcHJpbmcvcmFmelwiLFxuICBcInNlcXVlbmNlTmFtZVwiOiBcIkZvb1wiLFxuICBcInNlcXVlbmNlTnVtYmVyXCI6IDIzLFxuICBcInZlcnNpb25cIjogXCIyLjAuMC1hbHBoYS4zXCIsXG59XG5gKVxuICAgIGV4cGVjdChwYXJzZU5hbWVBbmRWZXJzaW9uKFwiQG1pY3Jvc29mdCthcGktZXh0cmFjdG9yKzIuMC4wKzAwMStCYXJcIikpXG4gICAgICAudG9NYXRjaElubGluZVNuYXBzaG90KGBcbk9iamVjdCB7XG4gIFwicGFja2FnZU5hbWVcIjogXCJAbWljcm9zb2Z0L2FwaS1leHRyYWN0b3JcIixcbiAgXCJzZXF1ZW5jZU5hbWVcIjogXCJCYXJcIixcbiAgXCJzZXF1ZW5jZU51bWJlclwiOiAxLFxuICBcInZlcnNpb25cIjogXCIyLjAuMFwiLFxufVxuYClcbiAgfSlcbn0pXG4iXX0=