sliftutils 1.7.88 → 1.7.89

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.
Files changed (125) hide show
  1. package/.claude/settings.local.json +3 -1
  2. package/dist/treeSummary.ts.cache +2 -2
  3. package/index.d.ts +674 -295
  4. package/misc/dist/environment.ts.cache +2 -2
  5. package/misc/dist/getSecret.ts.cache +2 -2
  6. package/misc/dist/strings.ts.cache +2 -2
  7. package/misc/dist/zip.ts.cache +2 -2
  8. package/misc/https/dist/certs.ts.cache +2 -2
  9. package/misc/https/dist/cloudflareHelpers.ts.cache +2 -2
  10. package/misc/https/dist/dns.ts.cache +2 -2
  11. package/misc/https/dist/hostServer.ts.cache +49 -21
  12. package/misc/https/dist/hostsFile.ts.cache +82 -0
  13. package/misc/https/dist/httpsCerts.ts.cache +2 -2
  14. package/misc/https/dist/persistentLocalStorage.ts.cache +2 -2
  15. package/misc/https/hostServer.d.ts +6 -2
  16. package/misc/https/hostServer.ts +52 -19
  17. package/misc/https/hostsFile.d.ts +7 -0
  18. package/misc/https/hostsFile.ts +66 -0
  19. package/package.json +1 -1
  20. package/render-utils/dist/observer.tsx.cache +2 -2
  21. package/storage/ArchivesDisk.d.ts +3 -6
  22. package/storage/ArchivesDisk.ts +26 -2
  23. package/storage/BulkDatabase2/BulkDatabaseReader.ts +1 -1
  24. package/storage/BulkDatabase2/dist/BulkDatabaseBase.ts.cache +2 -2
  25. package/storage/BulkDatabase2/dist/BulkDatabaseFormat.ts.cache +2 -2
  26. package/storage/BulkDatabase2/dist/BulkDatabaseMerge.ts.cache +2 -2
  27. package/storage/BulkDatabase2/dist/BulkDatabaseReader.ts.cache +3 -3
  28. package/storage/BulkDatabase2/dist/LoadedIndex.ts.cache +2 -2
  29. package/storage/BulkDatabase2/dist/WriteOverlay.ts.cache +2 -2
  30. package/storage/BulkDatabase2/dist/blockCache.ts.cache +2 -2
  31. package/storage/BulkDatabase2/dist/mergeLock.ts.cache +2 -2
  32. package/storage/BulkDatabase2/dist/mergeMarkers.ts.cache +2 -2
  33. package/storage/BulkDatabase2/dist/streamLog.ts.cache +2 -2
  34. package/storage/BulkDatabase2/dist/syncClient.ts.cache +2 -2
  35. package/storage/IArchives.d.ts +37 -24
  36. package/storage/IArchives.ts +47 -62
  37. package/storage/LogMap.d.ts +56 -0
  38. package/storage/LogMap.ts +220 -0
  39. package/storage/archiveHelpers.d.ts +36 -0
  40. package/storage/archiveHelpers.ts +103 -0
  41. package/storage/backblaze.d.ts +7 -12
  42. package/storage/backblaze.ts +53 -48
  43. package/storage/dist/ArchivesDisk.ts.cache +28 -2
  44. package/storage/dist/FileFolderAPI.tsx.cache +2 -2
  45. package/storage/dist/IArchives.ts.cache +16 -52
  46. package/storage/dist/IndexedDBFileFolderAPI.ts.cache +2 -2
  47. package/storage/dist/JSONStorage.ts.cache +2 -2
  48. package/storage/dist/LogMap.ts.cache +212 -0
  49. package/storage/dist/PendingManager.tsx.cache +2 -2
  50. package/storage/dist/TransactionStorage.ts.cache +2 -2
  51. package/storage/dist/backblaze.ts.cache +58 -44
  52. package/storage/dist/fileSystemPointer.ts.cache +2 -2
  53. package/storage/dist/remoteFileStorage.ts.cache +2 -2
  54. package/storage/remoteStorage/ArchivesDelayed.d.ts +66 -0
  55. package/storage/remoteStorage/ArchivesDelayed.ts +237 -0
  56. package/storage/remoteStorage/ArchivesRemote.d.ts +5 -6
  57. package/storage/remoteStorage/ArchivesRemote.ts +26 -5
  58. package/storage/remoteStorage/ArchivesUrl.d.ts +2 -5
  59. package/storage/remoteStorage/ArchivesUrl.ts +2 -2
  60. package/storage/remoteStorage/accessPage.tsx +12 -0
  61. package/storage/remoteStorage/blobStore.d.ts +162 -189
  62. package/storage/remoteStorage/blobStore.ts +495 -952
  63. package/storage/remoteStorage/bucketDisk.d.ts +24 -3
  64. package/storage/remoteStorage/bucketDisk.ts +56 -22
  65. package/storage/remoteStorage/certTrustModal.d.ts +1 -0
  66. package/storage/remoteStorage/certTrustModal.tsx +48 -0
  67. package/storage/remoteStorage/cliArgs.d.ts +2 -0
  68. package/storage/remoteStorage/cliArgs.ts +5 -0
  69. package/storage/remoteStorage/createArchives.d.ts +8 -7
  70. package/storage/remoteStorage/createArchives.ts +65 -26
  71. package/storage/remoteStorage/deployTakeover.ts +1 -1
  72. package/storage/remoteStorage/dist/ArchivesDelayed.ts.cache +220 -0
  73. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +25 -5
  74. package/storage/remoteStorage/dist/ArchivesUrl.ts.cache +3 -3
  75. package/storage/remoteStorage/dist/accessPage.tsx.cache +13 -3
  76. package/storage/remoteStorage/dist/accessStats.ts.cache +2 -2
  77. package/storage/remoteStorage/dist/blobStore.ts.cache +483 -965
  78. package/storage/remoteStorage/dist/bucketDisk.ts.cache +60 -29
  79. package/storage/remoteStorage/dist/certTrustModal.tsx.cache +55 -0
  80. package/storage/remoteStorage/dist/cliArgs.ts.cache +9 -4
  81. package/storage/remoteStorage/dist/createArchives.ts.cache +63 -26
  82. package/storage/remoteStorage/dist/deployTakeover.ts.cache +5 -5
  83. package/storage/remoteStorage/dist/intermediateManagement.ts.cache +286 -0
  84. package/storage/remoteStorage/dist/intermediateSources.ts.cache +2 -2
  85. package/storage/remoteStorage/dist/remoteConfig.ts.cache +122 -56
  86. package/storage/remoteStorage/dist/serverConfig.ts.cache +4 -4
  87. package/storage/remoteStorage/dist/sourceWrapper.ts.cache +7 -11
  88. package/storage/remoteStorage/dist/sourcesList.ts.cache +3 -6
  89. package/storage/remoteStorage/dist/storageClientController.ts.cache +2 -2
  90. package/storage/remoteStorage/dist/storageController.ts.cache +27 -12
  91. package/storage/remoteStorage/dist/storageServer.ts.cache +27 -7
  92. package/storage/remoteStorage/dist/storageServerCli.ts.cache +7 -3
  93. package/storage/remoteStorage/dist/storageServerState.ts.cache +133 -696
  94. package/storage/remoteStorage/dist/storeConfig.ts.cache +52 -0
  95. package/storage/remoteStorage/dist/storePlan.ts.cache +110 -81
  96. package/storage/remoteStorage/dist/storeSources.ts.cache +51 -0
  97. package/storage/remoteStorage/dist/storeSync.ts.cache +650 -0
  98. package/storage/remoteStorage/dist/validation.ts.cache +14 -4
  99. package/storage/remoteStorage/intermediateManagement.d.ts +12 -0
  100. package/storage/remoteStorage/intermediateManagement.ts +264 -0
  101. package/storage/remoteStorage/remoteConfig.d.ts +32 -0
  102. package/storage/remoteStorage/remoteConfig.ts +115 -50
  103. package/storage/remoteStorage/serverConfig.d.ts +1 -1
  104. package/storage/remoteStorage/serverConfig.ts +1 -1
  105. package/storage/remoteStorage/sourceWrapper.ts +4 -8
  106. package/storage/remoteStorage/sourcesList.d.ts +0 -2
  107. package/storage/remoteStorage/sourcesList.ts +0 -3
  108. package/storage/remoteStorage/spec.md +18 -4
  109. package/storage/remoteStorage/storageController.d.ts +10 -0
  110. package/storage/remoteStorage/storageController.ts +29 -16
  111. package/storage/remoteStorage/storageServer.d.ts +2 -0
  112. package/storage/remoteStorage/storageServer.ts +28 -4
  113. package/storage/remoteStorage/storageServerCli.ts +5 -1
  114. package/storage/remoteStorage/storageServerState.d.ts +34 -21
  115. package/storage/remoteStorage/storageServerState.ts +147 -662
  116. package/storage/remoteStorage/storeConfig.d.ts +30 -0
  117. package/storage/remoteStorage/storeConfig.ts +62 -0
  118. package/storage/remoteStorage/storePlan.d.ts +29 -17
  119. package/storage/remoteStorage/storePlan.ts +112 -85
  120. package/storage/remoteStorage/storeSources.d.ts +11 -0
  121. package/storage/remoteStorage/storeSources.ts +47 -0
  122. package/storage/remoteStorage/storeSync.d.ts +53 -0
  123. package/storage/remoteStorage/storeSync.ts +632 -0
  124. package/storage/remoteStorage/validation.d.ts +2 -0
  125. package/storage/remoteStorage/validation.ts +10 -0
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.StoreConfig = void 0;
4
+ const misc_1 = require("socket-function/src/misc");
5
+ const IArchives_1 = require("../IArchives");
6
+ // The configuration of ONE store, kept current. A store is named by its entries (see CommonConfig.name), and at any instant exactly one of them is in effect - the config write path enforces that - so "the configuration of this store right now" is a single entry, and everything the store does with routes, flags and limits reads it from here rather than being handed a snapshot that goes stale.
7
+ class StoreConfig {
8
+ constructor(name, entries) {
9
+ this.name = name;
10
+ // Every entry naming this store, oldest window first - past ones included, because a stamped write or a scan can legitimately concern a window that has already ended
11
+ this.entries = [];
12
+ this.update(entries);
13
+ }
14
+ /** The routing config changed. Same store either way: its name did not change, so neither did its folder, its index, or the data in it. */
15
+ /** No entries is a real state, not an error: a store exists as soon as its folder does, and it may never have heard of a configuration (see StorePolicy). */
16
+ update(entries) {
17
+ let ordered = [...entries];
18
+ (0, misc_1.sort)(ordered, x => x.validWindow[0]);
19
+ this.entries = ordered;
20
+ }
21
+ all() {
22
+ return this.entries;
23
+ }
24
+ /**
25
+ * What this store is configured to be right now: the entry whose window contains this moment;
26
+ * failing that the next one due to start; failing that the last one to have ended.
27
+ *
28
+ * There is always an answer, and it matters that there is: a store between windows still holds
29
+ * data and still has to answer for it, so it needs a route and flags even when nothing is
30
+ * currently pointing writes at it. Which of the three cases produced the answer is deliberately
31
+ * not exposed - the valid window itself is what says whether writes belong here, and every write
32
+ * is checked against it separately.
33
+ */
34
+ current() {
35
+ let now = Date.now();
36
+ let containing = this.entries.find(x => x.validWindow[0] <= now && now < x.validWindow[1]);
37
+ if (containing)
38
+ return containing;
39
+ let upcoming = this.entries.find(x => x.validWindow[0] > now);
40
+ if (upcoming)
41
+ return upcoming;
42
+ let last = this.entries[this.entries.length - 1];
43
+ if (last)
44
+ return last;
45
+ return UNCONFIGURED;
46
+ }
47
+ }
48
+ exports.StoreConfig = StoreConfig;
49
+ // A store nobody has configured: always valid, the whole key space, no delays and no limits. Every one of these is the answer that does the least - it holds its own data and nothing else happens to it - which is what makes a store usable before it has ever seen a config.
50
+ const UNCONFIGURED = { validWindow: IArchives_1.FULL_VALID_WINDOW };
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVDb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdG9yZUNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFBZ0Q7QUFDaEQsNENBQStEO0FBRS9ELDJZQUEyWTtBQUUzWSxNQUFhLFdBQVc7SUFDcEIsWUFDb0IsSUFBWSxFQUM1QixPQUF1QjtRQURQLFNBQUksR0FBSixJQUFJLENBQVE7UUFNaEMsc0tBQXNLO1FBQzlKLFlBQU8sR0FBbUIsRUFBRSxDQUFDO1FBSmpDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUtELDJJQUEySTtJQUMzSSw2SkFBNko7SUFDdEosTUFBTSxDQUFDLE9BQXVCO1FBQ2pDLElBQUksT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUMzQixJQUFBLFdBQUksRUFBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDM0IsQ0FBQztJQUVNLEdBQUc7UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLE9BQU87UUFDVixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNGLElBQUksVUFBVTtZQUFFLE9BQU8sVUFBVSxDQUFDO1FBQ2xDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUM5RCxJQUFJLFFBQVE7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUM5QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RCLE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7Q0FDSjtBQTNDRCxrQ0EyQ0M7QUFZRCxnUkFBZ1I7QUFDaFIsTUFBTSxZQUFZLEdBQWdCLEVBQUUsV0FBVyxFQUFFLDZCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgSG9zdGVkQ29uZmlnLCBGVUxMX1ZBTElEX1dJTkRPVyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcblxuLy8gVGhlIGNvbmZpZ3VyYXRpb24gb2YgT05FIHN0b3JlLCBrZXB0IGN1cnJlbnQuIEEgc3RvcmUgaXMgbmFtZWQgYnkgaXRzIGVudHJpZXMgKHNlZSBDb21tb25Db25maWcubmFtZSksIGFuZCBhdCBhbnkgaW5zdGFudCBleGFjdGx5IG9uZSBvZiB0aGVtIGlzIGluIGVmZmVjdCAtIHRoZSBjb25maWcgd3JpdGUgcGF0aCBlbmZvcmNlcyB0aGF0IC0gc28gXCJ0aGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIHN0b3JlIHJpZ2h0IG5vd1wiIGlzIGEgc2luZ2xlIGVudHJ5LCBhbmQgZXZlcnl0aGluZyB0aGUgc3RvcmUgZG9lcyB3aXRoIHJvdXRlcywgZmxhZ3MgYW5kIGxpbWl0cyByZWFkcyBpdCBmcm9tIGhlcmUgcmF0aGVyIHRoYW4gYmVpbmcgaGFuZGVkIGEgc25hcHNob3QgdGhhdCBnb2VzIHN0YWxlLlxuXG5leHBvcnQgY2xhc3MgU3RvcmVDb25maWcge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSxcbiAgICApIHtcbiAgICAgICAgdGhpcy51cGRhdGUoZW50cmllcyk7XG4gICAgfVxuXG4gICAgLy8gRXZlcnkgZW50cnkgbmFtaW5nIHRoaXMgc3RvcmUsIG9sZGVzdCB3aW5kb3cgZmlyc3QgLSBwYXN0IG9uZXMgaW5jbHVkZWQsIGJlY2F1c2UgYSBzdGFtcGVkIHdyaXRlIG9yIGEgc2NhbiBjYW4gbGVnaXRpbWF0ZWx5IGNvbmNlcm4gYSB3aW5kb3cgdGhhdCBoYXMgYWxyZWFkeSBlbmRlZFxuICAgIHByaXZhdGUgZW50cmllczogSG9zdGVkQ29uZmlnW10gPSBbXTtcblxuICAgIC8qKiBUaGUgcm91dGluZyBjb25maWcgY2hhbmdlZC4gU2FtZSBzdG9yZSBlaXRoZXIgd2F5OiBpdHMgbmFtZSBkaWQgbm90IGNoYW5nZSwgc28gbmVpdGhlciBkaWQgaXRzIGZvbGRlciwgaXRzIGluZGV4LCBvciB0aGUgZGF0YSBpbiBpdC4gKi9cbiAgICAvKiogTm8gZW50cmllcyBpcyBhIHJlYWwgc3RhdGUsIG5vdCBhbiBlcnJvcjogYSBzdG9yZSBleGlzdHMgYXMgc29vbiBhcyBpdHMgZm9sZGVyIGRvZXMsIGFuZCBpdCBtYXkgbmV2ZXIgaGF2ZSBoZWFyZCBvZiBhIGNvbmZpZ3VyYXRpb24gKHNlZSBTdG9yZVBvbGljeSkuICovXG4gICAgcHVibGljIHVwZGF0ZShlbnRyaWVzOiBIb3N0ZWRDb25maWdbXSk6IHZvaWQge1xuICAgICAgICBsZXQgb3JkZXJlZCA9IFsuLi5lbnRyaWVzXTtcbiAgICAgICAgc29ydChvcmRlcmVkLCB4ID0+IHgudmFsaWRXaW5kb3dbMF0pO1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBvcmRlcmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhbGwoKTogSG9zdGVkQ29uZmlnW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRyaWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoYXQgdGhpcyBzdG9yZSBpcyBjb25maWd1cmVkIHRvIGJlIHJpZ2h0IG5vdzogdGhlIGVudHJ5IHdob3NlIHdpbmRvdyBjb250YWlucyB0aGlzIG1vbWVudDtcbiAgICAgKiBmYWlsaW5nIHRoYXQgdGhlIG5leHQgb25lIGR1ZSB0byBzdGFydDsgZmFpbGluZyB0aGF0IHRoZSBsYXN0IG9uZSB0byBoYXZlIGVuZGVkLlxuICAgICAqXG4gICAgICogVGhlcmUgaXMgYWx3YXlzIGFuIGFuc3dlciwgYW5kIGl0IG1hdHRlcnMgdGhhdCB0aGVyZSBpczogYSBzdG9yZSBiZXR3ZWVuIHdpbmRvd3Mgc3RpbGwgaG9sZHNcbiAgICAgKiBkYXRhIGFuZCBzdGlsbCBoYXMgdG8gYW5zd2VyIGZvciBpdCwgc28gaXQgbmVlZHMgYSByb3V0ZSBhbmQgZmxhZ3MgZXZlbiB3aGVuIG5vdGhpbmcgaXNcbiAgICAgKiBjdXJyZW50bHkgcG9pbnRpbmcgd3JpdGVzIGF0IGl0LiBXaGljaCBvZiB0aGUgdGhyZWUgY2FzZXMgcHJvZHVjZWQgdGhlIGFuc3dlciBpcyBkZWxpYmVyYXRlbHlcbiAgICAgKiBub3QgZXhwb3NlZCAtIHRoZSB2YWxpZCB3aW5kb3cgaXRzZWxmIGlzIHdoYXQgc2F5cyB3aGV0aGVyIHdyaXRlcyBiZWxvbmcgaGVyZSwgYW5kIGV2ZXJ5IHdyaXRlXG4gICAgICogaXMgY2hlY2tlZCBhZ2FpbnN0IGl0IHNlcGFyYXRlbHkuXG4gICAgICovXG4gICAgcHVibGljIGN1cnJlbnQoKTogU3RvcmVQb2xpY3kge1xuICAgICAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgbGV0IGNvbnRhaW5pbmcgPSB0aGlzLmVudHJpZXMuZmluZCh4ID0+IHgudmFsaWRXaW5kb3dbMF0gPD0gbm93ICYmIG5vdyA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgICAgICBpZiAoY29udGFpbmluZykgcmV0dXJuIGNvbnRhaW5pbmc7XG4gICAgICAgIGxldCB1cGNvbWluZyA9IHRoaXMuZW50cmllcy5maW5kKHggPT4geC52YWxpZFdpbmRvd1swXSA+IG5vdyk7XG4gICAgICAgIGlmICh1cGNvbWluZykgcmV0dXJuIHVwY29taW5nO1xuICAgICAgICBsZXQgbGFzdCA9IHRoaXMuZW50cmllc1t0aGlzLmVudHJpZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChsYXN0KSByZXR1cm4gbGFzdDtcbiAgICAgICAgcmV0dXJuIFVOQ09ORklHVVJFRDtcbiAgICB9XG59XG5cbi8qKiBUaGUgcGFydHMgb2YgYSBjb25maWcgZW50cnkgdGhhdCBkZXNjcmliZSB3aGF0IGEgc3RvcmUgSVMgLSBhcyBvcHBvc2VkIHRvIHdoaWNoIGVudHJ5IHNhaWQgc28uIEtlcHQgc2VwYXJhdGUgYmVjYXVzZSBhIHN0b3JlIHdpdGggbm8gZW50cmllcyBzdGlsbCBoYXMgYWxsIG9mIHRoZW0uICovXG5leHBvcnQgdHlwZSBTdG9yZVBvbGljeSA9IHtcbiAgICB2YWxpZFdpbmRvdzogW251bWJlciwgbnVtYmVyXTtcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgZmFzdD86IGJvb2xlYW47XG4gICAgd3JpdGVEZWxheT86IG51bWJlcjtcbiAgICBub0Z1bGxTeW5jPzogYm9vbGVhbjtcbiAgICByZWFkZXJEaXNrTGltaXQ/OiBudW1iZXI7XG59O1xuXG4vLyBBIHN0b3JlIG5vYm9keSBoYXMgY29uZmlndXJlZDogYWx3YXlzIHZhbGlkLCB0aGUgd2hvbGUga2V5IHNwYWNlLCBubyBkZWxheXMgYW5kIG5vIGxpbWl0cy4gRXZlcnkgb25lIG9mIHRoZXNlIGlzIHRoZSBhbnN3ZXIgdGhhdCBkb2VzIHRoZSBsZWFzdCAtIGl0IGhvbGRzIGl0cyBvd24gZGF0YSBhbmQgbm90aGluZyBlbHNlIGhhcHBlbnMgdG8gaXQgLSB3aGljaCBpcyB3aGF0IG1ha2VzIGEgc3RvcmUgdXNhYmxlIGJlZm9yZSBpdCBoYXMgZXZlciBzZWVuIGEgY29uZmlnLlxuY29uc3QgVU5DT05GSUdVUkVEOiBTdG9yZVBvbGljeSA9IHsgdmFsaWRXaW5kb3c6IEZVTExfVkFMSURfV0lORE9XIH07XG4iXX0=
52
+ /* _JS_SOURCE_HASH = "696854eab64026ab54a84df68537b6018f1f3e7d4f5bceb692aa1fc72ff2e347"; */
@@ -1,21 +1,28 @@
1
- "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
1
+ "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
- //exports.computeStorePlan = exports.selectEntryAt = exports.findSelfIndexes = void 0;
3
+ //exports.planSelfStores = exports.previousWindowOwners = exports.selectEntryAt = exports.findSelfIndexes = exports.isSelfSource = void 0;
4
4
  const misc_1 = require("socket-function/src/misc");
5
5
  const IArchives_1 = require("../IArchives");
6
6
  const remoteConfig_1 = require("./remoteConfig");
7
7
  const serverConfig_1 = require("./serverConfig");
8
8
  // Turns a bucket's routing config into this server's store plan: which of the entries are us, what stores (one per route) we run, and which peers each store synchronizes from.
9
+ /** Whether a config entry is THIS server's copy of this bucket - the same account and bucket, at an address this process answers on. */
10
+ function isSelfSource(source, account, bucketName) {
11
+ if (source.type !== "remote")
12
+ return false;
13
+ let parsed = (0, remoteConfig_1.parseHostedUrl)(source.url);
14
+ if (parsed.account !== account || parsed.bucketName !== bucketName)
15
+ return false;
16
+ return (0, serverConfig_1.isOwnAddress)(parsed.address, parsed.port);
17
+ }
18
+ exports.isSelfSource = isSelfSource;
9
19
  function findSelfIndexes(routing, account, bucketName) {
10
20
  let indexes = [];
11
21
  for (let i = 0; i < routing.sources.length; i++) {
12
22
  let source = routing.sources[i];
13
- if (typeof source === "string" || source.type !== "remote")
14
- continue;
15
- let parsed = (0, remoteConfig_1.parseHostedUrl)(source.url);
16
- if (parsed.account !== account || parsed.bucketName !== bucketName)
23
+ if (typeof source === "string")
17
24
  continue;
18
- if ((0, serverConfig_1.isOwnAddress)(parsed.address, parsed.port)) {
25
+ if (isSelfSource(source, account, bucketName)) {
19
26
  indexes.push(i);
20
27
  }
21
28
  }
@@ -44,6 +51,87 @@ function selectEntryAt(entries, time, route) {
44
51
  return best;
45
52
  }
46
53
  exports.selectEntryAt = selectEntryAt;
54
+ /** The parts of `ranges` that `cut` does not cover, plus the single range spanning what it did. Routes are half-open [start, end), so subtracting one from another leaves at most a piece on each side. */
55
+ function subtractRoute(ranges, cut) {
56
+ let remaining = [];
57
+ let claimed;
58
+ for (let range of ranges) {
59
+ let overlap = (0, remoteConfig_1.routeIntersection)(range, cut);
60
+ if (!overlap) {
61
+ remaining.push(range);
62
+ continue;
63
+ }
64
+ claimed = claimed && [Math.min(claimed[0], overlap[0]), Math.max(claimed[1], overlap[1])] || overlap;
65
+ if (range[0] < overlap[0])
66
+ remaining.push([range[0], overlap[0]]);
67
+ if (overlap[1] < range[1])
68
+ remaining.push([overlap[1], range[1]]);
69
+ }
70
+ return { remaining, claimed };
71
+ }
72
+ /**
73
+ * Who held each slice of our route in the window before windowStart, for every self entry whose
74
+ * window starts exactly then. This is the whole of "who do we take over from": a store taking over a
75
+ * route may be taking it from several previous owners at once (their shards need not line up with
76
+ * ours), and from itself for the parts it already held.
77
+ *
78
+ * A self entry is skipped when an EARLIER entry valid at the boundary already covers its whole route:
79
+ * config order is priority, so that entry is the write target and we are not the one taking over.
80
+ * Owners are then resolved in config order too, each claiming the part of our route still unclaimed -
81
+ * the same first-match-wins rule that picks a write target at any other moment.
82
+ *
83
+ * Pure: config in, plan out. Nothing here reads a store, a clock, or the network.
84
+ */
85
+ function previousWindowOwners(config, windowStart, selfIndexes) {
86
+ let selfIndexSet = new Set(selfIndexes);
87
+ let previousTime = windowStart - 1;
88
+ let validAt = (source, time) => source.validWindow[0] <= time && time < source.validWindow[1];
89
+ let byRoute = new Map();
90
+ for (let selfIndex of selfIndexes) {
91
+ let self = config.sources[selfIndex];
92
+ if (typeof self === "string" || self.validWindow[0] !== windowStart)
93
+ continue;
94
+ let selfRoute = self.route || IArchives_1.FULL_ROUTE;
95
+ let shadowed = false;
96
+ for (let i = 0; i < selfIndex; i++) {
97
+ let other = config.sources[i];
98
+ if (typeof other === "string" || !validAt(other, windowStart))
99
+ continue;
100
+ let route = other.route || IArchives_1.FULL_ROUTE;
101
+ if (route[0] <= selfRoute[0] && selfRoute[1] <= route[1]) {
102
+ shadowed = true;
103
+ break;
104
+ }
105
+ }
106
+ if (shadowed)
107
+ continue;
108
+ // Keyed by both: one name can take over several routes at the same boundary, and each is pulled separately
109
+ let handoverKey = `${self.name}|${JSON.stringify(selfRoute)}`;
110
+ let handover = byRoute.get(handoverKey);
111
+ if (!handover) {
112
+ handover = { name: self.name, route: selfRoute, scanOwnDisk: false, remotes: new Map() };
113
+ byRoute.set(handoverKey, handover);
114
+ }
115
+ let unclaimed = [[selfRoute[0], selfRoute[1]]];
116
+ for (let i = 0; i < config.sources.length && unclaimed.length; i++) {
117
+ let other = config.sources[i];
118
+ if (typeof other === "string" || !validAt(other, previousTime))
119
+ continue;
120
+ let { remaining, claimed } = subtractRoute(unclaimed, other.route || IArchives_1.FULL_ROUTE);
121
+ unclaimed = remaining;
122
+ if (!claimed)
123
+ continue;
124
+ if (selfIndexSet.has(i)) {
125
+ handover.scanOwnDisk = true;
126
+ continue;
127
+ }
128
+ let existing = handover.remotes.get(i);
129
+ handover.remotes.set(i, existing && [Math.min(existing[0], claimed[0]), Math.max(existing[1], claimed[1])] || claimed);
130
+ }
131
+ }
132
+ return [...byRoute.values()].filter(x => x.scanOwnDisk || x.remotes.size);
133
+ }
134
+ exports.previousWindowOwners = previousWindowOwners;
47
135
  function mergeRoutes(routes) {
48
136
  let list = routes.map(x => x || IArchives_1.FULL_ROUTE).map(x => [x[0], x[1]]);
49
137
  (0, misc_1.sort)(list, x => x[0]);
@@ -73,86 +161,27 @@ function summarizeSelf(selfEntries, now) {
73
161
  public: current.some(x => x.public),
74
162
  immutable: current.some(x => x.immutable),
75
163
  noFullSync: current.some(x => x.noFullSync),
76
- rawDisk: current.some(x => x.rawDisk),
77
164
  readerDiskLimit: (_a = current.find(x => x.readerDiskLimit !== undefined)) === null || _a === void 0 ? void 0 : _a.readerDiskLimit,
78
165
  };
79
166
  }
80
- function computeStorePlan(account, bucketName, routing) {
81
- var _a;
167
+ /** Which stores this server runs for a bucket, by name. Nothing more: a store is found by name, and configures itself. */
168
+ function planSelfStores(account, bucketName, routing) {
82
169
  let selfIndexes = findSelfIndexes(routing, account, bucketName);
83
170
  let selfEntries = selfIndexes.map(i => routing.sources[i]);
84
171
  let self = summarizeSelf(selfEntries, Date.now());
85
- let ownIndexes = new Set(selfIndexes);
86
- // One store per distinct route among ALL our entries - past and future windows included, so historical route folders keep serving their data and upcoming routes sync ahead of their window
87
- let groups = new Map();
88
- for (let i of selfIndexes) {
89
- let entry = routing.sources[i];
90
- let routeKey = JSON.stringify(entry.route || IArchives_1.FULL_ROUTE);
91
- let group = groups.get(routeKey);
92
- if (!group) {
93
- group = { route: entry.route, entries: [], firstIndex: i };
94
- groups.set(routeKey, group);
95
- }
96
- group.entries.push(entry);
97
- }
98
- let stores = [];
99
- for (let [routeKey, group] of groups) {
100
- let anchor = selectEntryAt(group.entries, Date.now());
101
- let diskWindow = [0, 0];
102
- if (anchor) {
103
- let [start, end] = anchor.validWindow;
104
- let merged = true;
105
- while (merged) {
106
- merged = false;
107
- for (let entry of group.entries) {
108
- let [entryStart, entryEnd] = entry.validWindow;
109
- if (entryStart > end || entryEnd < start)
110
- continue;
111
- if (entryStart < start || entryEnd > end) {
112
- start = Math.min(start, entryStart);
113
- end = Math.max(end, entryEnd);
114
- merged = true;
115
- }
116
- }
117
- }
118
- diskWindow = [start, end];
172
+ // One store per NAME among ALL our entries - past and future windows included, so a name we no longer write to keeps serving its data and a name we are about to use exists ahead of its window
173
+ let byName = new Map();
174
+ for (let entry of selfEntries) {
175
+ let entries = byName.get(entry.name);
176
+ if (!entries) {
177
+ entries = [];
178
+ byName.set(entry.name, entries);
119
179
  }
120
- let sourceSpecs = [{ validWindows: [diskWindow] }];
121
- let noFullSync = group.entries.some(x => x.noFullSync);
122
- // The same peer endpoint (url+route+flags) can appear under several windows at once (a switchover splits one window around an intermediate). It is ONE sync source that carries ALL those windows - never several sources, which would double-scan it and, worse, make matching a request depend on which window the caller happened to hold.
123
- let peerByKey = new Map();
124
- for (let i = group.firstIndex + 1; i < routing.sources.length; i++) {
125
- let source = routing.sources[i];
126
- if (typeof source === "string" || ownIndexes.has(i))
127
- continue;
128
- let sharedRoute = (0, remoteConfig_1.routeIntersection)(group.route, source.route);
129
- if (!sharedRoute)
130
- continue;
131
- let key = JSON.stringify({ ...source, validWindow: undefined });
132
- let spec = peerByKey.get(key);
133
- if (!spec) {
134
- spec = { sourceConfig: source, validWindows: [], route: sharedRoute, noFullSync: source.noFullSync || noFullSync };
135
- peerByKey.set(key, spec);
136
- sourceSpecs.push(spec);
137
- }
138
- spec.validWindows.push(source.validWindow);
139
- }
140
- stores.push({
141
- routeKey,
142
- route: group.route,
143
- entries: group.entries,
144
- rawDisk: group.entries.some(x => x.rawDisk),
145
- readerDiskLimit: (_a = group.entries.find(x => x.readerDiskLimit !== undefined)) === null || _a === void 0 ? void 0 : _a.readerDiskLimit,
146
- sourceSpecs,
147
- });
148
- }
149
- if (!stores.length) {
150
- // Not in the config at all: still serve whatever the plain folder holds, through one inert full-route store
151
- stores.push({ routeKey: JSON.stringify(IArchives_1.FULL_ROUTE), route: undefined, entries: [], rawDisk: false, readerDiskLimit: undefined, sourceSpecs: [{ validWindows: [[0, 0]] }] });
180
+ entries.push(entry);
152
181
  }
153
- let structureKey = JSON.stringify(stores.map(s => ({ routeKey: s.routeKey, rawDisk: s.rawDisk, readerDiskLimit: s.readerDiskLimit })));
154
- return { selfEntries, self, stores, structureKey };
182
+ // Not in the config at all: no name means no store here
183
+ return { selfEntries, self, stores: [...byName].map(([name, entries]) => ({ name, entries })) };
155
184
  }
156
- exports.computeStorePlan = computeStorePlan;
157
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVQbGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVQbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFnRDtBQUNoRCw0Q0FBb0Y7QUFDcEYsaURBQWtGO0FBQ2xGLGlEQUE4QztBQUU5QyxnTEFBZ0w7QUFFaEwsU0FBZ0IsZUFBZSxDQUFDLE9BQXFCLEVBQUUsT0FBZSxFQUFFLFVBQWtCO0lBQ3RGLElBQUksT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM5QyxJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUTtZQUFFLFNBQVM7UUFDckUsSUFBSSxNQUFNLEdBQUcsSUFBQSw2QkFBYyxFQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssVUFBVTtZQUFFLFNBQVM7UUFDN0UsSUFBSSxJQUFBLDJCQUFZLEVBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM1QyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDbkIsQ0FBQztBQVpELDBDQVlDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLE9BQXVCLEVBQUUsSUFBWSxFQUFFLEtBQWM7SUFDL0UsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEIsSUFBSSxRQUFRLEdBQUcsT0FBTyxD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QUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDM0MsZUFBZSxFQUFFLE1BQUEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQywwQ0FBRSxlQUFlO1lBQzFGLFdBQVc7U0FDZCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQiw0R0FBNEc7UUFDNUcsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLHNCQUFVLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hMLENBQUM7SUFDRCxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2SSxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFDdkQsQ0FBQztBQXZFRCw0Q0F1RUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBIb3N0ZWRDb25maWcsIFNvdXJjZUNvbmZpZywgRlVMTF9ST1VURSB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IHBhcnNlSG9zdGVkVXJsLCByb3V0ZUNvbnRhaW5zLCByb3V0ZUludGVyc2VjdGlvbiB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgaXNPd25BZGRyZXNzIH0gZnJvbSBcIi4vc2VydmVyQ29uZmlnXCI7XG5cbi8vIFR1cm5zIGEgYnVja2V0J3Mgcm91dGluZyBjb25maWcgaW50byB0aGlzIHNlcnZlcidzIHN0b3JlIHBsYW46IHdoaWNoIG9mIHRoZSBlbnRyaWVzIGFyZSB1cywgd2hhdCBzdG9yZXMgKG9uZSBwZXIgcm91dGUpIHdlIHJ1biwgYW5kIHdoaWNoIHBlZXJzIGVhY2ggc3RvcmUgc3luY2hyb25pemVzIGZyb20uXG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kU2VsZkluZGV4ZXMocm91dGluZzogUmVtb3RlQ29uZmlnLCBhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgICBsZXQgaW5kZXhlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdXRpbmcuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc291cmNlID0gcm91dGluZy5zb3VyY2VzW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UudHlwZSAhPT0gXCJyZW1vdGVcIikgY29udGludWU7XG4gICAgICAgIGxldCBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgaWYgKHBhcnNlZC5hY2NvdW50ICE9PSBhY2NvdW50IHx8IHBhcnNlZC5idWNrZXROYW1lICE9PSBidWNrZXROYW1lKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGlzT3duQWRkcmVzcyhwYXJzZWQuYWRkcmVzcywgcGFyc2VkLnBvcnQpKSB7XG4gICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4ZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RFbnRyeUF0KGVudHJpZXM6IEhvc3RlZENvbmZpZ1tdLCB0aW1lOiBudW1iZXIsIHJvdXRlPzogbnVtYmVyKTogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgY292ZXJpbmcgPSBlbnRyaWVzLmZpbHRlcih4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgaWYgKGNvdmVyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgZW50cmllcyA9IGNvdmVyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjb250YWluaW5nID0gZW50cmllcy5maW5kKHggPT4geC52YWxpZFdpbmRvd1swXSA8PSB0aW1lICYmIHRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICBpZiAoY29udGFpbmluZykgcmV0dXJuIGNvbnRhaW5pbmc7XG4gICAgbGV0IGJlc3Q6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBsZXQgZGlzdGFuY2UgPSBNYXRoLm1pbihNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMF0pLCBNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMV0pKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XG4gICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgIGJlc3QgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdDtcbn1cblxuLyoqIE91ciByb2xlIGluIGEgYnVja2V0J3Mgcm91dGluZyBjb25maWcsIHN1bW1hcml6ZWQgYWNyb3NzIEFMTCBjdXJyZW50bHktdmFsaWQgc2VsZiBlbnRyaWVzLiBTdG9yZWQgaW5zdGVhZCBvZiBhIHNpbmdsZSByZXByZXNlbnRhdGl2ZSBIb3N0ZWRDb25maWcsIHNvIG5vdGhpbmcgY2FuIGFjY2lkZW50YWxseSB1c2Ugb25lIGVudHJ5J3Mgcm91dGUgb3IgZmxhZ3Mgd2hlcmUgdGhlIHVuaW9uIGlzIHJlcXVpcmVkIC0gdGhlIHN0YW5kYXJkIGNvbmZpZyBoYXMgdGhlIHNhbWUgVVJMIHR3aWNlOiBhIHJvdXRlZCB3cml0ZS1zaGFyZCBlbnRyeSBwbHVzIGFuIHVucm91dGVkIHJlYWQtZXZlcnl0aGluZyBlbnRyeS4gKi9cbmV4cG9ydCB0eXBlIFNlbGZTdW1tYXJ5ID0ge1xuICAgIC8qKiBUaGUgdW5pb24gb2YgdGhlIGN1cnJlbnQgZW50cmllcycgcm91dGVzLCB3aXRoIG92ZXJsYXBwaW5nL2FkamFjZW50IHJhbmdlcyBjb21iaW5lZCAtIHdoaWNoIGNvbW1vbmx5IGNvbGxhcHNlcyB0byBhIHNpbmdsZSBmdWxsIHJhbmdlLCBtYWtpbmcgbWF0Y2hpbmcgdHJpdmlhbC4gKi9cbiAgICByb3V0ZXM6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICBwdWJsaWM6IGJvb2xlYW47XG4gICAgaW1tdXRhYmxlOiBib29sZWFuO1xuICAgIG5vRnVsbFN5bmM6IGJvb2xlYW47XG4gICAgcmF3RGlzazogYm9vbGVhbjtcbiAgICByZWFkZXJEaXNrTGltaXQ/OiBudW1iZXI7XG59O1xuXG5mdW5jdGlvbiBtZXJnZVJvdXRlcyhyb3V0ZXM6IChbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkKVtdKTogW251bWJlciwgbnVtYmVyXVtdIHtcbiAgICBsZXQgbGlzdCA9IHJvdXRlcy5tYXAoeCA9PiB4IHx8IEZVTExfUk9VVEUpLm1hcCh4ID0+IFt4WzBdLCB4WzFdXSBhcyBbbnVtYmVyLCBudW1iZXJdKTtcbiAgICBzb3J0KGxpc3QsIHggPT4geFswXSk7XG4gICAgbGV0IG1lcmdlZDogW251bWJlciwgbnVtYmVyXVtdID0gW107XG4gICAgZm9yIChsZXQgcm91dGUgb2YgbGlzdCkge1xuICAgICAgICBsZXQgbGFzdCA9IG1lcmdlZFttZXJnZWQubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChsYXN0ICYmIHJvdXRlWzBdIDw9IGxhc3RbMV0pIHtcbiAgICAgICAgICAgIGxhc3RbMV0gPSBNYXRoLm1heChsYXN0WzFdLCByb3V0ZVsxXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBtZXJnZWQucHVzaChyb3V0ZSk7XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWQ7XG59XG5cbmZ1bmN0aW9uIHN1bW1hcml6ZVNlbGYoc2VsZkVudHJpZXM6IEhvc3RlZENvbmZpZ1tdLCBub3c6IG51bWJlcik6IFNlbGZTdW1tYXJ5IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY3VycmVudCA9IHNlbGZFbnRyaWVzLmZpbHRlcih4ID0+IHgudmFsaWRXaW5kb3dbMF0gPD0gbm93ICYmIG5vdyA8IHgudmFsaWRXaW5kb3dbMV0pO1xuICAgIGlmICghY3VycmVudC5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG5lYXJlc3QgPSBzZWxlY3RFbnRyeUF0KHNlbGZFbnRyaWVzLCBub3cpO1xuICAgICAgICBjdXJyZW50ID0gbmVhcmVzdCAmJiBbbmVhcmVzdF0gfHwgW107XG4gICAgfVxuICAgIGlmICghY3VycmVudC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcm91dGVzOiBtZXJnZVJvdXRlcyhjdXJyZW50Lm1hcCh4ID0+IHgucm91dGUpKSxcbiAgICAgICAgcHVibGljOiBjdXJyZW50LnNvbWUoeCA9PiB4LnB1YmxpYyksXG4gICAgICAgIGltbXV0YWJsZTogY3VycmVudC5zb21lKHggPT4geC5pbW11dGFibGUpLFxuICAgICAgICBub0Z1bGxTeW5jOiBjdXJyZW50LnNvbWUoeCA9PiB4Lm5vRnVsbFN5bmMpLFxuICAgICAgICByYXdEaXNrOiBjdXJyZW50LnNvbWUoeCA9PiB4LnJhd0Rpc2spLFxuICAgICAgICByZWFkZXJEaXNrTGltaXQ6IGN1cnJlbnQuZmluZCh4ID0+IHgucmVhZGVyRGlza0xpbWl0ICE9PSB1bmRlZmluZWQpPy5yZWFkZXJEaXNrTGltaXQsXG4gICAgfTtcbn1cblxuZXhwb3J0IHR5cGUgU3RvcmVTb3VyY2VTcGVjID0geyBzb3VyY2VDb25maWc/OiBTb3VyY2VDb25maWc7IHZhbGlkV2luZG93czogW251bWJlciwgbnVtYmVyXVtdOyByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07IG5vRnVsbFN5bmM/OiBib29sZWFuIH07XG5leHBvcnQgdHlwZSBTdG9yZVBsYW5TdG9yZSA9IHtcbiAgICByb3V0ZUtleTogc3RyaW5nO1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICBlbnRyaWVzOiBIb3N0ZWRDb25maWdbXTtcbiAgICByYXdEaXNrOiBib29sZWFuO1xuICAgIHJlYWRlckRpc2tMaW1pdD86IG51bWJlcjtcbiAgICBzb3VyY2VTcGVjczogU3RvcmVTb3VyY2VTcGVjW107XG59O1xuZXhwb3J0IHR5cGUgU3RvcmVQbGFuID0ge1xuICAgIHNlbGZFbnRyaWVzOiBIb3N0ZWRDb25maWdbXTtcbiAgICBzZWxmOiBTZWxmU3VtbWFyeSB8IHVuZGVmaW5lZDtcbiAgICBzdG9yZXM6IFN0b3JlUGxhblN0b3JlW107XG4gICAgc3RydWN0dXJlS2V5OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVN0b3JlUGxhbihhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgcm91dGluZzogUmVtb3RlQ29uZmlnKTogU3RvcmVQbGFuIHtcbiAgICBsZXQgc2VsZkluZGV4ZXMgPSBmaW5kU2VsZkluZGV4ZXMocm91dGluZywgYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHNlbGZFbnRyaWVzID0gc2VsZkluZGV4ZXMubWFwKGkgPT4gcm91dGluZy5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZyk7XG4gICAgbGV0IHNlbGYgPSBzdW1tYXJpemVTZWxmKHNlbGZFbnRyaWVzLCBEYXRlLm5vdygpKTtcbiAgICBsZXQgb3duSW5kZXhlcyA9IG5ldyBTZXQoc2VsZkluZGV4ZXMpO1xuICAgIC8vIE9uZSBzdG9yZSBwZXIgZGlzdGluY3Qgcm91dGUgYW1vbmcgQUxMIG91ciBlbnRyaWVzIC0gcGFzdCBhbmQgZnV0dXJlIHdpbmRvd3MgaW5jbHVkZWQsIHNvIGhpc3RvcmljYWwgcm91dGUgZm9sZGVycyBrZWVwIHNlcnZpbmcgdGhlaXIgZGF0YSBhbmQgdXBjb21pbmcgcm91dGVzIHN5bmMgYWhlYWQgb2YgdGhlaXIgd2luZG93XG4gICAgbGV0IGdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJvdXRlPzogW251bWJlciwgbnVtYmVyXTsgZW50cmllczogSG9zdGVkQ29uZmlnW107IGZpcnN0SW5kZXg6IG51bWJlciB9PigpO1xuICAgIGZvciAobGV0IGkgb2Ygc2VsZkluZGV4ZXMpIHtcbiAgICAgICAgbGV0IGVudHJ5ID0gcm91dGluZy5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZztcbiAgICAgICAgbGV0IHJvdXRlS2V5ID0gSlNPTi5zdHJpbmdpZnkoZW50cnkucm91dGUgfHwgRlVMTF9ST1VURSk7XG4gICAgICAgIGxldCBncm91cCA9IGdyb3Vwcy5nZXQocm91dGVLZXkpO1xuICAgICAgICBpZiAoIWdyb3VwKSB7XG4gICAgICAgICAgICBncm91cCA9IHsgcm91dGU6IGVudHJ5LnJvdXRlLCBlbnRyaWVzOiBbXSwgZmlyc3RJbmRleDogaSB9O1xuICAgICAgICAgICAgZ3JvdXBzLnNldChyb3V0ZUtleSwgZ3JvdXApO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfVxuICAgIGxldCBzdG9yZXM6IFN0b3JlUGxhblN0b3JlW10gPSBbXTtcbiAgICBmb3IgKGxldCBbcm91dGVLZXksIGdyb3VwXSBvZiBncm91cHMpIHtcbiAgICAgICAgbGV0IGFuY2hvciA9IHNlbGVjdEVudHJ5QXQoZ3JvdXAuZW50cmllcywgRGF0ZS5ub3coKSk7XG4gICAgICAgIGxldCBkaXNrV2luZG93OiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDBdO1xuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgICBsZXQgW3N0YXJ0LCBlbmRdID0gYW5jaG9yLnZhbGlkV2luZG93O1xuICAgICAgICAgICAgbGV0IG1lcmdlZCA9IHRydWU7XG4gICAgICAgICAgICB3aGlsZSAobWVyZ2VkKSB7XG4gICAgICAgICAgICAgICAgbWVyZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgZ3JvdXAuZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgW2VudHJ5U3RhcnQsIGVudHJ5RW5kXSA9IGVudHJ5LnZhbGlkV2luZG93O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnlTdGFydCA+IGVuZCB8fCBlbnRyeUVuZCA8IHN0YXJ0KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5U3RhcnQgPCBzdGFydCB8fCBlbnRyeUVuZCA+IGVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgZW50cnlTdGFydCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBNYXRoLm1heChlbmQsIGVudHJ5RW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNrV2luZG93ID0gW3N0YXJ0LCBlbmRdO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzb3VyY2VTcGVjczogU3RvcmVTb3VyY2VTcGVjW10gPSBbeyB2YWxpZFdpbmRvd3M6IFtkaXNrV2luZG93XSB9XTtcbiAgICAgICAgbGV0IG5vRnVsbFN5bmMgPSBncm91cC5lbnRyaWVzLnNvbWUoeCA9PiB4Lm5vRnVsbFN5bmMpO1xuICAgICAgICAvLyBUaGUgc2FtZSBwZWVyIGVuZHBvaW50ICh1cmwrcm91dGUrZmxhZ3MpIGNhbiBhcHBlYXIgdW5kZXIgc2V2ZXJhbCB3aW5kb3dzIGF0IG9uY2UgKGEgc3dpdGNob3ZlciBzcGxpdHMgb25lIHdpbmRvdyBhcm91bmQgYW4gaW50ZXJtZWRpYXRlKS4gSXQgaXMgT05FIHN5bmMgc291cmNlIHRoYXQgY2FycmllcyBBTEwgdGhvc2Ugd2luZG93cyAtIG5ldmVyIHNldmVyYWwgc291cmNlcywgd2hpY2ggd291bGQgZG91YmxlLXNjYW4gaXQgYW5kLCB3b3JzZSwgbWFrZSBtYXRjaGluZyBhIHJlcXVlc3QgZGVwZW5kIG9uIHdoaWNoIHdpbmRvdyB0aGUgY2FsbGVyIGhhcHBlbmVkIHRvIGhvbGQuXG4gICAgICAgIGxldCBwZWVyQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgU3RvcmVTb3VyY2VTcGVjPigpO1xuICAgICAgICBmb3IgKGxldCBpID0gZ3JvdXAuZmlyc3RJbmRleCArIDE7IGkgPCByb3V0aW5nLnNvdXJjZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSByb3V0aW5nLnNvdXJjZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBvd25JbmRleGVzLmhhcyhpKSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgc2hhcmVkUm91dGUgPSByb3V0ZUludGVyc2VjdGlvbihncm91cC5yb3V0ZSwgc291cmNlLnJvdXRlKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkUm91dGUpIGNvbnRpbnVlO1xuICAgICAgICAgICAgbGV0IGtleSA9IEpTT04uc3RyaW5naWZ5KHsgLi4uc291cmNlLCB2YWxpZFdpbmRvdzogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgbGV0IHNwZWMgPSBwZWVyQnlLZXkuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAoIXNwZWMpIHtcbiAgICAgICAgICAgICAgICBzcGVjID0geyBzb3VyY2VDb25maWc6IHNvdXJjZSwgdmFsaWRXaW5kb3dzOiBbXSwgcm91dGU6IHNoYXJlZFJvdXRlLCBub0Z1bGxTeW5jOiBzb3VyY2Uubm9GdWxsU3luYyB8fCBub0Z1bGxTeW5jIH07XG4gICAgICAgICAgICAgICAgcGVlckJ5S2V5LnNldChrZXksIHNwZWMpO1xuICAgICAgICAgICAgICAgIHNvdXJjZVNwZWNzLnB1c2goc3BlYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGVjLnZhbGlkV2luZG93cy5wdXNoKHNvdXJjZS52YWxpZFdpbmRvdyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmVzLnB1c2goe1xuICAgICAgICAgICAgcm91dGVLZXksXG4gICAgICAgICAgICByb3V0ZTogZ3JvdXAucm91dGUsXG4gICAgICAgICAgICBlbnRyaWVzOiBncm91cC5lbnRyaWVzLFxuICAgICAgICAgICAgcmF3RGlzazogZ3JvdXAuZW50cmllcy5zb21lKHggPT4geC5yYXdEaXNrKSxcbiAgICAgICAgICAgIHJlYWRlckRpc2tMaW1pdDogZ3JvdXAuZW50cmllcy5maW5kKHggPT4geC5yZWFkZXJEaXNrTGltaXQgIT09IHVuZGVmaW5lZCk/LnJlYWRlckRpc2tMaW1pdCxcbiAgICAgICAgICAgIHNvdXJjZVNwZWNzLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKCFzdG9yZXMubGVuZ3RoKSB7XG4gICAgICAgIC8vIE5vdCBpbiB0aGUgY29uZmlnIGF0IGFsbDogc3RpbGwgc2VydmUgd2hhdGV2ZXIgdGhlIHBsYWluIGZvbGRlciBob2xkcywgdGhyb3VnaCBvbmUgaW5lcnQgZnVsbC1yb3V0ZSBzdG9yZVxuICAgICAgICBzdG9yZXMucHVzaCh7IHJvdXRlS2V5OiBKU09OLnN0cmluZ2lmeShGVUxMX1JPVVRFKSwgcm91dGU6IHVuZGVmaW5lZCwgZW50cmllczogW10sIHJhd0Rpc2s6IGZhbHNlLCByZWFkZXJEaXNrTGltaXQ6IHVuZGVmaW5lZCwgc291cmNlU3BlY3M6IFt7IHZhbGlkV2luZG93czogW1swLCAwXV0gfV0gfSk7XG4gICAgfVxuICAgIGxldCBzdHJ1Y3R1cmVLZXkgPSBKU09OLnN0cmluZ2lmeShzdG9yZXMubWFwKHMgPT4gKHsgcm91dGVLZXk6IHMucm91dGVLZXksIHJhd0Rpc2s6IHMucmF3RGlzaywgcmVhZGVyRGlza0xpbWl0OiBzLnJlYWRlckRpc2tMaW1pdCB9KSkpO1xuICAgIHJldHVybiB7IHNlbGZFbnRyaWVzLCBzZWxmLCBzdG9yZXMsIHN0cnVjdHVyZUtleSB9O1xufVxuIl19
158
- /* _JS_SOURCE_HASH = "de02e6db6f6d1447f4a3b26c37f95ce8a86b8f1d3dd558e60fca94e7a7974c9f"; */
185
+ exports.planSelfStores = planSelfStores;
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVQbGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVQbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQUFnRDtBQUNoRCw0Q0FBb0Y7QUFDcEYsaURBQWtGO0FBQ2xGLGlEQUE4QztBQUU5QyxnTEFBZ0w7QUFFaEwsd0lBQXdJO0FBQ3hJLFNBQWdCLFlBQVksQ0FBQyxNQUFvQixFQUFFLE9BQWUsRUFBRSxVQUFrQjtJQUNsRixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzNDLElBQUksTUFBTSxHQUFHLElBQUEsNkJBQWMsRUFBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLE9BQU8sSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVU7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNqRixPQUFPLElBQUEsMkJBQVksRUFBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBTEQsb0NBS0M7QUFFRCxTQUFnQixlQUFlLENBQUMsT0FBcUIsRUFBRSxPQUFlLEVBQUUsVUFBa0I7SUFDdEYsSUFBSSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzlDLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRO1lBQUUsU0FBUztRQUN6QyxJQUFJLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDNUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FB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R0FBRyxFQUEwQixDQUFDO0lBQy9DLEtBQUssSUFBSSxLQUFLLElBQUksV0FBVyxFQUFFLENBQUM7UUFDNUIsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ1gsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ0Qsd0RBQXdEO0lBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDcEcsQ0FBQztBQWhCRCx3Q0FnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBIb3N0ZWRDb25maWcsIFNvdXJjZUNvbmZpZywgRlVMTF9ST1VURSB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IHBhcnNlSG9zdGVkVXJsLCByb3V0ZUNvbnRhaW5zLCByb3V0ZUludGVyc2VjdGlvbiB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgaXNPd25BZGRyZXNzIH0gZnJvbSBcIi4vc2VydmVyQ29uZmlnXCI7XG5cbi8vIFR1cm5zIGEgYnVja2V0J3Mgcm91dGluZyBjb25maWcgaW50byB0aGlzIHNlcnZlcidzIHN0b3JlIHBsYW46IHdoaWNoIG9mIHRoZSBlbnRyaWVzIGFyZSB1cywgd2hhdCBzdG9yZXMgKG9uZSBwZXIgcm91dGUpIHdlIHJ1biwgYW5kIHdoaWNoIHBlZXJzIGVhY2ggc3RvcmUgc3luY2hyb25pemVzIGZyb20uXG5cbi8qKiBXaGV0aGVyIGEgY29uZmlnIGVudHJ5IGlzIFRISVMgc2VydmVyJ3MgY29weSBvZiB0aGlzIGJ1Y2tldCAtIHRoZSBzYW1lIGFjY291bnQgYW5kIGJ1Y2tldCwgYXQgYW4gYWRkcmVzcyB0aGlzIHByb2Nlc3MgYW5zd2VycyBvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlbGZTb3VyY2Uoc291cmNlOiBTb3VyY2VDb25maWcsIGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHNvdXJjZS50eXBlICE9PSBcInJlbW90ZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKHNvdXJjZS51cmwpO1xuICAgIGlmIChwYXJzZWQuYWNjb3VudCAhPT0gYWNjb3VudCB8fCBwYXJzZWQuYnVja2V0TmFtZSAhPT0gYnVja2V0TmFtZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBpc093bkFkZHJlc3MocGFyc2VkLmFkZHJlc3MsIHBhcnNlZC5wb3J0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTZWxmSW5kZXhlcyhyb3V0aW5nOiBSZW1vdGVDb25maWcsIGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCBpbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm91dGluZy5zb3VyY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSByb3V0aW5nLnNvdXJjZXNbaV07XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlID09PSBcInN0cmluZ1wiKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGlzU2VsZlNvdXJjZShzb3VyY2UsIGFjY291bnQsIGJ1Y2tldE5hbWUpKSB7XG4gICAgICAgICAgICBpbmRleGVzLnB1c2goaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4ZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RFbnRyeUF0KGVudHJpZXM6IEhvc3RlZENvbmZpZ1tdLCB0aW1lOiBudW1iZXIsIHJvdXRlPzogbnVtYmVyKTogSG9zdGVkQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocm91dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZXQgY292ZXJpbmcgPSBlbnRyaWVzLmZpbHRlcih4ID0+IHJvdXRlQ29udGFpbnMoeC5yb3V0ZSwgcm91dGUpKTtcbiAgICAgICAgaWYgKGNvdmVyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgZW50cmllcyA9IGNvdmVyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjb250YWluaW5nID0gZW50cmllcy5maW5kKHggPT4geC52YWxpZFdpbmRvd1swXSA8PSB0aW1lICYmIHRpbWUgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICBpZiAoY29udGFpbmluZykgcmV0dXJuIGNvbnRhaW5pbmc7XG4gICAgbGV0IGJlc3Q6IEhvc3RlZENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYmVzdERpc3RhbmNlID0gSW5maW5pdHk7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBsZXQgZGlzdGFuY2UgPSBNYXRoLm1pbihNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMF0pLCBNYXRoLmFicyh0aW1lIC0gZW50cnkudmFsaWRXaW5kb3dbMV0pKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDwgYmVzdERpc3RhbmNlKSB7XG4gICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgIGJlc3QgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdDtcbn1cblxuLyoqIFRoZSBwYXJ0cyBvZiBgcmFuZ2VzYCB0aGF0IGBjdXRgIGRvZXMgbm90IGNvdmVyLCBwbHVzIHRoZSBzaW5nbGUgcmFuZ2Ugc3Bhbm5pbmcgd2hhdCBpdCBkaWQuIFJvdXRlcyBhcmUgaGFsZi1vcGVuIFtzdGFydCwgZW5kKSwgc28gc3VidHJhY3Rpbmcgb25lIGZyb20gYW5vdGhlciBsZWF2ZXMgYXQgbW9zdCBhIHBpZWNlIG9uIGVhY2ggc2lkZS4gKi9cbmZ1bmN0aW9uIHN1YnRyYWN0Um91dGUocmFuZ2VzOiBbbnVtYmVyLCBudW1iZXJdW10sIGN1dDogW251bWJlciwgbnVtYmVyXSk6IHsgcmVtYWluaW5nOiBbbnVtYmVyLCBudW1iZXJdW107IGNsYWltZWQ/OiBbbnVtYmVyLCBudW1iZXJdIH0ge1xuICAgIGxldCByZW1haW5pbmc6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtdO1xuICAgIGxldCBjbGFpbWVkOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IHJhbmdlIG9mIHJhbmdlcykge1xuICAgICAgICBsZXQgb3ZlcmxhcCA9IHJvdXRlSW50ZXJzZWN0aW9uKHJhbmdlLCBjdXQpO1xuICAgICAgICBpZiAoIW92ZXJsYXApIHtcbiAgICAgICAgICAgIHJlbWFpbmluZy5wdXNoKHJhbmdlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNsYWltZWQgPSBjbGFpbWVkICYmIFtNYXRoLm1pbihjbGFpbWVkWzBdLCBvdmVybGFwWzBdKSwgTWF0aC5tYXgoY2xhaW1lZFsxXSwgb3ZlcmxhcFsxXSldIGFzIFtudW1iZXIsIG51bWJlcl0gfHwgb3ZlcmxhcDtcbiAgICAgICAgaWYgKHJhbmdlWzBdIDwgb3ZlcmxhcFswXSkgcmVtYWluaW5nLnB1c2goW3JhbmdlWzBdLCBvdmVybGFwWzBdXSk7XG4gICAgICAgIGlmIChvdmVybGFwWzFdIDwgcmFuZ2VbMV0pIHJlbWFpbmluZy5wdXNoKFtvdmVybGFwWzFdLCByYW5nZVsxXV0pO1xuICAgIH1cbiAgICByZXR1cm4geyByZW1haW5pbmcsIGNsYWltZWQgfTtcbn1cblxuLyoqIFdoYXQgb25lIG9mIG91ciBzdG9yZXMgaGFzIHRvIHB1bGwgaW4gYXQgYSB2YWxpZC13aW5kb3cgYm91bmRhcnksIHNvIHRoZSB3cml0ZXMgdGhhdCBsYW5kZWQganVzdCBiZWZvcmUgdGhlIGhhbmRvdmVyIGFyZSBub3QgbWlzc2VkLiAqL1xuZXhwb3J0IHR5cGUgQm91bmRhcnlIYW5kb3ZlciA9IHtcbiAgICAvLyBUaGUgc3RvcmUgdGhhdCBuZWVkcyB0aGUgZGF0YTogdGhlIG5hbWUgb2YgdGhlIHNlbGYgZW50cnkgdGFraW5nIG92ZXIgYXQgdGhlIGJvdW5kYXJ5XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8vIFRoZSByb3V0ZSBpdCBpcyB0YWtpbmcgb3Zlciwgd2hpY2ggaXMgdGhlIHNsaWNlIG9mIHRoZSBrZXkgc3BhY2UgdGhlIHB1bGxzIGJlbG93IGFyZSBsaW1pdGVkIHRvXG4gICAgcm91dGU6IFtudW1iZXIsIG51bWJlcl07XG4gICAgLy8gV2UgaGVsZCBwYXJ0IG9mIHRoaXMgcm91dGUgaW4gdGhlIHByZXZpb3VzIHdpbmRvdyB0b28sIHNvIHRob3NlIHdyaXRlcyBhcmUgYWxyZWFkeSBpbiBvdXIgb3duIGZvbGRlciBhbmQgYSBkaXNrIHJlc2NhbiBmaW5kcyB0aGVtXG4gICAgc2Nhbk93bkRpc2s6IGJvb2xlYW47XG4gICAgLy8gUGVyIHNvdXJjZSBpbmRleCBpbiB0aGUgY29uZmlnLCB0aGUgc2xpY2Ugb2Ygb3VyIHJvdXRlIFRIQVQgc291cmNlIGhlbGQgaW4gdGhlIHByZXZpb3VzIHdpbmRvdyAtIGEgYm91bmRhcnkgc2NhbiBwdWxscyBpdHMgcmVjZW50IGNoYW5nZXNcbiAgICByZW1vdGVzOiBNYXA8bnVtYmVyLCBbbnVtYmVyLCBudW1iZXJdPjtcbn07XG5cbi8qKlxuICogV2hvIGhlbGQgZWFjaCBzbGljZSBvZiBvdXIgcm91dGUgaW4gdGhlIHdpbmRvdyBiZWZvcmUgd2luZG93U3RhcnQsIGZvciBldmVyeSBzZWxmIGVudHJ5IHdob3NlXG4gKiB3aW5kb3cgc3RhcnRzIGV4YWN0bHkgdGhlbi4gVGhpcyBpcyB0aGUgd2hvbGUgb2YgXCJ3aG8gZG8gd2UgdGFrZSBvdmVyIGZyb21cIjogYSBzdG9yZSB0YWtpbmcgb3ZlciBhXG4gKiByb3V0ZSBtYXkgYmUgdGFraW5nIGl0IGZyb20gc2V2ZXJhbCBwcmV2aW91cyBvd25lcnMgYXQgb25jZSAodGhlaXIgc2hhcmRzIG5lZWQgbm90IGxpbmUgdXAgd2l0aFxuICogb3VycyksIGFuZCBmcm9tIGl0c2VsZiBmb3IgdGhlIHBhcnRzIGl0IGFscmVhZHkgaGVsZC5cbiAqXG4gKiBBIHNlbGYgZW50cnkgaXMgc2tpcHBlZCB3aGVuIGFuIEVBUkxJRVIgZW50cnkgdmFsaWQgYXQgdGhlIGJvdW5kYXJ5IGFscmVhZHkgY292ZXJzIGl0cyB3aG9sZSByb3V0ZTpcbiAqIGNvbmZpZyBvcmRlciBpcyBwcmlvcml0eSwgc28gdGhhdCBlbnRyeSBpcyB0aGUgd3JpdGUgdGFyZ2V0IGFuZCB3ZSBhcmUgbm90IHRoZSBvbmUgdGFraW5nIG92ZXIuXG4gKiBPd25lcnMgYXJlIHRoZW4gcmVzb2x2ZWQgaW4gY29uZmlnIG9yZGVyIHRvbywgZWFjaCBjbGFpbWluZyB0aGUgcGFydCBvZiBvdXIgcm91dGUgc3RpbGwgdW5jbGFpbWVkIC1cbiAqIHRoZSBzYW1lIGZpcnN0LW1hdGNoLXdpbnMgcnVsZSB0aGF0IHBpY2tzIGEgd3JpdGUgdGFyZ2V0IGF0IGFueSBvdGhlciBtb21lbnQuXG4gKlxuICogUHVyZTogY29uZmlnIGluLCBwbGFuIG91dC4gTm90aGluZyBoZXJlIHJlYWRzIGEgc3RvcmUsIGEgY2xvY2ssIG9yIHRoZSBuZXR3b3JrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJldmlvdXNXaW5kb3dPd25lcnMoY29uZmlnOiBSZW1vdGVDb25maWcsIHdpbmRvd1N0YXJ0OiBudW1iZXIsIHNlbGZJbmRleGVzOiBudW1iZXJbXSk6IEJvdW5kYXJ5SGFuZG92ZXJbXSB7XG4gICAgbGV0IHNlbGZJbmRleFNldCA9IG5ldyBTZXQoc2VsZkluZGV4ZXMpO1xuICAgIGxldCBwcmV2aW91c1RpbWUgPSB3aW5kb3dTdGFydCAtIDE7XG4gICAgbGV0IHZhbGlkQXQgPSAoc291cmNlOiBTb3VyY2VDb25maWcsIHRpbWU6IG51bWJlcikgPT4gc291cmNlLnZhbGlkV2luZG93WzBdIDw9IHRpbWUgJiYgdGltZSA8IHNvdXJjZS52YWxpZFdpbmRvd1sxXTtcbiAgICBsZXQgYnlSb3V0ZSA9IG5ldyBNYXA8c3RyaW5nLCBCb3VuZGFyeUhhbmRvdmVyPigpO1xuICAgIGZvciAobGV0IHNlbGZJbmRleCBvZiBzZWxmSW5kZXhlcykge1xuICAgICAgICBsZXQgc2VsZiA9IGNvbmZpZy5zb3VyY2VzW3NlbGZJbmRleF07XG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZiA9PT0gXCJzdHJpbmdcIiB8fCBzZWxmLnZhbGlkV2luZG93WzBdICE9PSB3aW5kb3dTdGFydCkgY29udGludWU7XG4gICAgICAgIGxldCBzZWxmUm91dGUgPSBzZWxmLnJvdXRlIHx8IEZVTExfUk9VVEU7XG4gICAgICAgIGxldCBzaGFkb3dlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGZJbmRleDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgb3RoZXIgPSBjb25maWcuc291cmNlc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3RoZXIgPT09IFwic3RyaW5nXCIgfHwgIXZhbGlkQXQob3RoZXIsIHdpbmRvd1N0YXJ0KSkgY29udGludWU7XG4gICAgICAgICAgICBsZXQgcm91dGUgPSBvdGhlci5yb3V0ZSB8fCBGVUxMX1JPVVRFO1xuICAgICAgICAgICAgaWYgKHJvdXRlWzBdIDw9IHNlbGZSb3V0ZVswXSAmJiBzZWxmUm91dGVbMV0gPD0gcm91dGVbMV0pIHtcbiAgICAgICAgICAgICAgICBzaGFkb3dlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNoYWRvd2VkKSBjb250aW51ZTtcbiAgICAgICAgLy8gS2V5ZWQgYnkgYm90aDogb25lIG5hbWUgY2FuIHRha2Ugb3ZlciBzZXZlcmFsIHJvdXRlcyBhdCB0aGUgc2FtZSBib3VuZGFyeSwgYW5kIGVhY2ggaXMgcHVsbGVkIHNlcGFyYXRlbHlcbiAgICAgICAgbGV0IGhhbmRvdmVyS2V5ID0gYCR7c2VsZi5uYW1lfXwke0pTT04uc3RyaW5naWZ5KHNlbGZSb3V0ZSl9YDtcbiAgICAgICAgbGV0IGhhbmRvdmVyID0gYnlSb3V0ZS5nZXQoaGFuZG92ZXJLZXkpO1xuICAgICAgICBpZiAoIWhhbmRvdmVyKSB7XG4gICAgICAgICAgICBoYW5kb3ZlciA9IHsgbmFtZTogc2VsZi5uYW1lLCByb3V0ZTogc2VsZlJvdXRlLCBzY2FuT3duRGlzazogZmFsc2UsIHJlbW90ZXM6IG5ldyBNYXAoKSB9O1xuICAgICAgICAgICAgYnlSb3V0ZS5zZXQoaGFuZG92ZXJLZXksIGhhbmRvdmVyKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdW5jbGFpbWVkOiBbbnVtYmVyLCBudW1iZXJdW10gPSBbW3NlbGZSb3V0ZVswXSwgc2VsZlJvdXRlWzFdXV07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZmlnLnNvdXJjZXMubGVuZ3RoICYmIHVuY2xhaW1lZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG90aGVyID0gY29uZmlnLnNvdXJjZXNbaV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIG90aGVyID09PSBcInN0cmluZ1wiIHx8ICF2YWxpZEF0KG90aGVyLCBwcmV2aW91c1RpbWUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCB7IHJlbWFpbmluZywgY2xhaW1lZCB9ID0gc3VidHJhY3RSb3V0ZSh1bmNsYWltZWQsIG90aGVyLnJvdXRlIHx8IEZVTExfUk9VVEUpO1xuICAgICAgICAgICAgdW5jbGFpbWVkID0gcmVtYWluaW5nO1xuICAgICAgICAgICAgaWYgKCFjbGFpbWVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmIChzZWxmSW5kZXhTZXQuaGFzKGkpKSB7XG4gICAgICAgICAgICAgICAgaGFuZG92ZXIuc2Nhbk93bkRpc2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gaGFuZG92ZXIucmVtb3Rlcy5nZXQoaSk7XG4gICAgICAgICAgICBoYW5kb3Zlci5yZW1vdGVzLnNldChpLCBleGlzdGluZyAmJiBbTWF0aC5taW4oZXhpc3RpbmdbMF0sIGNsYWltZWRbMF0pLCBNYXRoLm1heChleGlzdGluZ1sxXSwgY2xhaW1lZFsxXSldIGFzIFtudW1iZXIsIG51bWJlcl0gfHwgY2xhaW1lZCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFsuLi5ieVJvdXRlLnZhbHVlcygpXS5maWx0ZXIoeCA9PiB4LnNjYW5Pd25EaXNrIHx8IHgucmVtb3Rlcy5zaXplKTtcbn1cblxuLyoqIE91ciByb2xlIGluIGEgYnVja2V0J3Mgcm91dGluZyBjb25maWcsIHN1bW1hcml6ZWQgYWNyb3NzIEFMTCBjdXJyZW50bHktdmFsaWQgc2VsZiBlbnRyaWVzLiBTdG9yZWQgaW5zdGVhZCBvZiBhIHNpbmdsZSByZXByZXNlbnRhdGl2ZSBIb3N0ZWRDb25maWcsIHNvIG5vdGhpbmcgY2FuIGFjY2lkZW50YWxseSB1c2Ugb25lIGVudHJ5J3Mgcm91dGUgb3IgZmxhZ3Mgd2hlcmUgdGhlIHVuaW9uIGlzIHJlcXVpcmVkIC0gdGhlIHN0YW5kYXJkIGNvbmZpZyBoYXMgdGhlIHNhbWUgVVJMIHR3aWNlOiBhIHJvdXRlZCB3cml0ZS1zaGFyZCBlbnRyeSBwbHVzIGFuIHVucm91dGVkIHJlYWQtZXZlcnl0aGluZyBlbnRyeS4gKi9cbmV4cG9ydCB0eXBlIFNlbGZTdW1tYXJ5ID0ge1xuICAgIC8qKiBUaGUgdW5pb24gb2YgdGhlIGN1cnJlbnQgZW50cmllcycgcm91dGVzLCB3aXRoIG92ZXJsYXBwaW5nL2FkamFjZW50IHJhbmdlcyBjb21iaW5lZCAtIHdoaWNoIGNvbW1vbmx5IGNvbGxhcHNlcyB0byBhIHNpbmdsZSBmdWxsIHJhbmdlLCBtYWtpbmcgbWF0Y2hpbmcgdHJpdmlhbC4gKi9cbiAgICByb3V0ZXM6IFtudW1iZXIsIG51bWJlcl1bXTtcbiAgICBwdWJsaWM6IGJvb2xlYW47XG4gICAgaW1tdXRhYmxlOiBib29sZWFuO1xuICAgIG5vRnVsbFN5bmM6IGJvb2xlYW47XG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xufTtcblxuZnVuY3Rpb24gbWVyZ2VSb3V0ZXMocm91dGVzOiAoW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZClbXSk6IFtudW1iZXIsIG51bWJlcl1bXSB7XG4gICAgbGV0IGxpc3QgPSByb3V0ZXMubWFwKHggPT4geCB8fCBGVUxMX1JPVVRFKS5tYXAoeCA9PiBbeFswXSwgeFsxXV0gYXMgW251bWJlciwgbnVtYmVyXSk7XG4gICAgc29ydChsaXN0LCB4ID0+IHhbMF0pO1xuICAgIGxldCBtZXJnZWQ6IFtudW1iZXIsIG51bWJlcl1bXSA9IFtdO1xuICAgIGZvciAobGV0IHJvdXRlIG9mIGxpc3QpIHtcbiAgICAgICAgbGV0IGxhc3QgPSBtZXJnZWRbbWVyZ2VkLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAobGFzdCAmJiByb3V0ZVswXSA8PSBsYXN0WzFdKSB7XG4gICAgICAgICAgICBsYXN0WzFdID0gTWF0aC5tYXgobGFzdFsxXSwgcm91dGVbMV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbWVyZ2VkLnB1c2gocm91dGUpO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBzdW1tYXJpemVTZWxmKHNlbGZFbnRyaWVzOiBIb3N0ZWRDb25maWdbXSwgbm93OiBudW1iZXIpOiBTZWxmU3VtbWFyeSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGN1cnJlbnQgPSBzZWxmRW50cmllcy5maWx0ZXIoeCA9PiB4LnZhbGlkV2luZG93WzBdIDw9IG5vdyAmJiBub3cgPCB4LnZhbGlkV2luZG93WzFdKTtcbiAgICBpZiAoIWN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICAgIGxldCBuZWFyZXN0ID0gc2VsZWN0RW50cnlBdChzZWxmRW50cmllcywgbm93KTtcbiAgICAgICAgY3VycmVudCA9IG5lYXJlc3QgJiYgW25lYXJlc3RdIHx8IFtdO1xuICAgIH1cbiAgICBpZiAoIWN1cnJlbnQubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHJvdXRlczogbWVyZ2VSb3V0ZXMoY3VycmVudC5tYXAoeCA9PiB4LnJvdXRlKSksXG4gICAgICAgIHB1YmxpYzogY3VycmVudC5zb21lKHggPT4geC5wdWJsaWMpLFxuICAgICAgICBpbW11dGFibGU6IGN1cnJlbnQuc29tZSh4ID0+IHguaW1tdXRhYmxlKSxcbiAgICAgICAgbm9GdWxsU3luYzogY3VycmVudC5zb21lKHggPT4geC5ub0Z1bGxTeW5jKSxcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0OiBjdXJyZW50LmZpbmQoeCA9PiB4LnJlYWRlckRpc2tMaW1pdCAhPT0gdW5kZWZpbmVkKT8ucmVhZGVyRGlza0xpbWl0LFxuICAgIH07XG59XG5cbi8qKiBPbmUgc3RvcmUgdGhpcyBzZXJ2ZXIgcnVucyBmb3IgYSBidWNrZXQ6IHRoZSBuYW1lIHRoYXQgSVMgdGhlIHN0b3JlLCBhbmQgdGhlIGVudHJpZXMgdGhhdCBuYW1lIGl0LiBXaGF0IGl0IHN5bmNocm9uaXplcyB3aXRoIGlzIE5PVCBkZWNpZGVkIGhlcmUgLSB0aGUgc3RvcmUgcmVhZHMgaXRzIG93biBjb3B5IG9mIHRoZSBjb25maWcgYW5kIHdvcmtzIHRoYXQgb3V0IGl0c2VsZiAoc2VlIEJsb2JTdG9yZS5hcHBseVJvdXRpbmdDb25maWcpLiAqL1xuZXhwb3J0IHR5cGUgU2VsZlN0b3JlID0ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBlbnRyaWVzOiBIb3N0ZWRDb25maWdbXTtcbn07XG5cbi8qKiBXaGljaCBzdG9yZXMgdGhpcyBzZXJ2ZXIgcnVucyBmb3IgYSBidWNrZXQsIGJ5IG5hbWUuIE5vdGhpbmcgbW9yZTogYSBzdG9yZSBpcyBmb3VuZCBieSBuYW1lLCBhbmQgY29uZmlndXJlcyBpdHNlbGYuICovXG5leHBvcnQgZnVuY3Rpb24gcGxhblNlbGZTdG9yZXMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHJvdXRpbmc6IFJlbW90ZUNvbmZpZyk6IHsgc2VsZkVudHJpZXM6IEhvc3RlZENvbmZpZ1tdOyBzZWxmOiBTZWxmU3VtbWFyeSB8IHVuZGVmaW5lZDsgc3RvcmVzOiBTZWxmU3RvcmVbXSB9IHtcbiAgICBsZXQgc2VsZkluZGV4ZXMgPSBmaW5kU2VsZkluZGV4ZXMocm91dGluZywgYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHNlbGZFbnRyaWVzID0gc2VsZkluZGV4ZXMubWFwKGkgPT4gcm91dGluZy5zb3VyY2VzW2ldIGFzIEhvc3RlZENvbmZpZyk7XG4gICAgbGV0IHNlbGYgPSBzdW1tYXJpemVTZWxmKHNlbGZFbnRyaWVzLCBEYXRlLm5vdygpKTtcbiAgICAvLyBPbmUgc3RvcmUgcGVyIE5BTUUgYW1vbmcgQUxMIG91ciBlbnRyaWVzIC0gcGFzdCBhbmQgZnV0dXJlIHdpbmRvd3MgaW5jbHVkZWQsIHNvIGEgbmFtZSB3ZSBubyBsb25nZXIgd3JpdGUgdG8ga2VlcHMgc2VydmluZyBpdHMgZGF0YSBhbmQgYSBuYW1lIHdlIGFyZSBhYm91dCB0byB1c2UgZXhpc3RzIGFoZWFkIG9mIGl0cyB3aW5kb3dcbiAgICBsZXQgYnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIEhvc3RlZENvbmZpZ1tdPigpO1xuICAgIGZvciAobGV0IGVudHJ5IG9mIHNlbGZFbnRyaWVzKSB7XG4gICAgICAgIGxldCBlbnRyaWVzID0gYnlOYW1lLmdldChlbnRyeS5uYW1lKTtcbiAgICAgICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICAgICAgICBlbnRyaWVzID0gW107XG4gICAgICAgICAgICBieU5hbWUuc2V0KGVudHJ5Lm5hbWUsIGVudHJpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfVxuICAgIC8vIE5vdCBpbiB0aGUgY29uZmlnIGF0IGFsbDogbm8gbmFtZSBtZWFucyBubyBzdG9yZSBoZXJlXG4gICAgcmV0dXJuIHsgc2VsZkVudHJpZXMsIHNlbGYsIHN0b3JlczogWy4uLmJ5TmFtZV0ubWFwKChbbmFtZSwgZW50cmllc10pID0+ICh7IG5hbWUsIGVudHJpZXMgfSkpIH07XG59XG4iXX0=
187
+ /* _JS_SOURCE_HASH = "34bdac815bba6b0da86e3b712610c28994f577faf6bb0acd7d09b73d2d301e81"; */
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.applySourceConfig = exports.createStoreSource = exports.createApiArchives = void 0;
4
+ const ArchivesDisk_1 = require("../ArchivesDisk");
5
+ const backblaze_1 = require("../backblaze");
6
+ const ArchivesRemote_1 = require("./ArchivesRemote");
7
+ const remoteConfig_1 = require("./remoteConfig");
8
+ const ArchivesDelayed_1 = require("./ArchivesDelayed");
9
+ // ONE source, talked to directly - the counterpart of createArchives, which resolves a whole routing config into a chain that falls back and re-resolves across many sources. Nothing here picks a source or retries against another one: the caller (a chain, or a store's synchronization) already decided which endpoint it wants, and gets a client bound to exactly that endpoint. Source identity and config updates live here too, because they are the same question - which endpoint is this, and what policy are we applying to it.
10
+ /** The client for one configured source: backblaze, or a storage server - including this one. */
11
+ function createApiArchives(source) {
12
+ if (source.type === "backblaze") {
13
+ return new backblaze_1.ArchivesBackblaze({ bucketName: (0, remoteConfig_1.parseBackblazeUrl)(source.url).bucketName, public: source.public, immutable: source.immutable, allowedOrigins: source.allowedOrigins });
14
+ }
15
+ // Including when that server is us: a call to ourselves is a WebSocket to our own port, which authenticates as this machine (so it is always allowed) and costs a round trip on loopback. Not worth a second implementation of every operation to avoid.
16
+ return new ArchivesRemote_1.ArchivesRemote({ url: source.url, waitForAccess: false, sourceConfig: source });
17
+ }
18
+ exports.createApiArchives = createApiArchives;
19
+ /** The ONE place a store's source is built. Every source a store synchronizes with is one of exactly two things: a configured peer, or the store's own disk folder (no sourceConfig). writeDelay wraps it so its writes are buffered in memory for that long (see ArchivesDelayed) - the whole of "fast writes", per source, decided here. */
20
+ function createStoreSource(config) {
21
+ let source;
22
+ if (!config.sourceConfig) {
23
+ source = new ArchivesDisk_1.ArchivesDisk(config.folder);
24
+ }
25
+ else {
26
+ source = createApiArchives(config.sourceConfig);
27
+ }
28
+ if (config.writeDelay) {
29
+ source = new ArchivesDelayed_1.ArchivesDelayed(source, config.writeDelay);
30
+ }
31
+ return source;
32
+ }
33
+ exports.createStoreSource = createStoreSource;
34
+ /** Applies a changed config to an ALREADY RUNNING source (same endpoint, see sourceIdentity - only policy moved). Sources that carry their config into every request MUST be updated in place, or they keep sending the old one: the server matches the config it is handed against its own entries, so a source left holding a stale config eventually stops resolving to a store at all. The write delay is policy too, so it moves here as well. */
35
+ function applySourceConfig(source, sourceConfig, writeDelay) {
36
+ var _a;
37
+ if (writeDelay !== undefined) {
38
+ (_a = (0, ArchivesDelayed_1.asDelayed)(source)) === null || _a === void 0 ? void 0 : _a.setDelay(writeDelay);
39
+ }
40
+ // The store's own disk has no config to apply - only a delay
41
+ if (!sourceConfig)
42
+ return;
43
+ // The config belongs to the source itself, not to the delay wrapped around it
44
+ let configurable = (0, ArchivesDelayed_1.unwrapDelayed)(source);
45
+ if (typeof configurable.updateSourceConfig !== "function")
46
+ return;
47
+ configurable.updateSourceConfig(sourceConfig);
48
+ }
49
+ exports.applySourceConfig = applySourceConfig;
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVTb3VyY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmVTb3VyY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGtEQUErQztBQUMvQyw0Q0FBaUQ7QUFDakQscURBQWtEO0FBQ2xELGlEQUFtRDtBQUNuRCx1REFBOEU7QUFFOUUsOGdCQUE4Z0I7QUFFOWdCLGlHQUFpRztBQUNqRyxTQUFnQixpQkFBaUIsQ0FBQyxNQUFvQjtJQUNsRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLDZCQUFpQixDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUEsZ0NBQWlCLEVBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7SUFDdEwsQ0FBQztJQUNELHlQQUF5UDtJQUN6UCxPQUFPLElBQUksK0JBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDL0YsQ0FBQztBQU5ELDhDQU1DO0FBRUQsOFVBQThVO0FBQzlVLFNBQWdCLGlCQUFpQixDQUFDLE1BQTRFO0lBQzFHLElBQUksTUFBaUIsQ0FBQztJQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxJQUFJLDJCQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7U0FBTSxDQUFDO1FBQ0osTUFBTSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEIsTUFBTSxHQUFHLElBQUksaUNBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBWEQsOENBV0M7QUFLRCx1YkFBdWI7QUFDdmIsU0FBZ0IsaUJBQWlCLENBQUMsTUFBaUIsRUFBRSxZQUFzQyxFQUFFLFVBQW1COztJQUM1RyxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMzQixNQUFBLElBQUEsMkJBQVMsRUFBQyxNQUFNLENBQUMsMENBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCw2REFBNkQ7SUFDN0QsSUFBSSxDQUFDLFlBQVk7UUFBRSxPQUFPO0lBQzFCLDhFQUE4RTtJQUM5RSxJQUFJLFlBQVksR0FBRyxJQUFBLCtCQUFhLEVBQUMsTUFBTSxDQUFnQyxDQUFDO0lBQ3hFLElBQUksT0FBTyxZQUFZLENBQUMsa0JBQWtCLEtBQUssVUFBVTtRQUFFLE9BQU87SUFDbEUsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFWRCw4Q0FVQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElBcmNoaXZlcywgU291cmNlQ29uZmlnIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNEaXNrIH0gZnJvbSBcIi4uL0FyY2hpdmVzRGlza1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNCYWNrYmxhemUgfSBmcm9tIFwiLi4vYmFja2JsYXplXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1JlbW90ZSB9IGZyb20gXCIuL0FyY2hpdmVzUmVtb3RlXCI7XG5pbXBvcnQgeyBwYXJzZUJhY2tibGF6ZVVybCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgQXJjaGl2ZXNEZWxheWVkLCBhc0RlbGF5ZWQsIHVud3JhcERlbGF5ZWQgfSBmcm9tIFwiLi9BcmNoaXZlc0RlbGF5ZWRcIjtcblxuLy8gT05FIHNvdXJjZSwgdGFsa2VkIHRvIGRpcmVjdGx5IC0gdGhlIGNvdW50ZXJwYXJ0IG9mIGNyZWF0ZUFyY2hpdmVzLCB3aGljaCByZXNvbHZlcyBhIHdob2xlIHJvdXRpbmcgY29uZmlnIGludG8gYSBjaGFpbiB0aGF0IGZhbGxzIGJhY2sgYW5kIHJlLXJlc29sdmVzIGFjcm9zcyBtYW55IHNvdXJjZXMuIE5vdGhpbmcgaGVyZSBwaWNrcyBhIHNvdXJjZSBvciByZXRyaWVzIGFnYWluc3QgYW5vdGhlciBvbmU6IHRoZSBjYWxsZXIgKGEgY2hhaW4sIG9yIGEgc3RvcmUncyBzeW5jaHJvbml6YXRpb24pIGFscmVhZHkgZGVjaWRlZCB3aGljaCBlbmRwb2ludCBpdCB3YW50cywgYW5kIGdldHMgYSBjbGllbnQgYm91bmQgdG8gZXhhY3RseSB0aGF0IGVuZHBvaW50LiBTb3VyY2UgaWRlbnRpdHkgYW5kIGNvbmZpZyB1cGRhdGVzIGxpdmUgaGVyZSB0b28sIGJlY2F1c2UgdGhleSBhcmUgdGhlIHNhbWUgcXVlc3Rpb24gLSB3aGljaCBlbmRwb2ludCBpcyB0aGlzLCBhbmQgd2hhdCBwb2xpY3kgYXJlIHdlIGFwcGx5aW5nIHRvIGl0LlxuXG4vKiogVGhlIGNsaWVudCBmb3Igb25lIGNvbmZpZ3VyZWQgc291cmNlOiBiYWNrYmxhemUsIG9yIGEgc3RvcmFnZSBzZXJ2ZXIgLSBpbmNsdWRpbmcgdGhpcyBvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXBpQXJjaGl2ZXMoc291cmNlOiBTb3VyY2VDb25maWcpOiBJQXJjaGl2ZXMge1xuICAgIGlmIChzb3VyY2UudHlwZSA9PT0gXCJiYWNrYmxhemVcIikge1xuICAgICAgICByZXR1cm4gbmV3IEFyY2hpdmVzQmFja2JsYXplKHsgYnVja2V0TmFtZTogcGFyc2VCYWNrYmxhemVVcmwoc291cmNlLnVybCkuYnVja2V0TmFtZSwgcHVibGljOiBzb3VyY2UucHVibGljLCBpbW11dGFibGU6IHNvdXJjZS5pbW11dGFibGUsIGFsbG93ZWRPcmlnaW5zOiBzb3VyY2UuYWxsb3dlZE9yaWdpbnMgfSk7XG4gICAgfVxuICAgIC8vIEluY2x1ZGluZyB3aGVuIHRoYXQgc2VydmVyIGlzIHVzOiBhIGNhbGwgdG8gb3Vyc2VsdmVzIGlzIGEgV2ViU29ja2V0IHRvIG91ciBvd24gcG9ydCwgd2hpY2ggYXV0aGVudGljYXRlcyBhcyB0aGlzIG1hY2hpbmUgKHNvIGl0IGlzIGFsd2F5cyBhbGxvd2VkKSBhbmQgY29zdHMgYSByb3VuZCB0cmlwIG9uIGxvb3BiYWNrLiBOb3Qgd29ydGggYSBzZWNvbmQgaW1wbGVtZW50YXRpb24gb2YgZXZlcnkgb3BlcmF0aW9uIHRvIGF2b2lkLlxuICAgIHJldHVybiBuZXcgQXJjaGl2ZXNSZW1vdGUoeyB1cmw6IHNvdXJjZS51cmwsIHdhaXRGb3JBY2Nlc3M6IGZhbHNlLCBzb3VyY2VDb25maWc6IHNvdXJjZSB9KTtcbn1cblxuLyoqIFRoZSBPTkUgcGxhY2UgYSBzdG9yZSdzIHNvdXJjZSBpcyBidWlsdC4gRXZlcnkgc291cmNlIGEgc3RvcmUgc3luY2hyb25pemVzIHdpdGggaXMgb25lIG9mIGV4YWN0bHkgdHdvIHRoaW5nczogYSBjb25maWd1cmVkIHBlZXIsIG9yIHRoZSBzdG9yZSdzIG93biBkaXNrIGZvbGRlciAobm8gc291cmNlQ29uZmlnKS4gd3JpdGVEZWxheSB3cmFwcyBpdCBzbyBpdHMgd3JpdGVzIGFyZSBidWZmZXJlZCBpbiBtZW1vcnkgZm9yIHRoYXQgbG9uZyAoc2VlIEFyY2hpdmVzRGVsYXllZCkgLSB0aGUgd2hvbGUgb2YgXCJmYXN0IHdyaXRlc1wiLCBwZXIgc291cmNlLCBkZWNpZGVkIGhlcmUuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RvcmVTb3VyY2UoY29uZmlnOiB7IHNvdXJjZUNvbmZpZz86IFNvdXJjZUNvbmZpZzsgZm9sZGVyOiBzdHJpbmc7IHdyaXRlRGVsYXk/OiBudW1iZXIgfSk6IElBcmNoaXZlcyB7XG4gICAgbGV0IHNvdXJjZTogSUFyY2hpdmVzO1xuICAgIGlmICghY29uZmlnLnNvdXJjZUNvbmZpZykge1xuICAgICAgICBzb3VyY2UgPSBuZXcgQXJjaGl2ZXNEaXNrKGNvbmZpZy5mb2xkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZSA9IGNyZWF0ZUFwaUFyY2hpdmVzKGNvbmZpZy5zb3VyY2VDb25maWcpO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLndyaXRlRGVsYXkpIHtcbiAgICAgICAgc291cmNlID0gbmV3IEFyY2hpdmVzRGVsYXllZChzb3VyY2UsIGNvbmZpZy53cml0ZURlbGF5KTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbn1cblxuLyoqIEEgc291cmNlIHRoYXQgaG9sZHMgaXRzIG93biBTb3VyY2VDb25maWcgKHRvIHNlbmQgd2l0aCBldmVyeSByZXF1ZXN0LCBvciB0byByZWFkIHBvbGljeSBmbGFncyBvZmYpLiBEdWNrLXR5cGVkIHJhdGhlciB0aGFuIGEgYmFzZSBjbGFzczogdGhlIHRocmVlIGltcGxlbWVudGF0aW9ucyBoYXZlIG5vdGhpbmcgZWxzZSBpbiBjb21tb24sIGFuZCBhIHNvdXJjZSB0aGF0IGlnbm9yZXMgaXRzIGNvbmZpZyBzaW1wbHkgZG9lc24ndCBoYXZlIHRoZSBtZXRob2QuICovXG50eXBlIENvbmZpZ3VyYWJsZVNvdXJjZSA9IHsgdXBkYXRlU291cmNlQ29uZmlnKHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnKTogdm9pZCB9O1xuXG4vKiogQXBwbGllcyBhIGNoYW5nZWQgY29uZmlnIHRvIGFuIEFMUkVBRFkgUlVOTklORyBzb3VyY2UgKHNhbWUgZW5kcG9pbnQsIHNlZSBzb3VyY2VJZGVudGl0eSAtIG9ubHkgcG9saWN5IG1vdmVkKS4gU291cmNlcyB0aGF0IGNhcnJ5IHRoZWlyIGNvbmZpZyBpbnRvIGV2ZXJ5IHJlcXVlc3QgTVVTVCBiZSB1cGRhdGVkIGluIHBsYWNlLCBvciB0aGV5IGtlZXAgc2VuZGluZyB0aGUgb2xkIG9uZTogdGhlIHNlcnZlciBtYXRjaGVzIHRoZSBjb25maWcgaXQgaXMgaGFuZGVkIGFnYWluc3QgaXRzIG93biBlbnRyaWVzLCBzbyBhIHNvdXJjZSBsZWZ0IGhvbGRpbmcgYSBzdGFsZSBjb25maWcgZXZlbnR1YWxseSBzdG9wcyByZXNvbHZpbmcgdG8gYSBzdG9yZSBhdCBhbGwuIFRoZSB3cml0ZSBkZWxheSBpcyBwb2xpY3kgdG9vLCBzbyBpdCBtb3ZlcyBoZXJlIGFzIHdlbGwuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlTb3VyY2VDb25maWcoc291cmNlOiBJQXJjaGl2ZXMsIHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkLCB3cml0ZURlbGF5PzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHdyaXRlRGVsYXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc0RlbGF5ZWQoc291cmNlKT8uc2V0RGVsYXkod3JpdGVEZWxheSk7XG4gICAgfVxuICAgIC8vIFRoZSBzdG9yZSdzIG93biBkaXNrIGhhcyBubyBjb25maWcgdG8gYXBwbHkgLSBvbmx5IGEgZGVsYXlcbiAgICBpZiAoIXNvdXJjZUNvbmZpZykgcmV0dXJuO1xuICAgIC8vIFRoZSBjb25maWcgYmVsb25ncyB0byB0aGUgc291cmNlIGl0c2VsZiwgbm90IHRvIHRoZSBkZWxheSB3cmFwcGVkIGFyb3VuZCBpdFxuICAgIGxldCBjb25maWd1cmFibGUgPSB1bndyYXBEZWxheWVkKHNvdXJjZSkgYXMgUGFydGlhbDxDb25maWd1cmFibGVTb3VyY2U+O1xuICAgIGlmICh0eXBlb2YgY29uZmlndXJhYmxlLnVwZGF0ZVNvdXJjZUNvbmZpZyAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgY29uZmlndXJhYmxlLnVwZGF0ZVNvdXJjZUNvbmZpZyhzb3VyY2VDb25maWcpO1xufVxuIl19
51
+ /* _JS_SOURCE_HASH = "d1518847ce26e2daa489a3b4e30465cd9bfe8e12506437f087d5fe0e81d5755d"; */