@shipload/sdk 1.0.0-next.50 → 1.0.0-next.52

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 (58) hide show
  1. package/lib/shipload.d.ts +544 -149
  2. package/lib/shipload.js +2424 -448
  3. package/lib/shipload.js.map +1 -1
  4. package/lib/shipload.m.js +2390 -447
  5. package/lib/shipload.m.js.map +1 -1
  6. package/lib/testing.d.ts +131 -7
  7. package/lib/testing.js +469 -11
  8. package/lib/testing.js.map +1 -1
  9. package/lib/testing.m.js +470 -12
  10. package/lib/testing.m.js.map +1 -1
  11. package/package.json +1 -1
  12. package/src/capabilities/crafting.ts +10 -1
  13. package/src/capabilities/gathering.ts +1 -1
  14. package/src/capabilities/hauling.ts +0 -5
  15. package/src/capabilities/modules.ts +6 -0
  16. package/src/capabilities/movement.ts +1 -1
  17. package/src/contracts/server.ts +315 -8
  18. package/src/data/capabilities.ts +11 -2
  19. package/src/data/entities.json +235 -20
  20. package/src/data/item-ids.ts +10 -0
  21. package/src/data/items.json +61 -0
  22. package/src/data/kind-registry.json +53 -1
  23. package/src/data/kind-registry.ts +5 -0
  24. package/src/data/metadata.ts +74 -5
  25. package/src/data/recipes-runtime.ts +1 -0
  26. package/src/data/recipes.json +887 -118
  27. package/src/derivation/capabilities.test.ts +81 -4
  28. package/src/derivation/capabilities.ts +162 -57
  29. package/src/derivation/crafting.ts +2 -0
  30. package/src/derivation/recipe-usage.test.ts +10 -7
  31. package/src/derivation/rollups.ts +16 -0
  32. package/src/derivation/stat-scaling.ts +12 -0
  33. package/src/entities/makers.ts +10 -1
  34. package/src/index-module.ts +33 -3
  35. package/src/managers/actions.ts +89 -44
  36. package/src/managers/construction-types.ts +2 -2
  37. package/src/managers/construction.ts +15 -15
  38. package/src/managers/plot.ts +1 -1
  39. package/src/nft/buildImmutableData.ts +55 -9
  40. package/src/nft/description.ts +99 -36
  41. package/src/planner/planner.test.ts +50 -41
  42. package/src/resolution/resolve-item.test.ts +1 -1
  43. package/src/resolution/resolve-item.ts +26 -11
  44. package/src/scheduling/availability.ts +7 -6
  45. package/src/scheduling/cancel.test.ts +40 -6
  46. package/src/scheduling/cancel.ts +21 -29
  47. package/src/scheduling/jobs.ts +71 -0
  48. package/src/scheduling/lanes.ts +29 -0
  49. package/src/scheduling/projection.ts +42 -25
  50. package/src/scheduling/task-cargo.ts +1 -1
  51. package/src/testing/projection-parity.ts +2 -2
  52. package/src/travel/reach.ts +4 -6
  53. package/src/travel/route-planner.ts +60 -49
  54. package/src/travel/route-simulator.ts +170 -0
  55. package/src/travel/travel.ts +40 -5
  56. package/src/types/capabilities.ts +9 -3
  57. package/src/types.ts +8 -3
  58. package/src/managers/flatten-gather-plan.test.ts +0 -80
package/lib/shipload.m.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { __decorate } from 'tslib';
2
- import { Blob, ABI, Struct, Name, Asset, UInt64, Checksum256, UInt32, TimePointSec, ExtendedAsset, UInt16, UInt8, Int64, TimePoint, Int8, BlockTimestamp, Bytes, Int32, Checksum512, PermissionLevel, Action, Transaction, APIClient, Serializer } from '@wharfkit/antelope';
2
+ import { Blob, ABI, Struct, Name, Asset, UInt64, Checksum256, UInt32, TimePointSec, ExtendedAsset, UInt16, UInt8, Int64, TimePoint, Int8, Bytes, BlockTimestamp, Int32, Checksum512, PermissionLevel, Action, APIClient, Serializer } from '@wharfkit/antelope';
3
3
  import ContractKit, { Contract as Contract$2 } from '@wharfkit/contract';
4
4
 
5
5
  const abiBlob$1 = Blob.from('DmVvc2lvOjphYmkvMS4yAB0LYmFsYW5jZV9yb3cAAg50b2tlbl9jb250cmFjdARuYW1lB2JhbGFuY2UFYXNzZXQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BWNsb3NlAAMFb3duZXIEbmFtZQ50b2tlbl9jb250cmFjdARuYW1lDHRva2VuX3N5bWJvbAZzeW1ib2wLY29tcGFueV9yb3cAAgdhY2NvdW50BG5hbWUEbmFtZQZzdHJpbmcMZGViaXRkZXBvc2l0AAUFb3duZXIEbmFtZQV0b2tlbgRuYW1lBmxvY2tlZAVhc3NldAtmZWVfYWNjb3VudARuYW1lA2ZlZQVhc3NldA5kZXBvc2l0Y2ZnX3JvdwACDnRva2VuX2NvbnRyYWN0BG5hbWUMdG9rZW5fc3ltYm9sBnN5bWJvbAZlbmFibGUAAQdlbmFibGVkBGJvb2wKZW5hYmxlZ2FtZQACCGNvbnRyYWN0BG5hbWUHZW5hYmxlZARib29sDGZvdW5kY29tcGFueQACB2FjY291bnQEbmFtZQRuYW1lBnN0cmluZwtnYW1lX2NvbmZpZwAEBHNlZWQLY2hlY2tzdW0yNTYJZXBvY2h0aW1lBnVpbnQzMgVzdGFydA50aW1lX3BvaW50X3NlYwNlbmQOdGltZV9wb2ludF9zZWMJZ2FtZV9tZXRhAAQEbmFtZQZzdHJpbmcLZGVzY3JpcHRpb24Gc3RyaW5nA3VybAZzdHJpbmcHdmVyc2lvbgZzdHJpbmcIZ2FtZV9yb3cABAhjb250cmFjdARuYW1lBmNvbmZpZwtnYW1lX2NvbmZpZwRtZXRhCWdhbWVfbWV0YQVzdGF0ZQpnYW1lX3N0YXRlCmdhbWVfc3RhdGUAAQdlbmFibGVkBGJvb2wEb3BlbgADBW93bmVyBG5hbWUOdG9rZW5fY29udHJhY3QEbmFtZQx0b2tlbl9zeW1ib2wGc3ltYm9sDHJlbGdhdGVhc3NldAABCGFzc2V0X2lkBnVpbnQ2NAxyZWxnYXRlb3duZXIAAQVvd25lcgRuYW1lDHNldGVwb2NodGltZQACCGNvbnRyYWN0BG5hbWUJZXBvY2h0aW1lBnVpbnQzMghzZXR0b2tlbgACDnRva2VuX2NvbnRyYWN0BG5hbWUMdG9rZW5fc3ltYm9sBnN5bWJvbAlzdGFydGdhbWUABAhjb250cmFjdARuYW1lBmNvbmZpZwtnYW1lX2NvbmZpZwRtZXRhCWdhbWVfbWV0YQVzdGF0ZQpnYW1lX3N0YXRlCXN0YXRlX3JvdwABB2VuYWJsZWQEYm9vbAt1bndyYXBjYXJnbwADBGdhbWUEbmFtZQVvd25lcgRuYW1lCGFzc2V0X2lkBnVpbnQ2NA51bndyYXBjdXN0X3JvdwACCGFzc2V0X2lkBnVpbnQ2NAVvd25lcgRuYW1lDHVud3JhcGVudGl0eQADBGdhbWUEbmFtZQVvd25lcgRuYW1lCGFzc2V0X2lkBnVpbnQ2NAp1cGRhdGVnYW1lAAIIY29udHJhY3QEbmFtZQRtZXRhCWdhbWVfbWV0YQR3aXBlAAAId2l0aGRyYXcAAwVvd25lcgRuYW1lCHF1YW50aXR5DmV4dGVuZGVkX2Fzc2V0BG1lbW8Gc3RyaW5nCXdyYXBjYXJnbwAGBGdhbWUEbmFtZQVvd25lcgRuYW1lCWVudGl0eV9pZAZ1aW50NjQIbmV4dXNfaWQGdWludDY0CGNhcmdvX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQKd3JhcGVudGl0eQAEBGdhbWUEbmFtZQVvd25lcgRuYW1lCWVudGl0eV9pZAZ1aW50NjQIbmV4dXNfaWQGdWludDY0DHdyYXBnYXRlX3JvdwADBW93bmVyBG5hbWUEZ2FtZQRuYW1lDWxhc3RfYXNzZXRfaWQGdWludDY0EwCAisfka1RECmNsZWFydGFibGW+AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjbGVhcnRhYmxlCnN1bW1hcnk6ICdERUJVRzogY2xlYXJ0YWJsZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAAAAAIVpRAVjbG9zZeICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsb3NlCnN1bW1hcnk6ICdDbG9zZSBhIGRlcG9zaXQgYmFsYW5jZSByb3cnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpDbG9zZSB0aGUgb3duZXIncyBkZXBvc2l0IGJhbGFuY2Ugcm93IGZvciB0aGUgZ2l2ZW4gdG9rZW4gYW5kIGZyZWUgaXRzIFJBTS4gVGhlIGJhbGFuY2UgbXVzdCBiZSB6ZXJvIGJlZm9yZSBjbG9zaW5nLiBSZXF1aXJlcyB0aGUgb3duZXIncyBhdXRob3JpdHkukB2mVaXsjkoMZGViaXRkZXBvc2l0nQQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGViaXRkZXBvc2l0CnN1bW1hcnk6ICdEZWJpdCBhIGRlcG9zaXQgYmFsYW5jZSBmb3IgYSB3cmFwIG9wZXJhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE1ODExMzc4MiNkM2JmMjkwZmRkZWRkYmI3ZDMyYWE4OTdlOWY3ZTllMTNhMmFlNDQ5NTYxNDJlMjNlYjQ3Yjc3MDk2YTJlYThkCgotLS0KCkludGVybmFsIGFjdGlvbiBjYWxsZWQgaW5saW5lIGJ5IGEgcmVnaXN0ZXJlZCwgZW5hYmxlZCBnYW1lIGNvbnRyYWN0IG9ubHkuIERlYml0cyB0aGUgb3duZXIncyBkZXBvc2l0IGJhbGFuY2UgYnkgdGhlIGxvY2tlZCBhbW91bnQgcGx1cyB0aGUgZmVlLCBhbmQgY3JlZGl0cyB0aGUgZmVlIHRvIHRoZSBjb25maWd1cmVkIGZlZSBhY2NvdW50LiBVc2VkIGJ5IGEgZ2FtZSdzIHdyYXAgZmxvdyB0byBjb2xsZWN0IHRoZSB3cmFwIGNvc3QuIENhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgcGxheWVycyBvciB1bnJlZ2lzdGVyZWQgYWNjb3VudHMuAAAAAKh4zFQGZW5hYmxl8wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZW5hYmxlCnN1bW1hcnk6ICdFbmFibGUvZGlzYWJsZSBwbGF0Zm9ybScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE1ODExMzc4MiNkM2JmMjkwZmRkZWRkYmI3ZDMyYWE4OTdlOWY3ZTllMTNhMmFlNDQ5NTYxNDJlMjNlYjQ3Yjc3MDk2YTJlYThkCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoZSBwbGF0Zm9ybSBjb250cmFjdC4AgJKGqXjMVAplbmFibGVnYW1l/AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZW5hYmxlZ2FtZQpzdW1tYXJ5OiAnRW5hYmxlL2Rpc2JhYmxlIGEgZ2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE1ODExMzc4MiNkM2JmMjkwZmRkZWRkYmI3ZDMyYWE4OTdlOWY3ZTllMTNhMmFlNDQ5NTYxNDJlMjNlYjQ3Yjc3MDk2YTJlYThkCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGVjaWZpZWQgZ2FtZSBjb250cmFjdC7gp6mSojQ1XQxmb3VuZGNvbXBhbnmDAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBmb3VuZGNvbXBhbnkKc3VtbWFyeTogJ0ZvdW5kIGEgbmV3IGNvbXBhbnknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpGb3VuZCBhIG5ldyBjb21wYW55IGluIHRoZSBTaGlwbG9hZCBwbGF0Zm9ybSBjb250cmFjdC4AAAAAADBVpQRvcGVumwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogb3BlbgpzdW1tYXJ5OiAnT3BlbiBhIGRlcG9zaXQgYmFsYW5jZSByb3cnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpPcGVuIGEgemVyby1iYWxhbmNlIGRlcG9zaXQgcm93IGZvciB0aGUgZ2l2ZW4gb3duZXIgYW5kIHRva2VuLCB3aXRoIFJBTSBwYWlkIGJ5IHRoZSBvd25lci4gSGFzIG5vIGVmZmVjdCBpZiB0aGUgcm93IGFscmVhZHkgZXhpc3RzLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIG93bmVyIGNhbiByZWNlaXZlIHRva2VuIGRlcG9zaXRzIG9yIHdyYXAgcmVmdW5kcy6QFcZGZcOiugxyZWxnYXRlYXNzZXQAcNXkVGXDoroMcmVsZ2F0ZW93bmVyAKCkyw3RqrLCDHNldGVwb2NodGltZcQCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNldGVwb2NodGltZQpzdW1tYXJ5OiAnREVCVUc6IG92ZXJyaWRlIGEgZ2FtZScncyBlcG9jaCB0aW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpPdmVycmlkZSB0aGUgZXBvY2ggZHVyYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNwZWNpZmllZCBnYW1lIGNvbnRyYWN0LiBSZXF1aXJlcyBwbGF0Zm9ybSBjb250cmFjdCBhdXRob3JpdHkuAAAAU0Gas8IIc2V0dG9rZW6dAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzZXR0b2tlbgpzdW1tYXJ5OiAnU2V0IHRoZSBhY2NlcHRlZCBkZXBvc2l0IHRva2VuJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKQWRtaW4gYWN0aW9uIHRoYXQgc2V0cyB0aGUgYWNjZXB0ZWQgZGVwb3NpdCB0b2tlbiAoY29udHJhY3QgYWNjb3VudCBhbmQgc3ltYm9sKSBmb3IgdGhlIHBsYXRmb3JtLiBBbGwgcGxheWVyIGRlcG9zaXRzIGFuZCB3cmFwIGNvc3RzIGFyZSBkZW5vbWluYXRlZCBpbiB0aGlzIHRva2VuLiBSZXF1aXJlcyBwbGF0Zm9ybSBjb250cmFjdCBhdXRob3JpdHkuAABQ0rB8TcYJc3RhcnRnYW1l/wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3RhcnRnYW1lCnN1bW1hcnk6ICdTdGFydCBhIG5ldyBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKU3RhcnQgYSBuZXcgZ2FtZSBvZiBTaGlwbG9hZCBkZXBsb3llZCB0byBhIG5ldyBjb250cmFjdC4AKLsGVXP51At1bndyYXBjYXJnb88ELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHVud3JhcGNhcmdvCnN1bW1hcnk6ICdEZXBvc2l0IGFuIE5GVCBpbnRvIGEgaG9zdCBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkRlcG9zaXQgYW4gQXRvbWljQXNzZXRzIE5GVCBpbnRvIGEgaG9zdCBlbnRpdHkncyBjYXJnby4gUGFpcnMgd2l0aCBhbiBhdG9taWNhc3NldHM6OnRyYW5zZmVyIGNhcnJ5aW5nIHRoZSAndW53cmFwJyBtZW1vIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLiBUaGUgY2FsbGVyIG11c3Qgb3duIHRoZSBob3N0LCB0aGUgaG9zdCBtdXN0IGhhdmUgbG9hZGVycywgYW5kIHRoZSBob3N0IG11c3QgaGF2ZSBjYXBhY2l0eSBoZWFkcm9vbSBmb3IgdGhlIHVud3JhcHBlZCBtYXNzLiBTY2hlZHVsZXMgYSBUQVNLX1VOV1JBUCBvbiB0aGUgaG9zdCB0aGF0LCBvbiByZXNvbHV0aW9uLCBwbGFjZXMgdGhlIGRlY29kZWQgaXRlbSBpbnRvIHRoZSBob3N0J3MgY2FyZ28gYW5kIGJ1cm5zIHRoZSBORlQu4LPLU1Vz+dQMdW53cmFwZW50aXR54gQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdW53cmFwZW50aXR5CnN1bW1hcnk6ICdEZXBsb3kgYW4gZW50aXR5IE5GVCBkaXJlY3RseSB0byBhIG5leHVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpEZXBsb3kgYSBwYWNrZWQtZW50aXR5IEF0b21pY0Fzc2V0cyBORlQgKG9yYml0YWwgdmVzc2VsOiBzaGlwIG9yIGNvbnRhaW5lcikgZGlyZWN0bHkgYXMgYSBsaXZlIGVudGl0eS4gUGFpcnMgd2l0aCBhbiBhdG9taWNhc3NldHM6OnRyYW5zZmVyIGNhcnJ5aW5nIHRoZSAnZGVwbG95JyBtZW1vIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLiBUaGUgTkZUIGlzIGJ1cm5lZCwgYSBuZXcgZW50aXR5IHJvdyBpcyBlbXBsYWNlZCBhdCB0aGUgTkZUJ3Mgd3JhcCBvcmlnaW4gcGFpZCBieSB0aGUgb3duZXIsIGFuZCBUQVNLX1RSQVZFTCBwbHVzIFRBU0tfUkVDSEFSR0UgYXJlIHF1ZXVlZCB0byBkZWxpdmVyIHRoZSBlbnRpdHkgdG8gdGhlIHRhcmdldCBuZXh1cyBhbmQgYnJpbmcgaXQgdG8gZnVsbCBlbmVyZ3kuAICShqlsUtUKdXBkYXRlZ2FtZY0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHVwZGF0ZWdhbWUKc3VtbWFyeTogJ1VwZGF0ZSBnYW1lIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKVXBkYXRlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIGdhbWUgY29udHJhY3QuCgotLS0AAAAAAKCq4wR3aXBlsgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2lwZQpzdW1tYXJ5OiAnREVCVUc6IHdpcGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAA3NzUsuMId2l0aGRyYXeXAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXRoZHJhdwpzdW1tYXJ5OiAnV2l0aGRyYXcgdG9rZW5zIGZyb20gYSBkZXBvc2l0IGJhbGFuY2UnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpXaXRoZHJhdyB0b2tlbnMgZnJvbSB0aGUgb3duZXIncyBkZXBvc2l0IGJhbGFuY2UuIERlYml0cyB0aGUgbGVkZ2VyIGJ5IHRoZSByZXF1ZXN0ZWQgYW1vdW50IGFuZCB0cmFuc2ZlcnMgdGhlIHRva2VucyB0byB0aGUgb3duZXIuIFJlcXVpcmVzIGEgc3VmZmljaWVudCBiYWxhbmNlIGFuZCB0aGUgb3duZXIncyBhdXRob3JpdHkuAACg7BpUzeUJd3JhcGNhcmdvAACAzy5PVc3lCndyYXBlbnRpdHm1BC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3cmFwZW50aXR5CnN1bW1hcnk6ICdXcmFwIGEgZGVwbG95ZWQgZW50aXR5IGludG8gYW4gTkZUJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpXcmFwIGFuIGVudGl0eSBpbnRvIGFuIEF0b21pY0Fzc2V0cyBORlQgbWludGVkIHRvIGl0cyBvd25lci4gVGhlIGVudGl0eSBtdXN0IGJlIGF0IGEgbmV4dXMsIGlkbGUgd2l0aCBlbXB0eSBjYXJnbywgYW5kIGhhdmUgYW4gbmZ0Y29uZmlnIG1hcHBpbmcgZm9yIGl0cyBpdGVtIGlkLiBFcmFzZXMgdGhlIGVudGl0eSBhbmQgbWludHMgdGhlIE5GVCBpbmxpbmUsIHByZXNlcnZpbmcgaXRzIHN0YXRzIGFuZCBpbnN0YWxsZWQgbW9kdWxlczsgdGhlIHBsYXllciBwYXlzIFJBTSBmb3IgdGhlIG5ldyBhc3NldCByb3cuIFJlcXVpcmVzIHRoZSBvd25lcidzIGFjdGl2ZSBwZXJtaXNzaW9uIChubyBzZXNzaW9uLWtleSBjb21wYXRpYmlsaXR5KS4HAAAAQKFpojkDaTY0AAALYmFsYW5jZV9yb3cAAADAT1MlRQNpNjQAAAtjb21wYW55X3JvdwAAWyg7TKtKA2k2NAAADmRlcG9zaXRjZmdfcm93AAAAAACspGEDaTY0AAAIZ2FtZV9yb3cAAAAAAJVNxgNpNjQAAAlzdGF0ZV9yb3cAQMYaVXP51ANpNjQAAA51bndyYXBjdXN0X3JvdwAAACobVs3lA2k2NAAADHdyYXBnYXRlX3JvdwETU2hpcGxvYWQgKFBsYXRmb3JtKRNTaGlwbG9hZCAoUGxhdGZvcm0pAAAAAA==');
@@ -440,7 +440,7 @@ var platform = /*#__PURE__*/Object.freeze({
440
440
  Contract: Contract$1
441
441
  });
442
442
 
443
- const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDi/AQlhZGRtb2R1bGUABAllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgp0YXJnZXRfcmVmCmNhcmdvX3JlZj8IYWRkbmV4dXMAAwpuZXh1c19uYW1lBnN0cmluZwF4BWludDY0AXkFaW50NjQJYWRkb3JhY2xlAAEJb3JhY2xlX2lkBG5hbWUFYmxlbmQAAgJpZAZ1aW50NjQGaW5wdXRzDGNhcmdvX2l0ZW1bXQlidWlsZHBsb3QAAgpidWlsZGVyX2lkBnVpbnQ2NAdwbG90X2lkBnVpbnQ2NAZjYW5jZWwAAwJpZAZ1aW50NjQIbGFuZV9rZXkFdWludDgFY291bnQGdWludDY0DmNhbmNlbF9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lD2NhbmNlbGxlZF9jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CmNhcmdvX2l0ZW0ABQdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhxdWFudGl0eQZ1aW50MzIJZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcmVmAAQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10JZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcm93AAcCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdC3NlcXVlbmNlX2lkB3VpbnQ2ND8KY2FyZ29fdmlldwAGB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHF1YW50aXR5BnVpbnQzMgJpZAZ1aW50NjQJZW50aXR5X2lkB3VpbnQ2ND8JY2xhaW1fcm93AAEFb3duZXIEbmFtZQljbGFpbXBsb3QAAwpidWlsZGVyX2lkBnVpbnQ2NA50YXJnZXRfaXRlbV9pZAZ1aW50MTYEc2xvdAxjbHVzdGVyX3Nsb3QMY2xhaW1zdGFydGVyAAEFb3duZXIEbmFtZQljbGVhbnJzdnAAAgVlcG9jaAZ1aW50NjQIbWF4X3Jvd3MGdWludDY0CmNsZWFydGFibGUAAwp0YWJsZV9uYW1lBG5hbWUFc2NvcGUFbmFtZT8IbWF4X3Jvd3MHdWludDY0PwxjbHVzdGVyX2NlbGwAAwJneARpbnQ4Amd5BGludDgGZW50aXR5BnVpbnQ2NAtjbHVzdGVyX3JvdwACBHJvb3QGdWludDY0BWNlbGxzDmNsdXN0ZXJfY2VsbFtdDGNsdXN0ZXJfc2xvdAADA2h1YgZ1aW50NjQCZ3gEaW50OAJneQRpbnQ4BmNvbW1pdAADCW9yYWNsZV9pZARuYW1lBWVwb2NoBnVpbnQ2NAZjb21taXQLY2hlY2tzdW0yNTYKY29tbWl0X3JvdwAEAmlkBnVpbnQ2NAVlcG9jaAZ1aW50NjQJb3JhY2xlX2lkBG5hbWUGY29tbWl0C2NoZWNrc3VtMjU2CWNvbmZpZ2xvZwABBmNvbmZpZwtnYW1lX2NvbmZpZwtjb29yZGluYXRlcwADAXgFaW50NjQBeQVpbnQ2NAF6B3VpbnQxNj8FY3JhZnQABgJpZAZ1aW50NjQJcmVjaXBlX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIGaW5wdXRzDGNhcmdvX2l0ZW1bXQZ0YXJnZXQHdWludDY0PwRzbG90BnVpbnQ4PwxjcmFmdGVyX2xhbmUABApzbG90X2luZGV4BXVpbnQ4BXNwZWVkBnVpbnQxNgVkcmFpbgZ1aW50MzIKb3V0cHV0X3BjdAZ1aW50MTYIZGVtb2xpc2gAAQllbnRpdHlfaWQGdWludDY0BmRlcGxveQADAmlkBnVpbnQ2NANyZWYJY2FyZ29fcmVmBHNsb3QNY2x1c3Rlcl9zbG90PwpkZXNjZW50aXR5AAQHaXRlbV9pZAZ1aW50MTYKaHVsbF9zdGF0cwZ1aW50NjQMbW9kdWxlX2l0ZW1zCHVpbnQxNltdDG1vZHVsZV9zdGF0cwh1aW50NjRbXQZlbmFibGUAAQdlbmFibGVkBGJvb2wMZW5lcmd5X3N0YXRzAAIIY2FwYWNpdHkGdWludDMyCHJlY2hhcmdlBnVpbnQzMhRlbnRpdHlfY3VycmVudF9zdGF0ZQACC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzBmVuZXJneQZ1aW50MzIPZW50aXR5X2RlZmF1bHRzAAILd2FyZWhvdXNlX3oGdWludDE2C2NvbnRhaW5lcl96BnVpbnQxNgtlbnRpdHlfaW5mbwAWBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMHaXRlbV9pZAZ1aW50MTYJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb192aWV3W10HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQZlbmVyZ3kHdWludDMyPwhodWxsbWFzcwd1aW50MzI/CGNhcGFjaXR5B3VpbnQzMj8HZW5naW5lcw9tb3ZlbWVudF9zdGF0cz8Ed2FycAt3YXJwX3N0YXRzPwlnZW5lcmF0b3INZW5lcmd5X3N0YXRzPwZoYXVsZXINaGF1bGVyX3N0YXRzPw5nYXRoZXJlcl9sYW5lcw9nYXRoZXJlcl9sYW5lW10NY3JhZnRlcl9sYW5lcw5jcmFmdGVyX2xhbmVbXQxsb2FkZXJfbGFuZXMNbG9hZGVyX2xhbmVbXQhsYXVuY2hlcg9sYXVuY2hlcl9zdGF0cz8FbGFuZXMGbGFuZVtdBWhvbGRzBmhvbGRbXQ1lbnRpdHlfbGF5b3V0AAIOZW50aXR5X2l0ZW1faWQGdWludDE2BXNsb3RzCnNsb3RfZGVmW10VZW50aXR5X2xheW91dHNfcmVzdWx0AAEIZW50aXRpZXMPZW50aXR5X2xheW91dFtdCmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQKZW50aXR5X3JvdwAMAmlkBnVpbnQ2NAVvd25lcgRuYW1lBGtpbmQEbmFtZQdpdGVtX2lkBnVpbnQxNgRuYW1lBnN0cmluZwVzdGF0cwZ1aW50NjQLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5B3VpbnQzMj8JY2FyZ29tYXNzBnVpbnQzMgdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdBWxhbmVzBmxhbmVbXQVob2xkcwZob2xkW10OZW50aXR5X3NlcV9yb3cAAQduZXh0X2lkBnVpbnQ2NA5lbnRpdHlfc3VtbWFyeQAIBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMHaXNfaWRsZQRib29sDnJlc29sdmVkX2NvdW50BnVpbnQzMg1wZW5kaW5nX2NvdW50BnVpbnQzMhBlbnRpdHlfdGFza19pbmZvAAQJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lCnRhc2tfY291bnQFdWludDgQc2NoZWR1bGVfc3RhcnRlZAp0aW1lX3BvaW50D2VudGl0eWdyb3VwX3JvdwACAmlkBnVpbnQ2NAxwYXJ0aWNpcGFudHMMZW50aXR5X3JlZltdC2VudW1fbWVtYmVyAAIFdmFsdWUFdWludDgEbmFtZQZzdHJpbmcLZW51bV9yZXN1bHQAAQdtZW1iZXJzDWVudW1fbWVtYmVyW10JZXBvY2hfcm93AAQFZXBvY2gGdWludDY0Cm9yYWNsZV9pZHMGbmFtZVtdCXRocmVzaG9sZAV1aW50OARzZWVkC2NoZWNrc3VtMjU2DGZpeGNhcmdvbWFzcwABCWVudGl0eV9pZAZ1aW50NjQQZm9vdHByaW50X3Jlc3VsdAABBWNlbGxzC2dyaWRfY2VsbFtdC2ZvcmNlcmV2ZWFsAAEFZXBvY2gGdWludDY0C2dhbWVfY29uZmlnAAMHdmVyc2lvbgZ1aW50MzIIZGVmYXVsdHMPZW50aXR5X2RlZmF1bHRzBWl0ZW1zCml0ZW1fZGVmW10GZ2F0aGVyAAUJc291cmNlX2lkBnVpbnQ2NA5kZXN0aW5hdGlvbl9pZAZ1aW50NjQHc3RyYXR1bQZ1aW50MTYIcXVhbnRpdHkGdWludDMyBHNsb3QGdWludDg/DWdhdGhlcmVyX2xhbmUABQpzbG90X2luZGV4BXVpbnQ4BXlpZWxkBnVpbnQxNgVkcmFpbgZ1aW50MzIFZGVwdGgGdWludDE2Cm91dHB1dF9wY3QGdWludDE2DGdlbmVzaXNmbGVldAABCGVudGl0aWVzDGVudGl0eV9yb3dbXQpnZXRjbHVzdGVyAAEGaHViX2lkBnVpbnQ2NAlnZXRjb25maWcAAApnZXRkZXBvc2l0AAIFb3duZXIEbmFtZQhhc3NldF9pZAZ1aW50NjQLZ2V0ZGlzdGFuY2UABAJheAVpbnQ2NAJheQVpbnQ2NAJieAVpbnQ2NAJieQVpbnQ2NAtnZXRlbGlnaWJsZQACBmNvb3Jkcwtjb29yZGluYXRlcwdzdHJhdHVtBnVpbnQxNglnZXRlbnRjbHMAAAtnZXRlbnRpdGllcwACBW93bmVyBG5hbWULZW50aXR5X3R5cGUFbmFtZT8JZ2V0ZW50aXR5AAEJZW50aXR5X2lkBnVpbnQ2NAxnZXRmb290cHJpbnQAAQdpdGVtX2lkBnVpbnQxNgtnZXRpdGVtZGF0YQAACmdldGl0ZW1pZHMAAAhnZXRpdGVtcwAAC2dldGl0ZW10eXBlAAEHaXRlbV9pZAZ1aW50MTYMZ2V0aXRlbXR5cGVzAAALZ2V0a2luZG1ldGEAAAtnZXRsb2NhdGlvbgACAXgFaW50NjQBeQVpbnQ2NApnZXRsb2NkYXRhAAIBeAVpbnQ2NAF5BWludDY0C2dldG1vZHR5cGVzAAAKZ2V0bW9kdWxlcwAACWdldG5lYXJieQACCWVudGl0eV9pZAZ1aW50NjQIcmVjaGFyZ2UEYm9vbApnZXRuZnRiYXNlAAAKZ2V0bmZ0aW5mbwAACWdldHBsYXllcgABB2FjY291bnQEbmFtZQxnZXRwcm9qc3RhdGUAAgllbnRpdHlfaWQGdWludDY0CnRhc2tfY291bnQGdWludDg/CWdldHJlY2lwZQABDm91dHB1dF9pdGVtX2lkBnVpbnQxNgpnZXRyZWNpcGVzAAILbG93ZXJfYm91bmQGdWludDE2BWxpbWl0BXVpbnQ4CmdldHJlc2NhdHMAAAtnZXRyZXNlcnZlcwACAXgFaW50NjQBeQVpbnQ2NAxnZXRyZXNvdXJjZXMAAAhnZXRzbG90cwAACmdldHN0cmF0dW0AAwF4BWludDY0AXkFaW50NjQHc3RyYXR1bQZ1aW50MTYMZ2V0c3VtbWFyaWVzAAIFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQVuYW1lPwtnZXR3b3JtaG9sZQACAXgFaW50NjQBeQVpbnQ2NAlncmlkX2NlbGwAAgJneARpbnQ4Amd5BGludDgMZ3JvdXB0cmFuc2l0AAUIZW50aXRpZXMMZW50aXR5X3JlZltdAmF4BWludDY0AmF5BWludDY0AmJ4BWludDY0AmJ5BWludDY0C2dyb3VwdHJhdmVsAAQIZW50aXRpZXMMZW50aXR5X3JlZltdAXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sBGhhc2gAAQV2YWx1ZQZzdHJpbmcHaGFzaDUxMgABBXZhbHVlBnN0cmluZwxoYXVsZXJfc3RhdHMABAhjYXBhY2l0eQV1aW50OAplZmZpY2llbmN5BnVpbnQxNgVkcmFpbgZ1aW50MzIQY2FwYWNpdHlfYnlfdGllchFoYXVsZXJfdGllcl9jYXBbXQ9oYXVsZXJfdGllcl9jYXAAAgR0aWVyBXVpbnQ4CGNhcGFjaXR5BXVpbnQ4BGhvbGQABQJpZAZ1aW50NjQEa2luZAV1aW50OAtjb3VudGVycGFydAplbnRpdHlfcmVmBXVudGlsCnRpbWVfcG9pbnQNaW5jb21pbmdfbWFzcwZ1aW50MzILaW1wb3J0Y2FyZ28AAQNyb3cJY2FyZ29fcm93DGltcG9ydGVudGl0eQABA3JvdwplbnRpdHlfcm93C2ltcG9ydGdyb3VwAAEDcm93D2VudGl0eWdyb3VwX3JvdwxpbXBvcnRwbGF5ZXIAAQVvd25lcgRuYW1lDWltcG9ydHJlc2VydmUAAgtlcG9jaF9zY29wZQZ1aW50MzIDcm93C3Jlc2VydmVfcm93C2ltcG9ydHN0YXRlAAEDcm93CXN0YXRlX3JvdwhpdGVtX2RlZgAFAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgR0eXBlBXVpbnQ4B3N1YnR5cGUFdWludDgEdGllcgV1aW50OAxpdGVtX2lkX3BhaXIAAgJpZAZ1aW50MTYEbmFtZQZzdHJpbmcPaXRlbV9pZHNfcmVzdWx0AAEFaXRlbXMOaXRlbV9pZF9wYWlyW10PaXRlbWRhdGFfcmVzdWx0AAIFaXRlbXMKaXRlbV9kZWZbXQdyZWNpcGVzDnJlY2lwZXNfcmVzdWx0Cml0ZW1zX2luZm8AAQVpdGVtcwppdGVtX2RlZltdBGpvaW4AAQdhY2NvdW50BG5hbWUQa2luZF9tZXRhX3Jlc3VsdAACBWtpbmRzD2tpbmRfbWV0YV9yb3dbXQl0ZW1wbGF0ZXMTdGVtcGxhdGVfbWV0YV9yb3dbXQ1raW5kX21ldGFfcm93AAUEa2luZARuYW1lDmNsYXNzaWZpY2F0aW9uBXVpbnQ4EGNhcGFiaWxpdHlfZmxhZ3MFdWludDgHel9jb29yZAZ1aW50MzINZGVmYXVsdF9sYWJlbAZzdHJpbmcEbGFuZQACCGxhbmVfa2V5BXVpbnQ4CHNjaGVkdWxlCHNjaGVkdWxlBmxhdW5jaAADC2xhdW5jaGVyX2lkBnVpbnQ2NApjYXRjaGVyX2lkBnVpbnQ2NAVpdGVtcwxjYXJnb19pdGVtW10ObGF1bmNoZXJfc3RhdHMAAwtjaGFyZ2VfcmF0ZQZ1aW50MTYIdmVsb2NpdHkGdWludDE2BWRyYWluBnVpbnQxNgRsb2FkAAMCaWQGdWludDY0B2Zyb21faWQGdWludDY0BWl0ZW1zDGNhcmdvX2l0ZW1bXQtsb2FkZXJfbGFuZQAECnNsb3RfaW5kZXgFdWludDgEbWFzcwZ1aW50MzIGdGhydXN0BnVpbnQxNgpvdXRwdXRfcGN0BnVpbnQxNhBsb2NhdGlvbl9kZXJpdmVkAAIMc3RhdGljX3Byb3BzD2xvY2F0aW9uX3N0YXRpYwRzaXplBnVpbnQxNg1sb2NhdGlvbl9pbmZvAAMGY29vcmRzC2Nvb3JkaW5hdGVzCWlzX3N5c3RlbQRib29sC2lzX3dvcm1ob2xlBGJvb2wPbG9jYXRpb25fc3RhdGljAAUGY29vcmRzC2Nvb3JkaW5hdGVzBHR5cGUNbG9jYXRpb25fdHlwZQdzdWJ0eXBlBXVpbnQ4BXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DG1vZHVsZV9lbnRyeQACBHR5cGUFdWludDgJaW5zdGFsbGVkDnBhY2tlZF9tb2R1bGU/C21vZHVsZV9pbmZvAAQCaWQGdWludDE2BG1hc3MGdWludDMyC21vZHVsZV90eXBlBXVpbnQ4BHRpZXIFdWludDgObW9kdWxlc19yZXN1bHQAAQdtb2R1bGVzDW1vZHVsZV9pbmZvW10ObW92ZW1lbnRfc3RhdHMAAgZ0aHJ1c3QGdWludDMyBWRyYWluBnVpbnQzMghtb3ZldGlsZQAFBmh1Yl9pZAZ1aW50NjQHZnJvbV9neARpbnQ4B2Zyb21fZ3kEaW50OAV0b19neARpbnQ4BXRvX2d5BGludDgLbmVhcmJ5X2luZm8ABQpjYW5fdHJhdmVsBGJvb2wHY3VycmVudBRlbnRpdHlfY3VycmVudF9zdGF0ZQlwcm9qZWN0ZWQUZW50aXR5X2N1cnJlbnRfc3RhdGUKbWF4X2VuZXJneQZ1aW50MzIHc3lzdGVtcw9uZWFyYnlfc3lzdGVtW10NbmVhcmJ5X3N5c3RlbQAECGRpc3RhbmNlBnVpbnQ2NAtlbmVyZ3lfY29zdAZ1aW50NjQLZmxpZ2h0X3RpbWUGdWludDMyCGxvY2F0aW9uDWxvY2F0aW9uX2luZm8ObmZ0X2NhcmdvX2l0ZW0ABAdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhxdWFudGl0eQZ1aW50MzIQbmZ0X2l0ZW1fcGF5bG9hZAACBGl0ZW0ObmZ0X2NhcmdvX2l0ZW0IbG9jYXRpb24MY29vcmRpbmF0ZXM/Dm5mdF9zY2hlbWFfZGVmAAILc2NoZW1hX25hbWUEbmFtZQZmaWVsZHMOc2NoZW1hX2ZpZWxkW10QbmZ0X3RlbXBsYXRlX2RlZgADB2l0ZW1faWQGdWludDE2C3NjaGVtYV9uYW1lBG5hbWULdGVtcGxhdGVfaWQFaW50MzINbmZ0Y29uZmlnX3JvdwADB2l0ZW1faWQGdWludDE2C3RlbXBsYXRlX2lkBWludDMyC3NjaGVtYV9uYW1lBG5hbWUJbmZ0aW1ndXJsAAIEaXRlbQpjYXJnb19pdGVtCGxvY2F0aW9uDGNvb3JkaW5hdGVzPw5uZnRpbmZvX3Jlc3VsdAACB3NjaGVtYXMQbmZ0X3NjaGVtYV9kZWZbXQl0ZW1wbGF0ZXMSbmZ0X3RlbXBsYXRlX2RlZltdBm5vdGlmeQABBWV2ZW50CnRhc2tfZXZlbnQRb3JhY2xlX2NvbmZpZ19yb3cAAQl0aHJlc2hvbGQFdWludDgKb3JhY2xlX3JvdwABAmlkBG5hbWUNcGFja2VkX21vZHVsZQACB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NApwbGFjZWNhcmdvAAMFb3duZXIEbmFtZQdob3N0X2lkBnVpbnQ2NAhhc3NldF9pZAZ1aW50NjQLcGxhY2VlbnRpdHkAAwVvd25lcgRuYW1lCGFzc2V0X2lkBnVpbnQ2NA90YXJnZXRfbmV4dXNfaWQGdWludDY0C3BsYXllcl9pbmZvAAMFb3duZXIEbmFtZQlpc19wbGF5ZXIEYm9vbAxjb21wYW55X25hbWUGc3RyaW5nCnBsYXllcl9yb3cAAQVvd25lcgRuYW1lD3Byb2plY3RlZF9zdGF0ZQAQBW93bmVyBG5hbWULY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5B3VpbnQzMj8JY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb192aWV3W10IaHVsbG1hc3MHdWludDMyPwhjYXBhY2l0eQd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8GaGF1bGVyDWhhdWxlcl9zdGF0cz8OZ2F0aGVyZXJfbGFuZXMPZ2F0aGVyZXJfbGFuZVtdDWNyYWZ0ZXJfbGFuZXMOY3JhZnRlcl9sYW5lW10MbG9hZGVyX2xhbmVzDWxvYWRlcl9sYW5lW10IbGF1bmNoZXIPbGF1bmNoZXJfc3RhdHM/BHRpZXIFdWludDgIcmVjaGFyZ2UAAQJpZAZ1aW50NjQMcmVjaXBlX2lucHV0AAIHaXRlbV9pZAZ1aW50MTYIcXVhbnRpdHkGdWludDMyEHJlY2lwZV9pdGVtX2luZm8AAgJpZAZ1aW50MTYEbWFzcwZ1aW50MzIPcmVjaXBlX3Jlc3BvbnNlAAgOb3V0cHV0X2l0ZW1faWQGdWludDE2C291dHB1dF9tYXNzBnVpbnQzMgZpbnB1dHMOcmVjaXBlX2lucHV0W10Kc3RhdF9zbG90cxRzdGF0X3Nsb3RfcmVzcG9uc2VbXQ1ibGVuZF93ZWlnaHRzBWJ5dGVzC291dHB1dF9pdGVtEHJlY2lwZV9pdGVtX2luZm8LaW5wdXRfaXRlbXMScmVjaXBlX2l0ZW1faW5mb1tdD3NvdXJjZV9zdWJjbGFzcwd1aW50MTY/DnJlY2lwZXNfcmVzdWx0AAEHcmVjaXBlcxFyZWNpcGVfcmVzcG9uc2VbXQxyZWZyc2hlbnRpdHkAAQllbnRpdHlfaWQGdWludDY0DHJlbW92ZW9yYWNsZQABCW9yYWNsZV9pZARuYW1lBnJlbmFtZQACAmlkBnVpbnQ2NARuYW1lBnN0cmluZwtyZXNlcnZlX3JvdwAFAmlkBnVpbnQ2NAhjb29yZF9pZAZ1aW50NjQHc3RyYXR1bQZ1aW50MTYJcmVtYWluaW5nBnVpbnQzMgpsYXN0X2Jsb2NrFGJsb2NrX3RpbWVzdGFtcF90eXBlB3Jlc29sdmUAAgJpZAZ1aW50NjQFY291bnQHdWludDY0Pw9yZXNvbHZlX3Jlc3VsdHMABgllbnRpdHlfaWQGdWludDY0C2VudGl0eV90eXBlBG5hbWUOcmVzb2x2ZWRfY291bnQGdWludDMyFG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CnJlc29sdmVhbGwAAQVvd25lcgRuYW1lEnJlc29sdmVhbGxfcmVzdWx0cwACB3NjYW5uZWQGdWludDMyCHJlc29sdmVkBnVpbnQzMg1yZXNvdXJjZV9pbmZvAAQCaWQGdWludDE2BG1hc3MGdWludDMyCGNhdGVnb3J5BXVpbnQ4BHRpZXIFdWludDgOcmVzb3VyY2Vfc3RhdHMAAwVzdGF0MQZ1aW50MTYFc3RhdDIGdWludDE2BXN0YXQzBnVpbnQxNhByZXNvdXJjZXNfcmVzdWx0AAEJcmVzb3VyY2VzD3Jlc291cmNlX2luZm9bXQZyZXZlYWwAAwlvcmFjbGVfaWQEbmFtZQVlcG9jaAZ1aW50NjQGcmV2ZWFsC2NoZWNrc3VtMjU2CnJldmVhbF9yb3cABAJpZAZ1aW50NjQFZXBvY2gGdWludDY0CW9yYWNsZV9pZARuYW1lBnJldmVhbAtjaGVja3N1bTI1NghybW1vZHVsZQADCWVudGl0eV9pZAZ1aW50NjQMbW9kdWxlX2luZGV4BXVpbnQ4CnRhcmdldF9yZWYKY2FyZ29fcmVmPwhybW5mdGNmZwABB2l0ZW1faWQGdWludDE2CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzY2hlbWFfZmllbGQAAgRuYW1lBnN0cmluZwpmaWVsZF90eXBlBnN0cmluZwlzZXRjb29yZHMAAwllbnRpdHlfaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAlzZXRuZnRjZmcAAwdpdGVtX2lkBnVpbnQxNgt0ZW1wbGF0ZV9pZAVpbnQzMgtzY2hlbWFfbmFtZQRuYW1lDHNldHRocmVzaG9sZAABCXRocmVzaG9sZAV1aW50OAtzZXR3cmFwY29zdAADCWl0ZW1fdHlwZQV1aW50OAR0aWVyBXVpbnQ4BmFtb3VudAZ1aW50NjQKc2V0d3JhcGZlZQACB2ZlZV9wY3QGdWludDE2C2ZlZV9hY2NvdW50BG5hbWUIc2xvdF9kZWYAAwR0eXBlBXVpbnQ4Cm91dHB1dF9wY3QGdWludDE2CG1heF90aWVyBXVpbnQ4EnN0YXRfc2xvdF9yZXNwb25zZQABB3NvdXJjZXMNc3RhdF9zb3VyY2VbXQtzdGF0X3NvdXJjZQACC2lucHV0X2luZGV4BXVpbnQ4EGlucHV0X3N0YXRfaW5kZXgFdWludDgJc3RhdGVfcm93AAMHZW5hYmxlZARib29sBWVwb2NoBnVpbnQzMgRzZWVkC2NoZWNrc3VtMjU2CXN0b3djYXJnbwAFBW93bmVyBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhuZXh1c19pZAZ1aW50NjQIY2FyZ29faWQGdWludDY0CHF1YW50aXR5BnVpbnQ2NApzdG93ZW50aXR5AAMFb3duZXIEbmFtZQllbnRpdHlfaWQGdWludDY0CG5leHVzX2lkBnVpbnQ2NAxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABQdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzILcmVzZXJ2ZV9tYXgGdWludDMyEXN0cmF0dW1fcmVtYWluaW5nAAMHc3RyYXR1bQZ1aW50MTYJcmVtYWluaW5nBnVpbnQzMgpsYXN0X2Jsb2NrFGJsb2NrX3RpbWVzdGFtcF90eXBlCnN3YXBtb2R1bGUAAwllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZghzd2FwdGlsZQAFBmh1Yl9pZAZ1aW50NjQEYV9neARpbnQ4BGFfZ3kEaW50OARiX2d4BGludDgEYl9neQRpbnQ4BHRhc2sACgR0eXBlBXVpbnQ4CGR1cmF0aW9uBnVpbnQzMgpjYW5jZWxhYmxlBXVpbnQ4C2Nvb3JkaW5hdGVzDGNvb3JkaW5hdGVzPwVjYXJnbwxjYXJnb19pdGVtW10MZW50aXR5dGFyZ2V0C2VudGl0eV9yZWY/C2VudGl0eWdyb3VwB3VpbnQ2ND8LZW5lcmd5X2Nvc3QHdWludDMyPwRob2xkB3VpbnQ2ND8OdGFyZ2V0X2l0ZW1faWQHdWludDE2Pwp0YXNrX2V2ZW50AAoKZXZlbnRfdHlwZQV1aW50OAVvd25lcgRuYW1lC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAp0YXNrX2luZGV4BnVpbnQzMgR0YXNrBHRhc2sJc3RhcnRzX2F0CnRpbWVfcG9pbnQMY29tcGxldGVzX2F0CnRpbWVfcG9pbnQKbmV3X2VuZXJneQd1aW50MzI/CGxhbmVfa2V5BXVpbnQ4DHRhc2tfcmVzdWx0cwABCGVudGl0aWVzEmVudGl0eV90YXNrX2luZm9bXRF0ZW1wbGF0ZV9tZXRhX3JvdwADB2l0ZW1faWQGdWludDE2BGtpbmQEbmFtZQ1kaXNwbGF5X2xhYmVsBnN0cmluZwd0cmFuc2l0AAUCaWQGdWludDY0AmF4BWludDY0AmF5BWludDY0AmJ4BWludDY0AmJ5BWludDY0BnRyYXZlbAAEAmlkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQIcmVjaGFyZ2UEYm9vbAl0eXBlc19yb3cABQJpZAZ1aW50NjQTZW50aXR5X3N1bW1hcnlfdHlwZQ5lbnRpdHlfc3VtbWFyeRBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnFnN0cmF0dW1fcmVtYWluaW5nX3R5cGURc3RyYXR1bV9yZW1haW5pbmcVbmZ0X2l0ZW1fcGF5bG9hZF90eXBlEG5mdF9pdGVtX3BheWxvYWQIdW5kZXBsb3kAAgdob3N0X2lkBnVpbnQ2NAl0YXJnZXRfaWQGdWludDY0BnVubG9hZAADAmlkBnVpbnQ2NAV0b19pZAZ1aW50NjQFaXRlbXMMY2FyZ29faXRlbVtdB3VwZ3JhZGUABQpidWlsZGVyX2lkBnVpbnQ2NAl0YXJnZXRfaWQGdWludDY0DnRhcmdldF9pdGVtX2lkBnVpbnQxNgZpbnB1dHMMY2FyZ29faXRlbVtdBHNsb3QGdWludDg/BHdhcnAAAwJpZAZ1aW50NjQBeAVpbnQ2NAF5BWludDY0CndhcnBfc3RhdHMAAQVyYW5nZQZ1aW50MzIEd2lwZQAADXdvcm1ob2xlX2luZm8AAwZjb29yZHMLY29vcmRpbmF0ZXMLaXNfd29ybWhvbGUEYm9vbAtkZXN0aW5hdGlvbgtjb29yZGluYXRlcw53cmFwY29uZmlnX3JvdwACB2ZlZV9wY3QGdWludDE2C2ZlZV9hY2NvdW50BG5hbWUMd3JhcGNvc3Rfcm93AAMJaXRlbV90eXBlBXVpbnQ4BHRpZXIFdWludDgGYW1vdW50BnVpbnQ2NGEAAFBRJypTMglhZGRtb2R1bGXHAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZGRtb2R1bGUKc3VtbWFyeTogJ0luc3RhbGwgYSBtb2R1bGUgaW50byBhIHNsb3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluc3RhbGwgYSBtb2R1bGUgZnJvbSBjYXJnbyBpbnRvIGEgbW9kdWxlIHNsb3Qgb24gYSBsaXZlIGVudGl0eSBvciBhIHBhY2tlZCBlbnRpdHkgaW4gY2FyZ28uIFRoZSBlbnRpdHkgbXVzdCBiZSBpZGxlIHdpdGggbm8gc2NoZWR1bGVkIHRhc2tzLiBUaGUgbW9kdWxlIHR5cGUgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldCBzbG90IHR5cGUuIFRoZSBtb2R1bGUgaXRlbSBpcyByZW1vdmVkIGZyb20gY2FyZ28gdXBvbiBpbnN0YWxsYXRpb24uAAAAWHc1UzIIYWRkbmV4dXOnAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZGRuZXh1cwpzdW1tYXJ5OiAnQWRkIGEgbmV4dXMgbG9jYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNyZWF0ZSBhIG5ldyBuZXh1cyBlbnRpdHkgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLiBOZXh1c2VzIGFyZSBvd25lZCBieSB0aGUgY29udHJhY3QgYW5kIHNlcnZlIGFzIGZpeGVkIGdhdGhlcmluZyBwb2ludHMgd2hlcmUgcGxheWVycyBjYW4gd3JhcCwgdW53cmFwLCBkZXBsb3ksIGFuZCBvdGhlcndpc2UgaW50ZXJhY3Qgd2l0aCBORlQtYmFja2VkIGFzc2V0cy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAUBGZS1MyCWFkZG9yYWNsZQAAAAAAgDRVPAVibGVuZPwCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGJsZW5kCnN1bW1hcnk6ICdCbGVuZCBjYXJnbyBzdGFja3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNvbWJpbmUgbXVsdGlwbGUgY2FyZ28gc3RhY2tzIG9mIHRoZSBzYW1lIGl0ZW0gdHlwZSBpbnRvIGEgc2luZ2xlIHN0YWNrIHdpdGggbmV3IGJsZW5kZWQgc3RhdHMuIEFsbCBpbnB1dCBzdGFja3MgbXVzdCBzaGFyZSB0aGUgc2FtZSBpdGVtIGlkLiBUaGUgb3V0cHV0IHN0YWNrIGhhcyB0aGUgY29tYmluZWQgcXVhbnRpdHkgb2YgYWxsIGlucHV0cy4AAMg01hSdPglidWlsZHBsb3QAAAAAAESFpkEGY2FuY2VswgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2FuY2VsCnN1bW1hcnk6ICdDYW5jZWwgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYW5jZWwgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGFza3MgZnJvbSB0aGUgZW5kIG9mIGFuIGVudGl0eSdzIHNjaGVkdWxlLiBUYXNrcyB0aGF0IGFyZSBpbW11dGFibGUgYW5kIGluIHByb2dyZXNzIGNhbm5vdCBiZSBjYW5jZWxsZWQuAADINFbpTEQJY2xhaW1wbG90AHBVviZj6UxEDGNsYWltc3RhcnRlcgAAAKgb32lURAljbGVhbnJzdnDsAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjbGVhbnJzdnAKc3VtbWFyeTogJ0NsZWFuIHVwIHBhc3QgZXBvY2ggcmVzZXJ2ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVyYXNlIHJlc2VydmUgdGFibGUgcm93cyBmcm9tIGEgcGFzdCBlcG9jaC4gQ2Fubm90IGNsZWFuIHRoZSBjdXJyZW50IG9yIGZ1dHVyZSBlcG9jaHMuIFRoZSBtYXhfcm93cyBwYXJhbWV0ZXIgY2FwcyB0aGUgbnVtYmVyIG9mIHJvd3MgZXJhc2VkIHBlciBjYWxsIHRvIGxpbWl0IENQVSB1c2FnZS4AgIrH5GtURApjbGVhcnRhYmxlvgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYXJ0YWJsZQpzdW1tYXJ5OiAnREVCVUc6IGNsZWFydGFibGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAGQnJUUGY29tbWl07AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY29tbWl0CnN1bW1hcnk6ICdTZXQgY29tbWl0IHZhbHVlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTZXQgdGhlIGluaXRpYWwgY29tbWl0IHZhbHVlIGR1cmluZyBnYW1lIGluaXRpYWxpemF0aW9uLgAAYDQytyZFCWNvbmZpZ2xvZ90CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbmZpZ2xvZwpzdW1tYXJ5OiAnTG9nIGdhbWUgY29uZmlndXJhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIHRoYXQgbG9ncyB0aGUgY3VycmVudCBnYW1lIGNvbmZpZ3VyYXRpb24uIENhbGxlZCBpbmxpbmUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdG8gYnJvYWRjYXN0IGNvbmZpZyB2aWEgYWN0aW9uIHRyYWNlcy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAACAvMxFBWNyYWZ0yAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY3JhZnQKc3VtbWFyeTogJ0NyYWZ0IGl0ZW1zIGZyb20gYSByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRyYW5zZm9ybSBjYXJnbyBpdGVtcyBpbnRvIGEgbmV3IGl0ZW0gdXNpbmcgYSByZWNpcGUuIFRoZSBlbnRpdHkgbXVzdCBoYXZlIGEgY3JhZnRlciBtb2R1bGUgaW5zdGFsbGVkLiBDb25zdW1lcyBlbmVyZ3kgYW5kIHNjaGVkdWxlcyBhIGNyYWZ0aW5nIHRhc2sgd2l0aCBkdXJhdGlvbiBiYXNlZCBvbiB0b3RhbCBpbnB1dCBtYXNzIGFuZCBjcmFmdGVyIHNwZWVkLiBJbnB1dCBxdWFudGl0aWVzIG11c3QgZXhhY3RseSBtYXRjaCB0aGUgcmVjaXBlIHJlcXVpcmVtZW50cy4AAAANu0ilSghkZW1vbGlzaPEDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlbW9saXNoCnN1bW1hcnk6ICdEZW1vbGlzaCBhIHN0YXRpb25hcnkgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpEZWNvbW1pc3Npb24gYW4gZW50aXR5LCBlcmFzaW5nIGl0IGZyb20gdGhlIGdhbWUuIFRoZSBlbnRpdHkgbXVzdCBiZSBpZGxlLCBoYXZlIGVtcHR5IGNhcmdvLCBhbmQgaGF2ZSBubyBpbnN0YWxsZWQgbW9kdWxlcyAocmVtb3ZlIGVhY2ggdmlhIHJtbW9kdWxlIGZpcnN0KS4gU2NoZWR1bGVzIGEgZGVtb2xpc2ggdGFzayB0aGF0IGVyYXNlcyB0aGUgZW50aXR5IG9uIHJlc29sdXRpb24uIE9ubHkgdmFsaWQgZm9yIGVudGl0aWVzIHRoYXQgY2Fubm90IG1vdmU7IHVzZSB1bmRlcGxveSBvciB3cmFwZW50aXR5IGZvciB0aGUgcmVzdC4AAAAAeBqrSgZkZXBsb3nsAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBkZXBsb3kKc3VtbWFyeTogJ0RlcGxveSBhIHBhY2tlZCBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClVucGFjayBhIHBhY2tlZCBlbnRpdHkgaXRlbSAocGFja2VkIHNoaXAgb3IgcGFja2VkIGNvbnRhaW5lcikgZnJvbSBjYXJnbywgc2NoZWR1bGluZyBhIGRlcGxveSB0YXNrIHRoYXQgY3JlYXRlcyB0aGUgbmV3IGVudGl0eSBhdCB0aGUgZGVwbG95aW5nIGVudGl0eSdzIGxvY2F0aW9uIHVwb24gcmVzb2x1dGlvbi4AgM8uT4WwSgpkZXNjZW50aXR5yQMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVzY2VudGl0eQpzdW1tYXJ5OiAnRGVzY3JpYmUgYSBwYWNrZWQgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIHN0cmluZyBmb3IgYSBwYWNrZWQgZW50aXR5LCBkZXJpdmVkIGZyb20gdGhlIGVudGl0eSBpdGVtIGlkLCBodWxsIHN0YXRzLCBhbmQgdGhlIGxpc3Qgb2YgaW5zdGFsbGVkIG1vZHVsZSBpdGVtIGlkcyBhbmQgc3RhdHMuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgYW5kIE5GVCByZW5kZXJlcnMgdG8gZGlzcGxheSBwYWNrZWQgZW50aXRpZXMuAAAAAKh4zFQGZW5hYmxl3QEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZW5hYmxlCnN1bW1hcnk6ICdTZXQgZW5hYmxlZCBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRW5hYmxlIG9yIGRpc2FibGUgdGhpcyBnYW1lIG9mIFNoaXBsb2FkLoCxkZRdg7pbDGZpeGNhcmdvbWFzc5ADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGZpeGNhcmdvbWFzcwpzdW1tYXJ5OiAnREVCVUc6IHJlY29tcHV0ZSBlbnRpdHkgY2FyZ28gbWFzcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVjb21wdXRlIGFuZCByZXdyaXRlIGFuIGVudGl0eSdzIGNhcmdvIG1hc3MgZnJvbSBpdHMgY3VycmVudCBjYXJnby4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LiBBdmFpbGFibGUgZm9yIHJlcGFpcmluZyBkcmlmdCBiZXR3ZWVuIGNhY2hlZCBjYXJnbyBtYXNzIGFuZCB0aGUgdHJ1ZSBtYXNzIGRlcml2ZWQgZnJvbSBjYXJnbyByb3dzLgCiUVtdhS5dC2ZvcmNlcmV2ZWFsvgQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZm9yY2VyZXZlYWwKc3VtbWFyeTogJ0RFQlVHOiBmb3JjZS1maW5hbGl6ZSBhbiBlcG9jaCBmcm9tIGV4aXN0aW5nIHJldmVhbHMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkZpbmFsaXplIGEgc3R1Y2sgZXBvY2ggYnkgY29tcHV0aW5nIGl0cyBzZWVkIGZyb20gdGhlIHJldmVhbHMgYWxyZWFkeSBzdWJtaXR0ZWQsIHdpdGhvdXQgd2FpdGluZyBmb3IgdGhlIGNvbmZpZ3VyZWQgdGhyZXNob2xkLiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuIFRoZSBzZWVkIGlzIGRlcml2ZWQgc29sZWx5IGZyb20gdGhlIHByZS1pbWFnZS1sb2NrZWQgcmV2ZWFscyBhbHJlYWR5IG9uIGNoYWluOyBubyBhZG1pbi1zdXBwbGllZCBlbnRyb3B5IGlzIGludHJvZHVjZWQuIFVzZWQgdG8gdW5ibG9jayBlcG9jaCBwcm9ncmVzc2lvbiB3aGVuIHRoZSB0aHJlc2hvbGQgY2Fubm90IG90aGVyd2lzZSBiZSBtZXQuAAAAAFzVsmEGZ2F0aGVylwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2F0aGVyCnN1bW1hcnk6ICdHYXRoZXIgcmVzb3VyY2VzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpHYXRoZXIgcmVzb3VyY2VzIGF0IHRoZSBzaGlwJ3MgY3VycmVudCBsb2NhdGlvbi4gT25seSB3b3JrcyBhdCBnYXRoZXJhYmxlIGxvY2F0aW9uIHR5cGVzLiBTY2hlZHVsZXMgYSBnYXRoZXIgdGFzayB0aGF0IGNvbnN1bWVzIGVuZXJneSBhbmQgeWllbGRzIGNhcmdvIGJhc2VkIG9uIHRoZSBzaGlwJ3MgZ2F0aGVyZXIgc3RhdHMgYW5kIHRoZSBsb2NhdGlvbidzIHJlc291cmNlIGNvbXBvc2l0aW9uLpCVigs7rKZiDGdlbmVzaXNmbGVldKkELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdlbmVzaXNmbGVldApzdW1tYXJ5OiAnTWludCB0aGUgb25lLXRpbWUgZ2VuZXNpcyBmbGVldCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRW1wbGFjZSB0aGUgb25lLXRpbWUgZ2VuZXNpcyBmbGVldDogYSBjYWxsZXItc3VwcGxpZWQgc2V0IG9mIGVudGl0aWVzIChzaGlwcywgc3RydWN0dXJlcywgYW5kIGNvbnRhaW5lcnMpIHdyaXR0ZW4gdG8gdGhlIHdvcmxkIGFzLWlzLiBWYWxpZCBvbmx5IGR1cmluZyB0aGUgcHJlLWdlbmVzaXMgd2luZG93LCBiZWZvcmUgZXBvY2ggMSBpcyBmaW5hbGl6ZWQuIFRoZSBzdXBwbGllZCBlbnRpdHkgaWRzIGFyZSBob25vcmVkIGFuZCB0aGUgaWQgc2VxdWVuY2UgaXMgYWR2YW5jZWQgcGFzdCB0aGVtOyBpZCAwIGlzIHJlc2VydmVkIGZvciB0aGUgR2VuZXNpcyBOZXh1cy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgDAVRnriLJiCmdldGNsdXN0ZXIAAABgbk2KsmIJZ2V0Y29uZmlnygItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0Y29uZmlnCnN1bW1hcnk6ICdHZXQgZ2FtZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSBnYW1lIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIGRlZmF1bHQgZW50aXR5IHN0YXRzIGZvciB3YXJlaG91c2VzIGFuZCBjb250YWluZXJzLCBhbmQgdGhlIGZ1bGwgaXRlbSBkZWZpbml0aW9ucyB0YWJsZS4AQHaYVpWyYgpnZXRkZXBvc2l0AAAUmiZjl7JiC2dldGRpc3RhbmNlAABUPI65qLJiC2dldGVsaWdpYmxlyAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0ZWxpZ2libGUKc3VtbWFyeTogJ0dldCBlbGlnaWJsZSByZXNvdXJjZSBpdGVtIElEcyBhdCBhIGxvY2F0aW9uIGFuZCBzdHJhdHVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgbGlzdCBvZiByZXNvdXJjZSBpdGVtIElEcyBlbGlnaWJsZSB0byBiZSBnYXRoZXJlZCBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgYW5kIHN0cmF0dW0gZGVwdGguIEl0ZW1zIGFyZSBnYXRlZCBieSBib3RoIHRoZSBsb2NhdGlvbidzIHJlc291cmNlIHByb2ZpbGUgYW5kIHRoZSBkZXB0aCB0aHJlc2hvbGQgZm9yIGVhY2ggdGllci4AAMAR5amyYglnZXRlbnRjbHOMAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRlbnRjbHMKc3VtbWFyeTogJ0dldCBlbnRpdHkgY2xhc3MgZW51bSB2YWx1ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBlbnRpdHkgY2xhc3MgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAoT3JiaXRhbFZlc3NlbCwgUGxhbmV0YXJ5U3RydWN0dXJlKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgZW50aXR5IGNsYXNzIGlkZW50aWZpZXJzLgCwctnlqbJiC2dldGVudGl0aWVzpAItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0ZW50aXRpZXMKc3VtbWFyeTogJ0dldCBhbGwgZW50aXRpZXMgZm9yIGEgcGxheWVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXR1cm5zIGZ1bGwgZW50aXR5IGluZm8gZm9yIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllci4gT3B0aW9uYWxseSBmaWx0ZXIgYnkgZW50aXR5IHR5cGUuAADw2eWpsmIJZ2V0ZW50aXR5ogItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0ZW50aXR5CnN1bW1hcnk6ICdHZXQgZW50aXR5IHN0YXRlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIGFuIGVudGl0eSBpbmNsdWRpbmcgaWRlbnRpdHksIGNhcmdvLCBzY2hlZHVsZSBzdGF0ZSwgYW5kIHR5cGUtc3BlY2lmaWMgZmllbGRzLpCnuzVTurJiDGdldGZvb3RwcmludAAATDZJquyyYgtnZXRpdGVtZGF0YagDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1kYXRhCnN1bW1hcnk6ICdHZXQgZnVsbCBpdGVtIGNhdGFsb2cnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBjb21wbGV0ZSBpdGVtIGNhdGFsb2cgYXMgdGhlIGNvbnRyYWN0IHNlZXMgaXQsIGluY2x1ZGluZyB0eXBlLCBzdWJ0eXBlLCB0aWVyLCBtYXNzLCBhbmQgb3RoZXIgc3RhdGljIG1ldGFkYXRhLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBjbGllbnRzIHRvIG1pcnJvciB0aGUgY29udHJhY3QncyBpdGVtIGRlZmluaXRpb25zLgAATk6q7LJiCmdldGl0ZW1pZHOGAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtaWRzCnN1bW1hcnk6ICdHZXQgaXRlbSBpZCB0byBuYW1lIG1hcHBpbmdzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBtYXBwaW5nIG9mIGl0ZW0gaWQgY29uc3RhbnRzIHRvIHRoZWlyIGNhbm9uaWNhbCBzdHJpbmcgbmFtZXMuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gcmVzb2x2ZSBudW1lcmljIGl0ZW0gaWRzIHRvIGh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXJzLgAAAFiq7LJiCGdldGl0ZW1zmgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXMKc3VtbWFyeTogJ0dldCBhbGwgYXZhaWxhYmxlIGl0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGEgbGlzdCBvZiBhbGwgaXRlbXMgaW4gdGhlIGdhbWUgaW5jbHVkaW5nIHRoZWlyIGlkLCBiYXNlIHByaWNlLCBhbmQgbWFzcy4AVPVZquyyYgtnZXRpdGVtdHlwZQCAVfVZquyyYgxnZXRpdGVtdHlwZXOIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtdHlwZXMKc3VtbWFyeTogJ0dldCBpdGVtIHR5cGUgZW51bSB2YWx1ZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBmdWxsIHNldCBvZiBpdGVtIHR5cGUgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAocmVzb3VyY2UsIGNvbXBvbmVudCwgbW9kdWxlLCBlbnRpdHkpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRlY29kZSBpdGVtIHR5cGUgaWRlbnRpZmllcnMuAExWMk0Hs2ILZ2V0a2luZG1ldGH4Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRraW5kbWV0YQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBraW5kIG1ldGFkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZW50aXR5IGtpbmQgcmVnaXN0cnkgYW5kIHRlbXBsYXRlIHJlZ2lzdHJ5LCBpbmNsdWRpbmcgZWFjaCBraW5kJ3MgY2xhc3NpZmljYXRpb24sIGNhcGFiaWxpdHkgZmxhZ3MsIFotY29vcmRpbmF0ZSwgYW5kIGRlZmF1bHQgbGFiZWwsIHBsdXMgdGhlIG1hcHBpbmcgb2YgZW50aXR5IGl0ZW0gaWRzIHRvIGtpbmRzIHdpdGggZGlzcGxheSBsYWJlbHMuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gaW50ZXJwcmV0IGVudGl0eSBraW5kcyBhbmQgY2FwYWJpbGl0aWVzLgAmddkgGrNiC2dldGxvY2F0aW9u4gItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bG9jYXRpb24Kc3VtbWFyeTogJ0dldCBsb2NhdGlvbiBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIGxvY2F0aW9uIGluY2x1ZGluZyB3aGV0aGVyIGEgc3lzdGVtIGV4aXN0cywgYW5kIGZvciBlYWNoIGl0ZW06IHByaWNlLCBzdXBwbHksIHJhcml0eSBtdWx0aXBsaWVyLCBhbmQgbG9jYXRpb24gbXVsdGlwbGllci4AgMkmIRqzYgpnZXRsb2NkYXRh/gItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bG9jZGF0YQpzdW1tYXJ5OiAnR2V0IGRlcml2ZWQgbG9jYXRpb24gZGF0YScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBkZXJpdmVkIGxvY2F0aW9uIGRhdGEgaW5jbHVkaW5nIHN0YXRpYyBwcm9wZXJ0aWVzICh0eXBlLCBkaWZmaWN1bHR5LCBzZWVkcykgZnJvbSB0aGUgZ2FtZSBzZWVkIGFuZCBlcG9jaC1zcGVjaWZpYyBwcm9wZXJ0aWVzIChhY3RpdmUsIHNlZWRzKSBmcm9tIHRoZSBjdXJyZW50IGVwb2NoIHNlZWQuALCqPicqs2ILZ2V0bW9kdHlwZXPWAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRtb2R0eXBlcwpzdW1tYXJ5OiAnR2V0IG1vZHVsZSB0eXBlIGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgbW9kdWxlIHR5cGUgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAoYW55LCBlbmdpbmUsIGdlbmVyYXRvciwgZ2F0aGVyZXIsIGxvYWRlciwgd2FycCwgY3JhZnRlciwgbGF1bmNoZXIsIHN0b3JhZ2UsIGhhdWxlcikuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGVjb2RlIG1vZHVsZSBzdWJ0eXBlIGlkZW50aWZpZXJzIGFuZCBzbG90IGNvbXBhdGliaWxpdHkuAABWUScqs2IKZ2V0bW9kdWxlc4ADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG1vZHVsZXMKc3VtbWFyeTogJ0dldCBhbGwgbW9kdWxlIGl0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGNsYXNzaWZpZWQgYXMgbW9kdWxlcywgaW5jbHVkaW5nIGVhY2ggbW9kdWxlJ3MgaWQsIG1hc3MsIHN1YnR5cGUsIGFuZCB0aWVyLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGVudW1lcmF0ZSBpbnN0YWxsYWJsZSBlcXVpcG1lbnQuAADw5xo1s2IJZ2V0bmVhcmJ5ygMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bmVhcmJ5CnN1bW1hcnk6ICdHZXQgbmVhcmJ5IHJlYWNoYWJsZSBzeXN0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIG5lYXJieSBzeXN0ZW1zIHJlYWNoYWJsZSBieSBhbiBlbnRpdHkgZnJvbSBpdHMgcHJvamVjdGVkIGxvY2F0aW9uLiBSZXR1cm5zIGN1cnJlbnQgc3RhdGUgKHdpdGggY29tcGxldGVkIHRhc2tzIHJlc29sdmVkKSwgcHJvamVjdGVkIHN0YXRlIChhZnRlciBhbGwgc2NoZWR1bGVkIHRhc2tzKSwgYW5kIGEgbGlzdCBvZiByZWFjaGFibGUgc3lzdGVtcyB3aXRoIGRpc3RhbmNlLCBlbmVyZ3kgY29zdCwgYW5kIGZsaWdodCB0aW1lLgCAwubkNbNiCmdldG5mdGJhc2UAAABd0+U1s2IKZ2V0bmZ0aW5mb/ADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5mdGluZm8Kc3VtbWFyeTogJ0dldCBORlQgc2NoZW1hIGFuZCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgQXRvbWljQXNzZXRzIHNjaGVtYXMgYW5kIHRlbXBsYXRlcyB0aGUgZ2FtZSBjb250cmFjdCBleHBlY3RzLCBwbHVzIHRoZSBjdXJyZW50IGBpdGVtX2lkIOKGkiAodGVtcGxhdGVfaWQsIHNjaGVtYV9uYW1lKWAgbWFwcGluZyBzdG9yZWQgaW4gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHN5bmMgYXRvbWljYXNzZXRzIHN0YXRlIHdpdGggdGhlIGNvbnRyYWN0LgAAuMqbWLNiCWdldHBsYXllcv0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHBsYXllcgpzdW1tYXJ5OiAnR2V0IHBsYXllciBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHBsYXllciBpbmNsdWRpbmcgYmFsYW5jZSwgZGVidCwgbmV0d29ydGgsIGVudGl0eSBjb3VudHMsIGFuZCBwcmljaW5nIGZvciBuZXh0IHB1cmNoYXNlcy4gUmV0dXJucyBpc19wbGF5ZXI9ZmFsc2UgaWYgdGhlIGFjY291bnQgaGFzIG5vdCBqb2luZWQgdGhlIGdhbWUuoLLJ+NFbs2IMZ2V0cHJvanN0YXRlywMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cHJvanN0YXRlCnN1bW1hcnk6ICdHZXQgcHJvamVjdGVkIGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHByb2plY3RlZCBzdGF0ZSBvZiBhbiBlbnRpdHkgYWZ0ZXIgYXBwbHlpbmcgdGhlIG5leHQgdGFza19jb3VudCBzY2hlZHVsZWQgdGFza3MgKG9yIGFsbCB0YXNrcyBpZiB0YXNrX2NvdW50IGlzIG9taXR0ZWQpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHByZXZpZXcgdGhlIHJlc3VsdCBvZiBhbiBlbnRpdHkncyBzY2hlZHVsZSB3aXRob3V0IHJlc29sdmluZyBvbi1jaGFpbi4AAFDVIXWzYglnZXRyZWNpcGWmAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZWNpcGUKc3VtbWFyeTogJ0dldCBhIHNpbmdsZSBjcmFmdGluZyByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSByZWNpcGUgd2hvc2Ugb3V0cHV0IG1hdGNoZXMgdGhlIGdpdmVuIGl0ZW0gaWQsIGluY2x1ZGluZyBpdHMgaW5wdXRzLCBibGVuZCB3ZWlnaHRzLCBzdGF0IHNsb3RzLCBhbmQgcmVzb2x2ZWQgaXRlbSBtYXNzIGluZm8uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGlzcGxheSBjcmFmdGluZyByZXF1aXJlbWVudHMuAABW1SF1s2IKZ2V0cmVjaXBlc6wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4AAM4GYXWzYgpnZXRyZXNjYXRzngMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzY2F0cwpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIGNhdGVnb3J5IGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAob3JlLCBnYXMsIHJlZ29saXRoLCBiaW9tYXNzLCBjcnlzdGFsKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgcmVzb3VyY2Ugc3VidHlwZSBpZGVudGlmaWVycy4AsNpXYXWzYgtnZXRyZXNlcnZlc/wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc2VydmVzCnN1bW1hcnk6ICdHZXQgY3VycmVudCByZXNlcnZlIG1vZGlmaWNhdGlvbnMgYXQgYSBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyB0aGUgY2hhaW4ncyBtb2RpZmljYXRpb25zIHRvIGRlcml2ZWQgcmVzZXJ2ZXMgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGUgZm9yIHRoZSBjdXJyZW50IGVwb2NoIGFzIGEgbGlzdCBvZiB7c3RyYXR1bSwgcmVtYWluaW5nfSBwYWlycy4gU3RyYXRhIG5vdCBwcmVzZW50IGluIHRoZSByZXNwb25zZSB1c2UgdGhlaXIgZGVyaXZlZCBpbml0aWFsIHJlc2VydmUuIENvbXBvc2Ugd2l0aCBTREsgZGVyaXZhdGlvbiB0byBnZXQgdGhlIGZ1bGwgcGVyLWxvY2F0aW9uIHN0cmF0YSB2aWV3LoAVuppidbNiDGdldHJlc291cmNlc4cDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc291cmNlcwpzdW1tYXJ5OiAnR2V0IGFsbCByZXNvdXJjZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIHJlc291cmNlcywgaW5jbHVkaW5nIGVhY2ggcmVzb3VyY2UncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGdhdGhlcmFibGUgbWF0ZXJpYWxzLgAAADjTiLNiCGdldHNsb3RzuwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c2xvdHMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc2xvdCBsYXlvdXRzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgbW9kdWxlIHNsb3QgbGF5b3V0IGZvciBldmVyeSBlbnRpdHkgaXRlbSB0eXBlLCBsaXN0aW5nIHRoZSBvcmRlcmVkIHNsb3QgdHlwZXMgYXZhaWxhYmxlIGZvciBtb2R1bGUgaW5zdGFsbGF0aW9uLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGRldGVybWluZSB3aGljaCBtb2R1bGUgdHlwZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBhIGdpdmVuIGVudGl0eSBodWxsLgCA1NncjLNiCmdldHN0cmF0dW3SAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdHJhdHVtCnN1bW1hcnk6ICdHZXQgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHJlc291cmNlIHN0cmF0dW0gZGF0YSBmb3IgYSBzcGVjaWZpYyBkZXB0aCBsYXllciBhdCBhIGNvb3JkaW5hdGUsIGluY2x1ZGluZyB0aGUgc3RyYXR1bSBzZWVkIGluZm8gYW5kIGRlcml2ZWQgcmVzb3VyY2Ugc3RhdHMugJW7RkqNs2IMZ2V0c3VtbWFyaWVz6AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0c3VtbWFyaWVzCnN1bW1hcnk6ICdHZXQgZW50aXR5IHN1bW1hcmllcyBmb3IgYSBwbGF5ZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJldHVybnMgbGlnaHR3ZWlnaHQgc3VtbWFyaWVzIG9mIGFsbCBlbnRpdGllcyBvd25lZCBieSBhIHBsYXllciBpbmNsdWRpbmcgdHlwZSwgaWQsIG93bmVyLCBuYW1lLCBsb2NhdGlvbiwgYW5kIGlkbGUgc3RhdHVzLiBPcHRpb25hbGx5IGZpbHRlciBieSBlbnRpdHkgdHlwZS4AVKRNXsqzYgtnZXR3b3JtaG9sZQCQHZ7m5qrpZQxncm91cHRyYW5zaXQAAKLa5uaq6WULZ3JvdXB0cmF2ZWyaBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBncm91cHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBtdWx0aXBsZSBlbnRpdGllcyB0b2dldGhlcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhdGUgZ3JvdXAgdHJhdmVsIGZvciBtdWx0aXBsZSBlbnRpdGllcyB0byBhIGRlc3RpbmF0aW9uLiBBbGwgZW50aXRpZXMgbXVzdCBiZSBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhbmQgb3duZWQgYnkgdGhlIGNhbGxlci4gQXQgbGVhc3Qgb25lIGVudGl0eSB3aXRoIGVuZ2luZXMgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aHJ1c3QuIEZsaWdodCBkdXJhdGlvbiBpcyBjYWxjdWxhdGVkIGZyb20gY29tYmluZWQgdGhydXN0IGFuZCB0b3RhbCBtYXNzIG9mIGFsbCBlbnRpdGllcy4gQ3JlYXRlcyBhbiBlbnRpdHlncm91cCBmb3IgYXRvbWljIHJlc29sdXRpb24gYW5kIGNhbmNlbGxhdGlvbi4AAAAAANCwaQRoYXNo+AEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogaGFzaApzdW1tYXJ5OiAnQ2FsY3VsYXRlIHNoYTI1NiBoYXNoJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYWxjdWxhdGVzIHRoZSBzaGEyNTYgaGFzaCBvZiBhIHN0cmluZyBiYXNlZCB1c2luZyB0aGUgZ2FtZSBzZWVkLgAAAECE0rBpB2hhc2g1MTL7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoNTEyCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhNTEyIGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTUxMiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuACi7BuVLq3QLaW1wb3J0Y2FyZ28A4LPLU+VLq3QMaW1wb3J0ZW50aXR5AACqppflS6t0C2ltcG9ydGdyb3VwAHCVN7HmS6t0DGltcG9ydHBsYXllcgC6r8Lq5kurdA1pbXBvcnRyZXNlcnZlAABUNhnnS6t0C2ltcG9ydHN0YXRlAAAAAAAAMB19BGpvaW7EAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBqb2luCnN1bW1hcnk6ICdKb2luIGEgZ2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSm9pbiBhIGdhbWUgb2YgU2hpcGxvYWQAAAAANDS1iQZsYXVuY2gAAAAAAACQDI0EbG9hZAAAAAAquqw2lQhtb3ZldGlsZQAAAIhXM+nymgluZnRpbWd1cmyyAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBuZnRpbWd1cmwKc3VtbWFyeTogJ0dldCBORlQgaW1hZ2UgVVJMIGZvciBhIGNhcmdvIGl0ZW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBpbWFnZSBVUkwgdGhlIGNvbnRyYWN0IGVtaXRzIGZvciBhIGdpdmVuIGNhcmdvIGl0ZW0sIG9wdGlvbmFsbHkgc2NvcGVkIHRvIGEgbG9jYXRpb24uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgYW5kIE5GVCByZW5kZXJlcnMgdG8gZmV0Y2ggdGhlIGNhbm9uaWNhbCBhcnR3b3JrIGZvciBhbiBpdGVtIG9yIHBhY2tlZCBlbnRpdHkuAAAAAPjlMp0Gbm90aWZ5igMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogbm90aWZ5CnN1bW1hcnk6ICdUYXNrIGxpZmVjeWNsZSBub3RpZmljYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IG5vdGlmaWVzIGVudGl0eSBvd25lcnMgb2YgdGFzayBsaWZlY3ljbGUgZXZlbnRzIChyZXNvbHZlZCwgY2FuY2VsbGVkKS4gQ2FsbGVkIGlubGluZSB3aGVuIHRhc2tzIGNoYW5nZSBzdGF0ZS4gVXNlcyByZXF1aXJlX3JlY2lwaWVudCB0byBlbmFibGUgb2ZmLWNoYWluIG1vbml0b3JpbmcgdmlhIGFjdGlvbiB0cmFjZXMuAABl1yCFTKwKcGxhY2VjYXJnb8kELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHBsYWNlY2FyZ28Kc3VtbWFyeTogJ1Jlc3RvcmUgTkZUIGNhcmdvIG9udG8gYSBob3N0IGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIGNhbGxlZCBpbmxpbmUgYnkgdGhlIHBsYXRmb3JtIGNvbnRyYWN0IG9ubHkuIFJlc3RvcmVzIHRoZSBjYXJnbyByZWNvcmRlZCBpbiBhbiB1bndyYXBwZWQgTkZUIG9udG8gYSBob3N0IGVudGl0eS4gVmFsaWRhdGVzIGhvc3Qgb3duZXJzaGlwLCBsb2FkZXJzLCBhbmQgcmVtYWluaW5nIGNhcGFjaXR5LCBkZXNlcmlhbGl6ZXMgdGhlIE5GVCdzIGl0ZW0gZGF0YSwgYW5kIGFwcGVuZHMgYW4gdW53cmFwIHRhc2sgdG8gZGVsaXZlciB0aGUgY2FyZ28gdG8gdGhlIGhvc3QuIFRoZSBwbGF0Zm9ybSBjb250cmFjdCBjcmVkaXRzIHRoZSBkZXBvc2l0IHJlZnVuZCBhbmQgYnVybnMgdGhlIGFzc2V0LiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAHx2eSqFTKwLcGxhY2VlbnRpdHnABC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBwbGFjZWVudGl0eQpzdW1tYXJ5OiAnTWF0ZXJpYWxpemUgYSBwYWNrZWQtZW50aXR5IE5GVCBhcyBhIGxpdmUgZW50aXR5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gY2FsbGVkIGlubGluZSBieSB0aGUgcGxhdGZvcm0gY29udHJhY3Qgb25seS4gRW1wbGFjZXMgYSBsaXZlIG9yYml0YWwgdmVzc2VsIChzaGlwIG9yIGNvbnRhaW5lcikgZnJvbSBpdHMgcGFja2VkLWVudGl0eSBORlQgZGF0YSBhdCB0aGUgcmVjb3JkZWQgd3JhcCBvcmlnaW4sIHRoZW4gcXVldWVzIHRyYXZlbCBhbmQgcmVjaGFyZ2UgdGFza3MgdG8gZGVsaXZlciBpdCB0byB0aGUgdGFyZ2V0IG5leHVzIGF0IGZ1bGwgZW5lcmd5LiBUaGUgcGxhdGZvcm0gY29udHJhY3QgY3JlZGl0cyB0aGUgZGVwb3NpdCByZWZ1bmQgYW5kIGJ1cm5zIHRoZSBhc3NldC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAIpd05C6CHJlY2hhcmdlzQItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVjaGFyZ2UKc3VtbWFyeTogJ1JlY2hhcmdlIHNoaXAgZW5lcmd5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTY2hlZHVsZSBhIHJlY2hhcmdlIHRhc2sgZm9yIGFuIGVudGl0eSB0byByZXN0b3JlIGVuZXJneSB0byBmdWxsIGNhcGFjaXR5LiBUaGUgcmVjaGFyZ2UgZHVyYXRpb24gZGVwZW5kcyBvbiBjdXJyZW50IGVuZXJneSBsZXZlbCBhbmQgcmVjaGFyZ2UgcmF0ZS7gs8tTNXyXugxyZWZyc2hlbnRpdHm4Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiByZWZyc2hlbnRpdHkKc3VtbWFyeTogJ1JlZnJlc2ggZGVyaXZlZCBlbnRpdHkgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlY29tcHV0ZSBkZXJpdmVkIGZpZWxkcyBvbiBhbiBlbnRpdHkgZnJvbSBpdHMgY3VycmVudCBjYXJnbyBhbmQgbW9kdWxlcywgcmVmcmVzaGluZyBjYXBhYmlsaXR5IHN0YXRzIGFuZCBjYXJnbyBtYXNzLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVXNlZCB0byByZWNvbmNpbGUgZGVyaXZlZCBzdGF0ZSBhZnRlciBkYXRhIG1pZ3JhdGlvbnMgb3IgY29udHJhY3QgdXBncmFkZXMuoCIyl6pNpboMcmVtb3Zlb3JhY2xlAAAAAAAoaaa6BnJlbmFtZQAAAABA7UixugdyZXNvbHZl0AMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVzb2x2ZQpzdW1tYXJ5OiAnQ29tcGxldGUgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXNvbHZlIGNvbXBsZXRlZCB0YXNrcyBpbiBhbiBlbnRpdHkncyBzY2hlZHVsZSwgYXBwbHlpbmcgdGhlaXIgZWZmZWN0cyAocmVjaGFyZ2UgZW5lcmd5LCB1cGRhdGUgbG9jYXRpb24sIGxvYWQvdW5sb2FkIGNhcmdvKS4gSWYgY291bnQgaXMgc3BlY2lmaWVkLCByZXNvbHZlIGV4YWN0bHkgdGhhdCBtYW55IHRhc2tzOyBvdGhlcndpc2UgcmVzb2x2ZSBhbGwgY29tcGxldGVkIHRhc2tzLiBGYWlscyBpZiBjb3VudCBleGNlZWRzIHRoZSBudW1iZXIgb2YgY29tcGxldGVkIHRhc2tzLgBAjEbtSLG6CnJlc29sdmVhbGwAAAAAAESjtroGcmV2ZWFsAAAAACrqRKW8CHJtbW9kdWxlvAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcm1tb2R1bGUKc3VtbWFyeTogJ1JlbW92ZSBhIG1vZHVsZSBmcm9tIGEgc2xvdCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVtb3ZlIGFuIGluc3RhbGxlZCBtb2R1bGUgZnJvbSBhIHNsb3Qgb24gYSBsaXZlIGVudGl0eSBvciBhIHBhY2tlZCBlbnRpdHkgaW4gY2FyZ28uIFRoZSBlbnRpdHkgbXVzdCBiZSBpZGxlIHdpdGggbm8gc2NoZWR1bGVkIHRhc2tzLiBUaGUgbW9kdWxlIGlzIHJldHVybmVkIHRvIGNhcmdvLiBGYWlscyBpZiB0aGUgZW50aXR5IGRvZXMgbm90IGhhdmUgZW5vdWdoIGNhcmdvIGNhcGFjaXR5IHRvIGhvbGQgdGhlIHJldHVybmVkIG1vZHVsZS4AAABsobymvAhybW5mdGNmZ6EDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJtbmZ0Y2ZnCnN1bW1hcnk6ICdSZW1vdmUgTkZUIHRlbXBsYXRlIG1hcHBpbmcgZm9yIGFuIGl0ZW0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlbW92ZSB0aGUgQXRvbWljQXNzZXRzIHRlbXBsYXRlIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBpZCBmcm9tIHRoZSBgbmZ0Y29uZmlnYCB0YWJsZS4gQWZ0ZXIgcmVtb3ZhbCB0aGUgaXRlbSBjYW4gbm8gbG9uZ2VyIGJlIHdyYXBwZWQgb3IgdW53cmFwcGVkIHVudGlsIGEgbmV3IG1hcHBpbmcgaXMgc2V0LiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAADA6VKKssIJc2V0Y29vcmRzAAAAYAvlNbPCCXNldG5mdGNmZ8QDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNldG5mdGNmZwpzdW1tYXJ5OiAnU2V0IE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpCaW5kIGFuIGl0ZW0gaWQgdG8gYW4gQXRvbWljQXNzZXRzIHRlbXBsYXRlIGlkIGFuZCBzY2hlbWEgbmFtZS4gVXNlZCB0byBjb25maWd1cmUgaG93IHRoZSBjb250cmFjdCBtaW50cyBhbmQgcmVjb2duaXplcyBORlRzIGZvciBhIGdpdmVuIGl0ZW0uIEluc2VydHMgYSBuZXcgbWFwcGluZyBpZiBvbmUgZG9lcyBub3QgZXhpc3QsIG9yIHVwZGF0ZXMgdGhlIGV4aXN0aW5nIG1hcHBpbmcuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS6QIm1Y3ZazwgxzZXR0aHJlc2hvbGQAADKmqJrLs8ILc2V0d3JhcGNvc3QAAIBSq5rLs8IKc2V0d3JhcGZlZQAAAKDsGsRpxglzdG93Y2FyZ2/VBS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzdG93Y2FyZ28Kc3VtbWFyeTogJ1Jlc2VydmUgYSBjYXJnbyBzdGFjayBmb3Igd3JhcHBpbmcgaW50byBhbiBORlQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiBjYWxsZWQgaW5saW5lIGJ5IHRoZSBwbGF0Zm9ybSBjb250cmFjdCBvbmx5LiBSZXNlcnZlcyBhbmQgY29uc3VtZXMgYSBjYXJnbyBzdGFjayBvbiBhIGxpdmUgZW50aXR5IGZvciB3cmFwcGluZyBpbnRvIGFuIE5GVC4gVmFsaWRhdGVzIGVudGl0eSBvd25lcnNoaXAsIGxvYWRlcnMsIGFuZCBwcmVzZW5jZSBhdCB0aGUgbmV4dXMsIGFuZCBjb25maXJtcyB0aGUgdGFyZ2V0IGNhcmdvIHN0YWNrIGlzIGF2YWlsYWJsZSBhbmQgbm90IHJlc2VydmVkIGJ5IGEgcGVuZGluZyB0YXNrLiBDb21wdXRlcyB0aGUgd3JhcCBjb3N0IGFuZCBmZWUsIGRlYml0cyB0aGVtIGZyb20gdGhlIG93bmVyJ3MgcGxhdGZvcm0gZGVwb3NpdCBiYWxhbmNlLCBkZXJpdmVzIHRoZSBORlQncyBpbW11dGFibGUgZGF0YSwgYW5kIG1pbnRzIHRoZSBORlQgaW5saW5lIGFzIHRoZSBnYW1lIGNvbnRyYWN0IGJlZm9yZSBjb25zdW1pbmcgdGhlIGNhcmdvLiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAIDPLk/FacYKc3Rvd2VudGl0eZkFLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHN0b3dlbnRpdHkKc3VtbWFyeTogJ1Jlc2VydmUgYW4gZW50aXR5IGZvciB3cmFwcGluZyBpbnRvIGFuIE5GVCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIGNhbGxlZCBpbmxpbmUgYnkgdGhlIHBsYXRmb3JtIGNvbnRyYWN0IG9ubHkuIFJlc2VydmVzIGEgd2hvbGUgZW50aXR5IChzaGlwLCBjb250YWluZXIsIG9yIHBsYW5ldGFyeSBzdHJ1Y3R1cmUpIGZvciB3cmFwcGluZyBpbnRvIGFuIE5GVC4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBlbXB0eSBjYXJnbyBhbmQgbm8gc2NoZWR1bGVkIHRhc2tzLiBDb21wdXRlcyB0aGUgd3JhcCBjb3N0IGFuZCBmZWUsIGRlYml0cyB0aGVtIGZyb20gdGhlIG93bmVyJ3MgcGxhdGZvcm0gZGVwb3NpdCBiYWxhbmNlLCBkZXJpdmVzIHRoZSBlbnRpdHkgTkZUJ3MgaW1tdXRhYmxlIGRhdGEsIG1pbnRzIHRoZSBORlQgaW5saW5lIGFzIHRoZSBnYW1lIGNvbnRyYWN0LCBhbmQgZXJhc2VzIHRoZSBlbnRpdHkgZnJvbSB0aGUgd29ybGQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AgIo6UVkNxwpzd2FwbW9kdWxlAAAAACq6XA3HCHN3YXB0aWxlAAAAACA7PM3NB3RyYW5zaXQAAAAAAES1zc0GdHJhdmVs+wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIGEgc2hpcCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhdGUgdHJhdmVsIG9mIGFuIGVudGl0eSBmcm9tIGl0cyBjdXJyZW50IGxvY2F0aW9uIHRvIGEgbmV3IGRlc3RpbmF0aW9uLgAAAJ7GqtLUCHVuZGVwbG955wQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdW5kZXBsb3kKc3VtbWFyeTogJ1BhY2sgYSBkZXBsb3llZCBlbnRpdHkgaW50byBhIGhvc3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClBhY2sgYW4gZW50aXR5IGludG8gYSBob3N0IGVudGl0eSdzIGNhcmdvIGFzIGEgcGFja2VkLWVudGl0eSBpdGVtLiBIb3N0IGFuZCB0YXJnZXQgbXVzdCBzaGFyZSB0aGUgc2FtZSBvd25lciBhbmQgY29vcmRpbmF0ZXMsIHRoZSBob3N0IG11c3QgaGF2ZSBsb2FkZXJzIGFuZCBlbm91Z2ggY2FwYWNpdHkgZm9yIHRoZSBwYWNrZWQgbWFzcywgYW5kIHRoZSB0YXJnZXQgbXVzdCBiZSBpZGxlIHdpdGggZW1wdHkgY2FyZ28uIENyZWF0ZXMgYW4gZW50aXR5Z3JvdXAgYW5kIHNjaGVkdWxlcyB1bmRlcGxveSB0YXNrcyBvbiBib3RoIGVudGl0aWVzOyBvbiByZXNvbHV0aW9uIHRoZSB0YXJnZXQgaXMgZXJhc2VkIGFuZCB0aGUgcGFja2VkIGVudGl0eSBpcyBhZGRlZCB0byB0aGUgaG9zdCdzIGNhcmdvLiBJbnZlcnNlIG9mIGRlcGxveS4AAAAAJEPj1AZ1bmxvYWQAAAAAQCVzWdUHdXBncmFkZQAAAAAAAFCv4QR3YXJwnwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2FycApzdW1tYXJ5OiAnV2FycCB0byBhIGRlc3RpbmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YW50bHkgdGVsZXBvcnQgYW4gZW50aXR5IHRvIGEgZGVzdGluYXRpb24gc3lzdGVtLiBSZXF1aXJlcyB3YXJwIGNhcGFiaWxpdHksIGZ1bGwgZW5lcmd5LCBlbXB0eSBjYXJnbywgYW5kIGFuIGVtcHR5IHNjaGVkdWxlLiBUaGUgZGVzdGluYXRpb24gbXVzdCBiZSBhIHZhbGlkIHN5c3RlbSB3aXRoaW4gd2FycCByYW5nZS4gUmVzb2x2ZXMgaW1tZWRpYXRlbHkgYXMgYSB6ZXJvLWR1cmF0aW9uIHRhc2suAAAAAACgquMEd2lwZbIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGUKc3VtbWFyeTogJ0RFQlVHOiB3aXBlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLRIAAAAAAMquQQNpNjQAAAljYXJnb19yb3cAAAAAYOlMRANpNjQAAAljbGFpbV9yb3cAAADgqox1RANpNjQAAAtjbHVzdGVyX3JvdwAAAABkJyVFA2k2NAAACmNvbW1pdF9yb3cAAAAA+OzyVANpNjQAAAplbnRpdHlfcm93AKqml/ns8lQDaTY0AAAPZW50aXR5Z3JvdXBfcm93AACwCvvs8lQDaTY0AAAOZW50aXR5X3NlcV9yb3cAAAAAgIZoVQNpNjQAAAllcG9jaF9yb3cAAGBuTYrymgNpNjQAAA1uZnRjb25maWdfcm93AABgC6mIzKUDaTY0AAARb3JhY2xlX2NvbmZpZ19yb3cAAAAAq4jMpQNpNjQAAApvcmFjbGVfcm93AAAAAFzlTawDaTY0AAAKcGxheWVyX3JvdwAAAEDtq7C6A2k2NAAAC3Jlc2VydmVfcm93AAAAAESjtroDaTY0AAAKcmV2ZWFsX3JvdwAAAAAAlU3GA2k2NAAACXN0YXRlX3JvdwAAAAAArKrPA2k2NAAACXR5cGVzX3JvdwAAc2tSVM3lA2k2NAAADndyYXBjb25maWdfcm93AAAAGVNUzeUDaTY0AAAMd3JhcGNvc3Rfcm93ARFTaGlwbG9hZCAoU2VydmVyKRFTaGlwbG9hZCAoU2VydmVyKQAAAD8AAMg01hSdPgx0YXNrX3Jlc3VsdHMAAAAARIWmQQ5jYW5jZWxfcmVzdWx0cwAAyDRW6UxEDHRhc2tfcmVzdWx0cwAAAACAvMxFDHRhc2tfcmVzdWx0cwAAAA27SKVKDHRhc2tfcmVzdWx0cwAAAAB4GqtKDHRhc2tfcmVzdWx0cwCAzy5PhbBKBnN0cmluZwAAAABc1bJhDHRhc2tfcmVzdWx0cwDAVRnriLJiC2NsdXN0ZXJfcm93AABgbk2KsmILZ2FtZV9jb25maWcAQHaYVpWyYg5leHRlbmRlZF9hc3NldAAUmiZjl7JiBnVpbnQ2NABUPI65qLJiCHVpbnQxNltdAADAEeWpsmILZW51bV9yZXN1bHQAsHLZ5amyYg1lbnRpdHlfaW5mb1tdAADw2eWpsmILZW50aXR5X2luZm+Qp7s1U7qyYhBmb290cHJpbnRfcmVzdWx0AEw2SarssmIPaXRlbWRhdGFfcmVzdWx0AABOTqrssmIPaXRlbV9pZHNfcmVzdWx0AAAAWKrssmIKaXRlbXNfaW5mbwBU9Vmq7LJiBXVpbnQ4gFX1WarssmILZW51bV9yZXN1bHQATFYyTQezYhBraW5kX21ldGFfcmVzdWx0ACZ12SAas2INbG9jYXRpb25faW5mbwCAySYhGrNiEGxvY2F0aW9uX2Rlcml2ZWQAsKo+JyqzYgtlbnVtX3Jlc3VsdAAAVlEnKrNiDm1vZHVsZXNfcmVzdWx0AADw5xo1s2ILbmVhcmJ5X2luZm8AgMLm5DWzYghzdHJpbmdbXQAAXdPlNbNiDm5mdGluZm9fcmVzdWx0AAC4yptYs2ILcGxheWVyX2luZm+gssn40VuzYg9wcm9qZWN0ZWRfc3RhdGUAAFDVIXWzYg5yZWNpcGVzX3Jlc3VsdAAAVtUhdbNiDnJlY2lwZXNfcmVzdWx0AADOBmF1s2ILZW51bV9yZXN1bHQAsNpXYXWzYhNzdHJhdHVtX3JlbWFpbmluZ1tdgBW6mmJ1s2IQcmVzb3VyY2VzX3Jlc3VsdAAAADjTiLNiFWVudGl0eV9sYXlvdXRzX3Jlc3VsdACA1NncjLNiDHN0cmF0dW1fZGF0YYCVu0ZKjbNiEGVudGl0eV9zdW1tYXJ5W10AVKRNXsqzYg13b3JtaG9sZV9pbmZvkB2e5uaq6WUMdGFza19yZXN1bHRzAKLa5uaq6WUMdGFza19yZXN1bHRzAAAAAADQsGkLY2hlY2tzdW0yNTYAAABAhNKwaQtjaGVja3N1bTUxMgAAAAA0NLWJDHRhc2tfcmVzdWx0cwAAAAAAkAyNDHRhc2tfcmVzdWx0cwAAACq6rDaVDHRhc2tfcmVzdWx0cwAAiFcz6fKaBnN0cmluZwAAZdcghUysDHRhc2tfcmVzdWx0cwB8dnkqhUysDHRhc2tfcmVzdWx0cwAAAIpd05C6DHRhc2tfcmVzdWx0cwAAAEDtSLG6D3Jlc29sdmVfcmVzdWx0cwBAjEbtSLG6EnJlc29sdmVhbGxfcmVzdWx0cwAAoOwaxGnGDHRhc2tfcmVzdWx0cwCAzy5PxWnGDHRhc2tfcmVzdWx0cwAAACq6XA3HDHRhc2tfcmVzdWx0cwAAACA7PM3NDHRhc2tfcmVzdWx0cwAAAABEtc3NDHRhc2tfcmVzdWx0cwAAAJ7GqtLUDHRhc2tfcmVzdWx0cwAAAAAkQ+PUDHRhc2tfcmVzdWx0cwAAAEAlc1nVDHRhc2tfcmVzdWx0cwAAAAAAUK/hDHRhc2tfcmVzdWx0cw==');
443
+ const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDjWAQlhZGRtb2R1bGUABAllbnRpdHlfaWQGdWludDY0DG1vZHVsZV9pbmRleAV1aW50OAptb2R1bGVfcmVmCWNhcmdvX3JlZgp0YXJnZXRfcmVmCmNhcmdvX3JlZj8IYWRkbmV4dXMAAwpuZXh1c19uYW1lBnN0cmluZwF4BWludDY0AXkFaW50NjQJYWRkb3JhY2xlAAEJb3JhY2xlX2lkBG5hbWUFYmxlbmQAAgJpZAZ1aW50NjQGaW5wdXRzDGNhcmdvX2l0ZW1bXQxidWlsZGVyX2xhbmUABApzbG90X2luZGV4BXVpbnQ4BXNwZWVkBnVpbnQxNgVkcmFpbgZ1aW50MzIKb3V0cHV0X3BjdAZ1aW50MTYJYnVpbGRwbG90AAIKYnVpbGRlcl9pZAZ1aW50NjQHcGxvdF9pZAZ1aW50NjQGY2FuY2VsAAMCaWQGdWludDY0CGxhbmVfa2V5BXVpbnQ4BWNvdW50BnVpbnQ2NA5jYW5jZWxfcmVzdWx0cwAGCWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQ9jYW5jZWxsZWRfY291bnQFdWludDgQc2NoZWR1bGVfc3RhcnRlZAt0aW1lX3BvaW50PwtlbnRpdHlncm91cAd1aW50NjQ/DWdyb3VwX21lbWJlcnMWQl92ZWN0b3JfZW50aXR5X3JlZl9FPwljYW5jZWxqb2IAAgZqb2JfaWQGdWludDY0B3NoaXBfaWQGdWludDY0CmNhcmdvX2l0ZW0ABQdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhxdWFudGl0eQZ1aW50MzIJZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcmVmAAQHaXRlbV9pZAZ1aW50MTYFc3RhdHMGdWludDY0B21vZHVsZXMObW9kdWxlX2VudHJ5W10JZW50aXR5X2lkB3VpbnQ2ND8JY2FyZ29fcm93AAcCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdC3NlcXVlbmNlX2lkB3VpbnQ2ND8KY2FyZ29fdmlldwAGB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NAdtb2R1bGVzDm1vZHVsZV9lbnRyeVtdCHF1YW50aXR5BnVpbnQzMgJpZAZ1aW50NjQJZW50aXR5X2lkB3VpbnQ2ND8PY2l2aWNjb25maWdfcm93AAELY2l2aWNfb3duZXIEbmFtZQljbGFpbV9yb3cAAQVvd25lcgRuYW1lCGNsYWltam9iAAIGam9iX2lkBnVpbnQ2NAdzaGlwX2lkBnVpbnQ2NAljbGFpbXBsb3QAAwpidWlsZGVyX2lkBnVpbnQ2NA50YXJnZXRfaXRlbV9pZAZ1aW50MTYEc2xvdAxjbHVzdGVyX3Nsb3QMY2xhaW1zdGFydGVyAAEFb3duZXIEbmFtZQljbGVhbnJzdnAAAgVlcG9jaAZ1aW50NjQIbWF4X3Jvd3MGdWludDY0CmNsZWFydGFibGUAAwp0YWJsZV9uYW1lBG5hbWUFc2NvcGUFbmFtZT8IbWF4X3Jvd3MHdWludDY0PwxjbHVzdGVyX2NlbGwAAwJneARpbnQ4Amd5BGludDgGZW50aXR5BnVpbnQ2NAtjbHVzdGVyX3JvdwACBHJvb3QGdWludDY0BWNlbGxzDmNsdXN0ZXJfY2VsbFtdDGNsdXN0ZXJfc2xvdAADA2h1YgZ1aW50NjQCZ3gEaW50OAJneQRpbnQ4BmNvbW1pdAADCW9yYWNsZV9pZARuYW1lBWVwb2NoBnVpbnQ2NAZjb21taXQLY2hlY2tzdW0yNTYKY29tbWl0X3JvdwAEAmlkBnVpbnQ2NAVlcG9jaAZ1aW50NjQJb3JhY2xlX2lkBG5hbWUGY29tbWl0C2NoZWNrc3VtMjU2CWNvbmZpZ2xvZwABBmNvbmZpZwtnYW1lX2NvbmZpZwtjb29yZGluYXRlcwADAXgFaW50NjQBeQVpbnQ2NAF6B3VpbnQxNj8IY291cGxpbmcAAwtjb3VudGVycGFydAplbnRpdHlfcmVmBGhvbGQGdWludDY0BGtpbmQFdWludDgFY3JhZnQABgJpZAZ1aW50NjQJcmVjaXBlX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIGaW5wdXRzDGNhcmdvX2l0ZW1bXQZ0YXJnZXQHdWludDY0PwRzbG90BnVpbnQ4PwxjcmFmdGVyX2xhbmUABApzbG90X2luZGV4BXVpbnQ4BXNwZWVkBnVpbnQxNgVkcmFpbgZ1aW50MzIKb3V0cHV0X3BjdAZ1aW50MTYIY3JhZnRqb2IABgdzaGlwX2lkBnVpbnQ2NAt3b3Jrc2hvcF9pZAZ1aW50NjQEc2xvdAV1aW50OAlyZWNpcGVfaWQGdWludDE2CHF1YW50aXR5BnVpbnQzMgZpbnB1dHMMY2FyZ29faXRlbVtdCWRlbGVudGl0eQABCWVudGl0eV9pZAZ1aW50NjQIZGVtb2xpc2gAAQllbnRpdHlfaWQGdWludDY0BmRlcGxveQADAmlkBnVpbnQ2NANyZWYJY2FyZ29fcmVmBHNsb3QNY2x1c3Rlcl9zbG90PwpkZXNjZW50aXR5AAQHaXRlbV9pZAZ1aW50MTYKaHVsbF9zdGF0cwZ1aW50NjQMbW9kdWxlX2l0ZW1zCHVpbnQxNltdDG1vZHVsZV9zdGF0cwh1aW50NjRbXQZlbmFibGUAAQdlbmFibGVkBGJvb2wMZW5lcmd5X3N0YXRzAAIIY2FwYWNpdHkGdWludDMyCHJlY2hhcmdlBnVpbnQzMhRlbnRpdHlfY3VycmVudF9zdGF0ZQACC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzBmVuZXJneQZ1aW50MzIPZW50aXR5X2RlZmF1bHRzAAILd2FyZWhvdXNlX3oGdWludDE2C2NvbnRhaW5lcl96BnVpbnQxNgtlbnRpdHlfaW5mbwAXBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMHaXRlbV9pZAZ1aW50MTYJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb192aWV3W10HbW9kdWxlcw5tb2R1bGVfZW50cnlbXQZlbmVyZ3kHdWludDMyPwhodWxsbWFzcwd1aW50MzI/CGNhcGFjaXR5B3VpbnQzMj8HZW5naW5lcw9tb3ZlbWVudF9zdGF0cz8Ed2FycAt3YXJwX3N0YXRzPwlnZW5lcmF0b3INZW5lcmd5X3N0YXRzPwZoYXVsZXINaGF1bGVyX3N0YXRzPw5nYXRoZXJlcl9sYW5lcw9nYXRoZXJlcl9sYW5lW10NY3JhZnRlcl9sYW5lcw5jcmFmdGVyX2xhbmVbXQ1idWlsZGVyX2xhbmVzDmJ1aWxkZXJfbGFuZVtdDGxvYWRlcl9sYW5lcw1sb2FkZXJfbGFuZVtdCGxhdW5jaGVyD2xhdW5jaGVyX3N0YXRzPwVsYW5lcwZsYW5lW10FaG9sZHMGaG9sZFtdDWVudGl0eV9sYXlvdXQAAw5lbnRpdHlfaXRlbV9pZAZ1aW50MTYFc2xvdHMKc2xvdF9kZWZbXQ1iYXNlX2h1bGxtYXNzBnVpbnQzMhVlbnRpdHlfbGF5b3V0c19yZXN1bHQAAQhlbnRpdGllcw9lbnRpdHlfbGF5b3V0W10KZW50aXR5X3JlZgACC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAplbnRpdHlfcm93AAwCaWQGdWludDY0BW93bmVyBG5hbWUEa2luZARuYW1lB2l0ZW1faWQGdWludDE2BG5hbWUGc3RyaW5nBXN0YXRzBnVpbnQ2NAtjb29yZGluYXRlcwtjb29yZGluYXRlcwZlbmVyZ3kHdWludDMyPwljYXJnb21hc3MGdWludDMyB21vZHVsZXMObW9kdWxlX2VudHJ5W10FbGFuZXMGbGFuZVtdBWhvbGRzBmhvbGRbXQ5lbnRpdHlfc2VxX3JvdwABB25leHRfaWQGdWludDY0DmVudGl0eV9zdW1tYXJ5AAgEdHlwZQRuYW1lAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwdpc19pZGxlBGJvb2wOcmVzb2x2ZWRfY291bnQGdWludDMyDXBlbmRpbmdfY291bnQGdWludDMyEGVudGl0eV90YXNrX2luZm8ABAllbnRpdHlfaWQGdWludDY0C2VudGl0eV90eXBlBG5hbWUKdGFza19jb3VudAZ1aW50MzIQc2NoZWR1bGVfc3RhcnRlZAp0aW1lX3BvaW50D2VudGl0eWdyb3VwX3JvdwACAmlkBnVpbnQ2NAxwYXJ0aWNpcGFudHMMZW50aXR5X3JlZltdC2VudW1fbWVtYmVyAAIFdmFsdWUFdWludDgEbmFtZQZzdHJpbmcLZW51bV9yZXN1bHQAAQdtZW1iZXJzDWVudW1fbWVtYmVyW10JZXBvY2hfcm93AAQFZXBvY2gGdWludDY0Cm9yYWNsZV9pZHMGbmFtZVtdCXRocmVzaG9sZAV1aW50OARzZWVkC2NoZWNrc3VtMjU2DGZpeGNhcmdvbWFzcwABCWVudGl0eV9pZAZ1aW50NjQQZm9vdHByaW50X3Jlc3VsdAABBWNlbGxzC2dyaWRfY2VsbFtdC2ZvcmNlcmV2ZWFsAAEFZXBvY2gGdWludDY0C2dhbWVfY29uZmlnAAMHdmVyc2lvbgZ1aW50MzIIZGVmYXVsdHMPZW50aXR5X2RlZmF1bHRzBWl0ZW1zCml0ZW1fZGVmW10GZ2F0aGVyAAUJc291cmNlX2lkBnVpbnQ2NA5kZXN0aW5hdGlvbl9pZAZ1aW50NjQHc3RyYXR1bQZ1aW50MTYIcXVhbnRpdHkGdWludDMyBHNsb3QGdWludDg/DWdhdGhlcmVyX2xhbmUABQpzbG90X2luZGV4BXVpbnQ4BXlpZWxkBnVpbnQxNgVkcmFpbgZ1aW50MzIFZGVwdGgGdWludDE2Cm91dHB1dF9wY3QGdWludDE2CmdhdGhlcnBsYW4ABglzb3VyY2VfaWQGdWludDY0DmRlc3RpbmF0aW9uX2lkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNghxdWFudGl0eQZ1aW50MzIIcmVjaGFyZ2UEYm9vbAVzbG90cwVieXRlcwxnZW5lc2lzZmxlZXQAAQhlbnRpdGllcwxlbnRpdHlfcm93W10KZ2V0Y2x1c3RlcgABBmh1Yl9pZAZ1aW50NjQJZ2V0Y29uZmlnAAAKZ2V0ZGVwb3NpdAACBW93bmVyBG5hbWUIYXNzZXRfaWQGdWludDY0C2dldGRpc3RhbmNlAAQCYXgFaW50NjQCYXkFaW50NjQCYngFaW50NjQCYnkFaW50NjQLZ2V0ZWxpZ2libGUAAgZjb29yZHMLY29vcmRpbmF0ZXMHc3RyYXR1bQZ1aW50MTYJZ2V0ZW50Y2xzAAALZ2V0ZW50aXRpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/CWdldGVudGl0eQABCWVudGl0eV9pZAZ1aW50NjQMZ2V0Zm9vdHByaW50AAEHaXRlbV9pZAZ1aW50MTYLZ2V0aXRlbWRhdGEAAApnZXRpdGVtaWRzAAAIZ2V0aXRlbXMAAAtnZXRpdGVtdHlwZQABB2l0ZW1faWQGdWludDE2DGdldGl0ZW10eXBlcwAAB2dldGpvYnMAAQt3b3Jrc2hvcF9pZAZ1aW50NjQLZ2V0a2luZG1ldGEAAAtnZXRsb2NhdGlvbgACAXgFaW50NjQBeQVpbnQ2NApnZXRsb2NkYXRhAAIBeAVpbnQ2NAF5BWludDY0C2dldG1vZHR5cGVzAAAKZ2V0bW9kdWxlcwAACWdldG5lYXJieQACCWVudGl0eV9pZAZ1aW50NjQIcmVjaGFyZ2UEYm9vbApnZXRuZnRiYXNlAAAKZ2V0bmZ0aW5mbwAACWdldHBsYXllcgABB2FjY291bnQEbmFtZQxnZXRwcm9qc3RhdGUAAgllbnRpdHlfaWQGdWludDY0CnRhc2tfY291bnQGdWludDg/CWdldHJlY2lwZQABDm91dHB1dF9pdGVtX2lkBnVpbnQxNgpnZXRyZWNpcGVzAAILbG93ZXJfYm91bmQGdWludDE2BWxpbWl0BXVpbnQ4CmdldHJlc2NhdHMAAAtnZXRyZXNlcnZlcwACAXgFaW50NjQBeQVpbnQ2NAxnZXRyZXNvdXJjZXMAAApnZXRzZXJ2aWNlAAELd29ya3Nob3BfaWQGdWludDY0CGdldHNsb3RzAAAKZ2V0c3RyYXR1bQADAXgFaW50NjQBeQVpbnQ2NAdzdHJhdHVtBnVpbnQxNgxnZXRzdW1tYXJpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/C2dldHdvcm1ob2xlAAIBeAVpbnQ2NAF5BWludDY0CWdyaWRfY2VsbAACAmd4BGludDgCZ3kEaW50OAxncm91cHRyYW5zaXQABQhlbnRpdGllcwxlbnRpdHlfcmVmW10CYXgFaW50NjQCYXkFaW50NjQCYngFaW50NjQCYnkFaW50NjQLZ3JvdXB0cmF2ZWwABAhlbnRpdGllcwxlbnRpdHlfcmVmW10BeAVpbnQ2NAF5BWludDY0CHJlY2hhcmdlBGJvb2wEaGFzaAABBXZhbHVlBnN0cmluZwdoYXNoNTEyAAEFdmFsdWUGc3RyaW5nDGhhdWxlcl9zdGF0cwAECGNhcGFjaXR5BXVpbnQ4CmVmZmljaWVuY3kGdWludDE2BWRyYWluBnVpbnQzMhBjYXBhY2l0eV9ieV90aWVyEWhhdWxlcl90aWVyX2NhcFtdD2hhdWxlcl90aWVyX2NhcAACBHRpZXIFdWludDgIY2FwYWNpdHkFdWludDgEaG9sZAAFAmlkBnVpbnQ2NARraW5kBXVpbnQ4C2NvdW50ZXJwYXJ0CmVudGl0eV9yZWYFdW50aWwKdGltZV9wb2ludA1pbmNvbWluZ19tYXNzBnVpbnQzMgtpbXBvcnRjYXJnbwABA3JvdwljYXJnb19yb3cKaW1wb3J0Y2VsbAAEBHJvb3QGdWludDY0Amd4BGludDgCZ3kEaW50OAllbnRpdHlfaWQGdWludDY0DGltcG9ydGVudGl0eQABA3JvdwplbnRpdHlfcm93C2ltcG9ydGdyb3VwAAEDcm93D2VudGl0eWdyb3VwX3JvdwxpbXBvcnRwbGF5ZXIAAQVvd25lcgRuYW1lDWltcG9ydHJlc2VydmUAAgtlcG9jaF9zY29wZQZ1aW50MzIDcm93C3Jlc2VydmVfcm93C2ltcG9ydHN0YXRlAAEDcm93CXN0YXRlX3JvdwhpdGVtX2RlZgAFAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgR0eXBlBXVpbnQ4B3N1YnR5cGUFdWludDgEdGllcgV1aW50OAxpdGVtX2lkX3BhaXIAAgJpZAZ1aW50MTYEbmFtZQZzdHJpbmcPaXRlbV9pZHNfcmVzdWx0AAEFaXRlbXMOaXRlbV9pZF9wYWlyW10PaXRlbWRhdGFfcmVzdWx0AAIFaXRlbXMKaXRlbV9kZWZbXQdyZWNpcGVzDnJlY2lwZXNfcmVzdWx0Cml0ZW1zX2luZm8AAQVpdGVtcwppdGVtX2RlZltdC2pvYl9yZWNlaXB0AAMGam9iX2lkBnVpbnQ2NAlzdGFydHNfYXQKdGltZV9wb2ludAxjb21wbGV0ZXNfYXQKdGltZV9wb2ludAdqb2Jfcm93AAwCaWQGdWludDY0CHdvcmtzaG9wBnVpbnQ2NAZzb2NrZXQFdWludDgFb3duZXIEbmFtZQdzaGlwX2lkBnVpbnQ2NAZjb29yZHMLY29vcmRpbmF0ZXMJc3RhcnRzX2F0CnRpbWVfcG9pbnQMY29tcGxldGVzX2F0CnRpbWVfcG9pbnQJcmVjaXBlX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzILZW5lcmd5X3BhaWQGdWludDMyBWNhcmdvDGNhcmdvX2l0ZW1bXQtqb2JzX3Jlc3VsdAABBGpvYnMJam9iX3Jvd1tdBGpvaW4AAQdhY2NvdW50BG5hbWUQa2luZF9tZXRhX3Jlc3VsdAACBWtpbmRzD2tpbmRfbWV0YV9yb3dbXQl0ZW1wbGF0ZXMTdGVtcGxhdGVfbWV0YV9yb3dbXQ1raW5kX21ldGFfcm93AAUEa2luZARuYW1lDmNsYXNzaWZpY2F0aW9uBXVpbnQ4EGNhcGFiaWxpdHlfZmxhZ3MFdWludDgHel9jb29yZAZ1aW50MzINZGVmYXVsdF9sYWJlbAZzdHJpbmcEbGFuZQACCGxhbmVfa2V5BXVpbnQ4CHNjaGVkdWxlCHNjaGVkdWxlBmxhdW5jaAADC2xhdW5jaGVyX2lkBnVpbnQ2NApjYXRjaGVyX2lkBnVpbnQ2NAVpdGVtcwxjYXJnb19pdGVtW10ObGF1bmNoZXJfc3RhdHMAAwtjaGFyZ2VfcmF0ZQZ1aW50MTYIdmVsb2NpdHkGdWludDE2BWRyYWluBnVpbnQxNgRsb2FkAAMCaWQGdWludDY0B2Zyb21faWQGdWludDY0BWl0ZW1zDGNhcmdvX2l0ZW1bXQtsb2FkZXJfbGFuZQAECnNsb3RfaW5kZXgFdWludDgEbWFzcwZ1aW50MzIGdGhydXN0BnVpbnQxNgpvdXRwdXRfcGN0BnVpbnQxNhBsb2NhdGlvbl9kZXJpdmVkAAIMc3RhdGljX3Byb3BzD2xvY2F0aW9uX3N0YXRpYwRzaXplBnVpbnQxNg1sb2NhdGlvbl9pbmZvAAMGY29vcmRzC2Nvb3JkaW5hdGVzCWlzX3N5c3RlbQRib29sC2lzX3dvcm1ob2xlBGJvb2wPbG9jYXRpb25fc3RhdGljAAUGY29vcmRzC2Nvb3JkaW5hdGVzBHR5cGUNbG9jYXRpb25fdHlwZQdzdWJ0eXBlBXVpbnQ4BXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DG1pZ3JhdGV0YXNrcwABBWJhdGNoBnVpbnQzMgdtaWdzd2FwAAEFYmF0Y2gGdWludDMyDG1vZHVsZV9lbnRyeQACBHR5cGUFdWludDgJaW5zdGFsbGVkDnBhY2tlZF9tb2R1bGU/C21vZHVsZV9pbmZvAAQCaWQGdWludDE2BG1hc3MGdWludDMyC21vZHVsZV90eXBlBXVpbnQ4BHRpZXIFdWludDgObW9kdWxlc19yZXN1bHQAAQdtb2R1bGVzDW1vZHVsZV9pbmZvW10ObW92ZW1lbnRfc3RhdHMAAgZ0aHJ1c3QGdWludDMyBWRyYWluBnVpbnQzMghtb3ZldGlsZQAFBmh1Yl9pZAZ1aW50NjQHZnJvbV9neARpbnQ4B2Zyb21fZ3kEaW50OAV0b19neARpbnQ4BXRvX2d5BGludDgLbmVhcmJ5X2luZm8ABQpjYW5fdHJhdmVsBGJvb2wHY3VycmVudBRlbnRpdHlfY3VycmVudF9zdGF0ZQlwcm9qZWN0ZWQUZW50aXR5X2N1cnJlbnRfc3RhdGUKbWF4X2VuZXJneQZ1aW50MzIHc3lzdGVtcw9uZWFyYnlfc3lzdGVtW10NbmVhcmJ5X3N5c3RlbQAECGRpc3RhbmNlBnVpbnQ2NAtlbmVyZ3lfY29zdAZ1aW50NjQLZmxpZ2h0X3RpbWUGdWludDMyCGxvY2F0aW9uDWxvY2F0aW9uX2luZm8ObmZ0X2NhcmdvX2l0ZW0ABAdpdGVtX2lkBnVpbnQxNgVzdGF0cwZ1aW50NjQHbW9kdWxlcw5tb2R1bGVfZW50cnlbXQhxdWFudGl0eQZ1aW50MzIQbmZ0X2l0ZW1fcGF5bG9hZAACBGl0ZW0ObmZ0X2NhcmdvX2l0ZW0IbG9jYXRpb24MY29vcmRpbmF0ZXM/Dm5mdF9zY2hlbWFfZGVmAAILc2NoZW1hX25hbWUEbmFtZQZmaWVsZHMOc2NoZW1hX2ZpZWxkW10QbmZ0X3RlbXBsYXRlX2RlZgADB2l0ZW1faWQGdWludDE2C3NjaGVtYV9uYW1lBG5hbWULdGVtcGxhdGVfaWQFaW50MzINbmZ0Y29uZmlnX3JvdwADB2l0ZW1faWQGdWludDE2C3RlbXBsYXRlX2lkBWludDMyC3NjaGVtYV9uYW1lBG5hbWUJbmZ0aW1ndXJsAAIEaXRlbQpjYXJnb19pdGVtCGxvY2F0aW9uDGNvb3JkaW5hdGVzPw5uZnRpbmZvX3Jlc3VsdAACB3NjaGVtYXMQbmZ0X3NjaGVtYV9kZWZbXQl0ZW1wbGF0ZXMSbmZ0X3RlbXBsYXRlX2RlZltdBm5vdGlmeQABBWV2ZW50CnRhc2tfZXZlbnQRb3JhY2xlX2NvbmZpZ19yb3cAAQl0aHJlc2hvbGQFdWludDgKb3JhY2xlX3JvdwABAmlkBG5hbWUNcGFja2VkX21vZHVsZQACB2l0ZW1faWQGdWludDE2BXN0YXRzBnVpbnQ2NApwbGFjZWNhcmdvAAMFb3duZXIEbmFtZQdob3N0X2lkBnVpbnQ2NAhhc3NldF9pZAZ1aW50NjQLcGxhY2VlbnRpdHkAAwVvd25lcgRuYW1lCGFzc2V0X2lkBnVpbnQ2NA90YXJnZXRfbmV4dXNfaWQGdWludDY0C3BsYXllcl9pbmZvAAMFb3duZXIEbmFtZQlpc19wbGF5ZXIEYm9vbAxjb21wYW55X25hbWUGc3RyaW5nCnBsYXllcl9yb3cAAQVvd25lcgRuYW1lD3Byb2plY3RlZF9zdGF0ZQARBW93bmVyBG5hbWULY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5B3VpbnQzMj8JY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb192aWV3W10IaHVsbG1hc3MHdWludDMyPwhjYXBhY2l0eQd1aW50MzI/B2VuZ2luZXMPbW92ZW1lbnRfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8GaGF1bGVyDWhhdWxlcl9zdGF0cz8OZ2F0aGVyZXJfbGFuZXMPZ2F0aGVyZXJfbGFuZVtdDWNyYWZ0ZXJfbGFuZXMOY3JhZnRlcl9sYW5lW10NYnVpbGRlcl9sYW5lcw5idWlsZGVyX2xhbmVbXQxsb2FkZXJfbGFuZXMNbG9hZGVyX2xhbmVbXQhsYXVuY2hlcg9sYXVuY2hlcl9zdGF0cz8EdGllcgV1aW50OAhyZWNoYXJnZQABAmlkBnVpbnQ2NAxyZWNpcGVfaW5wdXQAAgdpdGVtX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIQcmVjaXBlX2l0ZW1faW5mbwACAmlkBnVpbnQxNgRtYXNzBnVpbnQzMg9yZWNpcGVfcmVzcG9uc2UACA5vdXRwdXRfaXRlbV9pZAZ1aW50MTYLb3V0cHV0X21hc3MGdWludDMyBmlucHV0cw5yZWNpcGVfaW5wdXRbXQpzdGF0X3Nsb3RzFHN0YXRfc2xvdF9yZXNwb25zZVtdDWJsZW5kX3dlaWdodHMFYnl0ZXMLb3V0cHV0X2l0ZW0QcmVjaXBlX2l0ZW1faW5mbwtpbnB1dF9pdGVtcxJyZWNpcGVfaXRlbV9pbmZvW10Pc291cmNlX3N1YmNsYXNzB3VpbnQxNj8OcmVjaXBlc19yZXN1bHQAAQdyZWNpcGVzEXJlY2lwZV9yZXNwb25zZVtdDHJlZnJzaGVudGl0eQABCWVudGl0eV9pZAZ1aW50NjQMcmVtb3Zlb3JhY2xlAAEJb3JhY2xlX2lkBG5hbWUGcmVuYW1lAAICaWQGdWludDY0BG5hbWUGc3RyaW5nC3Jlc2VydmVfcm93AAUCaWQGdWludDY0CGNvb3JkX2lkBnVpbnQ2NAdzdHJhdHVtBnVpbnQxNglyZW1haW5pbmcGdWludDMyCmxhc3RfYmxvY2sUYmxvY2tfdGltZXN0YW1wX3R5cGUHcmVzb2x2ZQACAmlkBnVpbnQ2NAVjb3VudAd1aW50NjQ/D3Jlc29sdmVfcmVzdWx0cwAGCWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQ5yZXNvbHZlZF9jb3VudAZ1aW50MzIUbmV3X3NjaGVkdWxlX3N0YXJ0ZWQLdGltZV9wb2ludD8LZW50aXR5Z3JvdXAHdWludDY0Pw1ncm91cF9tZW1iZXJzFkJfdmVjdG9yX2VudGl0eV9yZWZfRT8KcmVzb2x2ZWFsbAABBW93bmVyBG5hbWUScmVzb2x2ZWFsbF9yZXN1bHRzAAIHc2Nhbm5lZAZ1aW50MzIIcmVzb2x2ZWQGdWludDMyDXJlc291cmNlX2luZm8ABAJpZAZ1aW50MTYEbWFzcwZ1aW50MzIIY2F0ZWdvcnkFdWludDgEdGllcgV1aW50OA5yZXNvdXJjZV9zdGF0cwADBXN0YXQxBnVpbnQxNgVzdGF0MgZ1aW50MTYFc3RhdDMGdWludDE2EHJlc291cmNlc19yZXN1bHQAAQlyZXNvdXJjZXMPcmVzb3VyY2VfaW5mb1tdBnJldmVhbAADCW9yYWNsZV9pZARuYW1lBWVwb2NoBnVpbnQ2NAZyZXZlYWwLY2hlY2tzdW0yNTYKcmV2ZWFsX3JvdwAEAmlkBnVpbnQ2NAVlcG9jaAZ1aW50NjQJb3JhY2xlX2lkBG5hbWUGcmV2ZWFsC2NoZWNrc3VtMjU2CHJtbW9kdWxlAAMJZW50aXR5X2lkBnVpbnQ2NAxtb2R1bGVfaW5kZXgFdWludDgKdGFyZ2V0X3JlZgpjYXJnb19yZWY/CHJtbmZ0Y2ZnAAEHaXRlbV9pZAZ1aW50MTYOcm91dGVfd2F5cG9pbnQAAgF4BWludDY0AXkFaW50NjQIc2NoZWR1bGUAAgdzdGFydGVkCnRpbWVfcG9pbnQFdGFza3MGdGFza1tdDHNjaGVtYV9maWVsZAACBG5hbWUGc3RyaW5nCmZpZWxkX3R5cGUGc3RyaW5nC3NlcnZpY2Vfcm93AAIGZW50aXR5BnVpbnQ2NAdzb2NrZXRzEHNlcnZpY2Vfc29ja2V0W10Oc2VydmljZV9zb2NrZXQAAQRvcGVuBGJvb2wIc2V0Y2l2aWMAAQdhY2NvdW50BG5hbWUJc2V0Y29vcmRzAAMJZW50aXR5X2lkBnVpbnQ2NAF4BWludDY0AXkFaW50NjQJc2V0bmZ0Y2ZnAAMHaXRlbV9pZAZ1aW50MTYLdGVtcGxhdGVfaWQFaW50MzILc2NoZW1hX25hbWUEbmFtZQlzZXRzb2NrZXQAAwt3b3Jrc2hvcF9pZAZ1aW50NjQEc2xvdAV1aW50OARvcGVuBGJvb2wMc2V0dGhyZXNob2xkAAEJdGhyZXNob2xkBXVpbnQ4C3NldHdyYXBjb3N0AAMJaXRlbV90eXBlBXVpbnQ4BHRpZXIFdWludDgGYW1vdW50BnVpbnQ2NApzZXR3cmFwZmVlAAIHZmVlX3BjdAZ1aW50MTYLZmVlX2FjY291bnQEbmFtZQdzaHV0dGxlAAQHY2FycmllcgZ1aW50NjQHZnJvbV9pZAZ1aW50NjQFdG9faWQGdWludDY0BWl0ZW1zDGNhcmdvX2l0ZW1bXQhzbG90X2RlZgADBHR5cGUFdWludDgKb3V0cHV0X3BjdAZ1aW50MTYIbWF4X3RpZXIFdWludDgSc3RhdF9zbG90X3Jlc3BvbnNlAAEHc291cmNlcw1zdGF0X3NvdXJjZVtdC3N0YXRfc291cmNlAAILaW5wdXRfaW5kZXgFdWludDgQaW5wdXRfc3RhdF9pbmRleAV1aW50OAlzdGF0ZV9yb3cAAwdlbmFibGVkBGJvb2wFZXBvY2gGdWludDMyBHNlZWQLY2hlY2tzdW0yNTYJc3Rvd2NhcmdvAAUFb3duZXIEbmFtZQllbnRpdHlfaWQGdWludDY0CG5leHVzX2lkBnVpbnQ2NAhjYXJnb19pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0CnN0b3dlbnRpdHkAAwVvd25lcgRuYW1lCWVudGl0eV9pZAZ1aW50NjQIbmV4dXNfaWQGdWludDY0DHN0cmF0dW1fZGF0YQACB3N0cmF0dW0Mc3RyYXR1bV9pbmZvBXN0YXRzDnJlc291cmNlX3N0YXRzDHN0cmF0dW1faW5mbwAFB2l0ZW1faWQGdWludDE2BHNlZWQGdWludDY0CHJpY2huZXNzBnVpbnQxNgdyZXNlcnZlBnVpbnQzMgtyZXNlcnZlX21heAZ1aW50MzIRc3RyYXR1bV9yZW1haW5pbmcAAwdzdHJhdHVtBnVpbnQxNglyZW1haW5pbmcGdWludDMyCmxhc3RfYmxvY2sUYmxvY2tfdGltZXN0YW1wX3R5cGUKc3dhcG1vZHVsZQADCWVudGl0eV9pZAZ1aW50NjQMbW9kdWxlX2luZGV4BXVpbnQ4Cm1vZHVsZV9yZWYJY2FyZ29fcmVmCHN3YXB0aWxlAAUGaHViX2lkBnVpbnQ2NARhX2d4BGludDgEYV9neQRpbnQ4BGJfZ3gEaW50OARiX2d5BGludDgEdGFzawAKBHR5cGUFdWludDgIZHVyYXRpb24GdWludDMyCmNhbmNlbGFibGUFdWludDgLY29vcmRpbmF0ZXMMY29vcmRpbmF0ZXM/BWNhcmdvDGNhcmdvX2l0ZW1bXQljb3VwbGluZ3MKY291cGxpbmdbXQdzdWJqZWN0C2VudGl0eV9yZWY/C2VudGl0eWdyb3VwB3VpbnQ2ND8LZW5lcmd5X2Nvc3QHdWludDMyPw50YXJnZXRfaXRlbV9pZAd1aW50MTY/CnRhc2tfZXZlbnQACgpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgGdWludDMyBHRhc2sEdGFzawlzdGFydHNfYXQKdGltZV9wb2ludAxjb21wbGV0ZXNfYXQKdGltZV9wb2ludApuZXdfZW5lcmd5B3VpbnQzMj8IbGFuZV9rZXkFdWludDgMdGFza19yZXN1bHRzAAEIZW50aXRpZXMSZW50aXR5X3Rhc2tfaW5mb1tdEXRlbXBsYXRlX21ldGFfcm93AAMHaXRlbV9pZAZ1aW50MTYEa2luZARuYW1lDWRpc3BsYXlfbGFiZWwGc3RyaW5nB3RyYW5zaXQABQJpZAZ1aW50NjQCYXgFaW50NjQCYXkFaW50NjQCYngFaW50NjQCYnkFaW50NjQGdHJhdmVsAAQCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sCnRyYXZlbHBsYW4AAwhlbnRpdGllcwxlbnRpdHlfcmVmW10Jd2F5cG9pbnRzEHJvdXRlX3dheXBvaW50W10IcmVjaGFyZ2UEYm9vbAl0eXBlc19yb3cABQJpZAZ1aW50NjQTZW50aXR5X3N1bW1hcnlfdHlwZQ5lbnRpdHlfc3VtbWFyeRBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnFnN0cmF0dW1fcmVtYWluaW5nX3R5cGURc3RyYXR1bV9yZW1haW5pbmcVbmZ0X2l0ZW1fcGF5bG9hZF90eXBlEG5mdF9pdGVtX3BheWxvYWQIdW5kZXBsb3kAAgdob3N0X2lkBnVpbnQ2NAl0YXJnZXRfaWQGdWludDY0BnVubG9hZAADAmlkBnVpbnQ2NAV0b19pZAZ1aW50NjQFaXRlbXMMY2FyZ29faXRlbVtdB3VwZ3JhZGUABQpidWlsZGVyX2lkBnVpbnQ2NAl0YXJnZXRfaWQGdWludDY0DnRhcmdldF9pdGVtX2lkBnVpbnQxNgZpbnB1dHMMY2FyZ29faXRlbVtdBHNsb3QGdWludDg/BHdhcnAAAwJpZAZ1aW50NjQBeAVpbnQ2NAF5BWludDY0CndhcnBfc3RhdHMAAQVyYW5nZQZ1aW50MzIEd2lwZQAADXdvcm1ob2xlX2luZm8AAwZjb29yZHMLY29vcmRpbmF0ZXMLaXNfd29ybWhvbGUEYm9vbAtkZXN0aW5hdGlvbgtjb29yZGluYXRlcw53cmFwY29uZmlnX3JvdwACB2ZlZV9wY3QGdWludDE2C2ZlZV9hY2NvdW50BG5hbWUMd3JhcGNvc3Rfcm93AAMJaXRlbV90eXBlBXVpbnQ4BHRpZXIFdWludDgGYW1vdW50BnVpbnQ2NG8AAFBRJypTMglhZGRtb2R1bGXHAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZGRtb2R1bGUKc3VtbWFyeTogJ0luc3RhbGwgYSBtb2R1bGUgaW50byBhIHNsb3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluc3RhbGwgYSBtb2R1bGUgZnJvbSBjYXJnbyBpbnRvIGEgbW9kdWxlIHNsb3Qgb24gYSBsaXZlIGVudGl0eSBvciBhIHBhY2tlZCBlbnRpdHkgaW4gY2FyZ28uIFRoZSBlbnRpdHkgbXVzdCBiZSBpZGxlIHdpdGggbm8gc2NoZWR1bGVkIHRhc2tzLiBUaGUgbW9kdWxlIHR5cGUgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldCBzbG90IHR5cGUuIFRoZSBtb2R1bGUgaXRlbSBpcyByZW1vdmVkIGZyb20gY2FyZ28gdXBvbiBpbnN0YWxsYXRpb24uAAAAWHc1UzIIYWRkbmV4dXOnAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZGRuZXh1cwpzdW1tYXJ5OiAnQWRkIGEgbmV4dXMgbG9jYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNyZWF0ZSBhIG5ldyBuZXh1cyBlbnRpdHkgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzLiBOZXh1c2VzIGFyZSBvd25lZCBieSB0aGUgY29udHJhY3QgYW5kIHNlcnZlIGFzIGZpeGVkIGdhdGhlcmluZyBwb2ludHMgd2hlcmUgcGxheWVycyBjYW4gd3JhcCwgdW53cmFwLCBkZXBsb3ksIGFuZCBvdGhlcndpc2UgaW50ZXJhY3Qgd2l0aCBORlQtYmFja2VkIGFzc2V0cy4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAUBGZS1MyCWFkZG9yYWNsZQAAAAAAgDRVPAVibGVuZPwCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGJsZW5kCnN1bW1hcnk6ICdCbGVuZCBjYXJnbyBzdGFja3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNvbWJpbmUgbXVsdGlwbGUgY2FyZ28gc3RhY2tzIG9mIHRoZSBzYW1lIGl0ZW0gdHlwZSBpbnRvIGEgc2luZ2xlIHN0YWNrIHdpdGggbmV3IGJsZW5kZWQgc3RhdHMuIEFsbCBpbnB1dCBzdGFja3MgbXVzdCBzaGFyZSB0aGUgc2FtZSBpdGVtIGlkLiBUaGUgb3V0cHV0IHN0YWNrIGhhcyB0aGUgY29tYmluZWQgcXVhbnRpdHkgb2YgYWxsIGlucHV0cy4AAMg01hSdPglidWlsZHBsb3QAAAAAAESFpkEGY2FuY2VswgItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2FuY2VsCnN1bW1hcnk6ICdDYW5jZWwgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYW5jZWwgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGFza3MgZnJvbSB0aGUgZW5kIG9mIGFuIGVudGl0eSdzIHNjaGVkdWxlLiBUYXNrcyB0aGF0IGFyZSBpbW11dGFibGUgYW5kIGluIHByb2dyZXNzIGNhbm5vdCBiZSBjYW5jZWxsZWQuAAA49EWFpkEJY2FuY2Vsam9iAAAAAIc+6UxECGNsYWltam9iAAAAyDRW6UxECWNsYWltcGxvdABwVb4mY+lMRAxjbGFpbXN0YXJ0ZXIAAACoG99pVEQJY2xlYW5yc3Zw7AItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYW5yc3ZwCnN1bW1hcnk6ICdDbGVhbiB1cCBwYXN0IGVwb2NoIHJlc2VydmVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFcmFzZSByZXNlcnZlIHRhYmxlIHJvd3MgZnJvbSBhIHBhc3QgZXBvY2guIENhbm5vdCBjbGVhbiB0aGUgY3VycmVudCBvciBmdXR1cmUgZXBvY2hzLiBUaGUgbWF4X3Jvd3MgcGFyYW1ldGVyIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIGVyYXNlZCBwZXIgY2FsbCB0byBsaW1pdCBDUFUgdXNhZ2UuAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABkJyVFBmNvbW1pdOwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbW1pdApzdW1tYXJ5OiAnU2V0IGNvbW1pdCB2YWx1ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2V0IHRoZSBpbml0aWFsIGNvbW1pdCB2YWx1ZSBkdXJpbmcgZ2FtZSBpbml0aWFsaXphdGlvbi4AAGA0MrcmRQljb25maWdsb2fdAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjb25maWdsb2cKc3VtbWFyeTogJ0xvZyBnYW1lIGNvbmZpZ3VyYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiB0aGF0IGxvZ3MgdGhlIGN1cnJlbnQgZ2FtZSBjb25maWd1cmF0aW9uLiBDYWxsZWQgaW5saW5lIGFmdGVyIGluaXRpYWxpemF0aW9uIHRvIGJyb2FkY2FzdCBjb25maWcgdmlhIGFjdGlvbiB0cmFjZXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAAAAgLzMRQVjcmFmdMgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNyYWZ0CnN1bW1hcnk6ICdDcmFmdCBpdGVtcyBmcm9tIGEgcmVjaXBlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2Zvcm0gY2FyZ28gaXRlbXMgaW50byBhIG5ldyBpdGVtIHVzaW5nIGEgcmVjaXBlLiBUaGUgZW50aXR5IG11c3QgaGF2ZSBhIGNyYWZ0ZXIgbW9kdWxlIGluc3RhbGxlZC4gQ29uc3VtZXMgZW5lcmd5IGFuZCBzY2hlZHVsZXMgYSBjcmFmdGluZyB0YXNrIHdpdGggZHVyYXRpb24gYmFzZWQgb24gdG90YWwgaW5wdXQgbWFzcyBhbmQgY3JhZnRlciBzcGVlZC4gSW5wdXQgcXVhbnRpdGllcyBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlIHJlY2lwZSByZXF1aXJlbWVudHMuAAAAh768zEUIY3JhZnRqb2IAAADw2eWpokoJZGVsZW50aXR5AAAAAA27SKVKCGRlbW9saXNo8QMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZGVtb2xpc2gKc3VtbWFyeTogJ0RlbW9saXNoIGEgc3RhdGlvbmFyeSBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkRlY29tbWlzc2lvbiBhbiBlbnRpdHksIGVyYXNpbmcgaXQgZnJvbSB0aGUgZ2FtZS4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUsIGhhdmUgZW1wdHkgY2FyZ28sIGFuZCBoYXZlIG5vIGluc3RhbGxlZCBtb2R1bGVzIChyZW1vdmUgZWFjaCB2aWEgcm1tb2R1bGUgZmlyc3QpLiBTY2hlZHVsZXMgYSBkZW1vbGlzaCB0YXNrIHRoYXQgZXJhc2VzIHRoZSBlbnRpdHkgb24gcmVzb2x1dGlvbi4gT25seSB2YWxpZCBmb3IgZW50aXRpZXMgdGhhdCBjYW5ub3QgbW92ZTsgdXNlIHVuZGVwbG95IG9yIHdyYXBlbnRpdHkgZm9yIHRoZSByZXN0LgAAAAB4GqtKBmRlcGxveewCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGRlcGxveQpzdW1tYXJ5OiAnRGVwbG95IGEgcGFja2VkIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVW5wYWNrIGEgcGFja2VkIGVudGl0eSBpdGVtIChwYWNrZWQgc2hpcCBvciBwYWNrZWQgY29udGFpbmVyKSBmcm9tIGNhcmdvLCBzY2hlZHVsaW5nIGEgZGVwbG95IHRhc2sgdGhhdCBjcmVhdGVzIHRoZSBuZXcgZW50aXR5IGF0IHRoZSBkZXBsb3lpbmcgZW50aXR5J3MgbG9jYXRpb24gdXBvbiByZXNvbHV0aW9uLgCAzy5PhbBKCmRlc2NlbnRpdHnJAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBkZXNjZW50aXR5CnN1bW1hcnk6ICdEZXNjcmliZSBhIHBhY2tlZCBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gc3RyaW5nIGZvciBhIHBhY2tlZCBlbnRpdHksIGRlcml2ZWQgZnJvbSB0aGUgZW50aXR5IGl0ZW0gaWQsIGh1bGwgc3RhdHMsIGFuZCB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgbW9kdWxlIGl0ZW0gaWRzIGFuZCBzdGF0cy4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgTkZUIHJlbmRlcmVycyB0byBkaXNwbGF5IHBhY2tlZCBlbnRpdGllcy4AAAAAqHjMVAZlbmFibGXdAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBlbmFibGUKc3VtbWFyeTogJ1NldCBlbmFibGVkIHN0YXRlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpFbmFibGUgb3IgZGlzYWJsZSB0aGlzIGdhbWUgb2YgU2hpcGxvYWQugLGRlF2DulsMZml4Y2FyZ29tYXNzkAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZml4Y2FyZ29tYXNzCnN1bW1hcnk6ICdERUJVRzogcmVjb21wdXRlIGVudGl0eSBjYXJnbyBtYXNzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZWNvbXB1dGUgYW5kIHJld3JpdGUgYW4gZW50aXR5J3MgY2FyZ28gbWFzcyBmcm9tIGl0cyBjdXJyZW50IGNhcmdvLiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuIEF2YWlsYWJsZSBmb3IgcmVwYWlyaW5nIGRyaWZ0IGJldHdlZW4gY2FjaGVkIGNhcmdvIG1hc3MgYW5kIHRoZSB0cnVlIG1hc3MgZGVyaXZlZCBmcm9tIGNhcmdvIHJvd3MuAKJRW12FLl0LZm9yY2VyZXZlYWy+BC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBmb3JjZXJldmVhbApzdW1tYXJ5OiAnREVCVUc6IGZvcmNlLWZpbmFsaXplIGFuIGVwb2NoIGZyb20gZXhpc3RpbmcgcmV2ZWFscycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRmluYWxpemUgYSBzdHVjayBlcG9jaCBieSBjb21wdXRpbmcgaXRzIHNlZWQgZnJvbSB0aGUgcmV2ZWFscyBhbHJlYWR5IHN1Ym1pdHRlZCwgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4gVGhlIHNlZWQgaXMgZGVyaXZlZCBzb2xlbHkgZnJvbSB0aGUgcHJlLWltYWdlLWxvY2tlZCByZXZlYWxzIGFscmVhZHkgb24gY2hhaW47IG5vIGFkbWluLXN1cHBsaWVkIGVudHJvcHkgaXMgaW50cm9kdWNlZC4gVXNlZCB0byB1bmJsb2NrIGVwb2NoIHByb2dyZXNzaW9uIHdoZW4gdGhlIHRocmVzaG9sZCBjYW5ub3Qgb3RoZXJ3aXNlIGJlIG1ldC4AAAAAXNWyYQZnYXRoZXKXAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnYXRoZXIKc3VtbWFyeTogJ0dhdGhlciByZXNvdXJjZXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkdhdGhlciByZXNvdXJjZXMgYXQgdGhlIHNoaXAncyBjdXJyZW50IGxvY2F0aW9uLiBPbmx5IHdvcmtzIGF0IGdhdGhlcmFibGUgbG9jYXRpb24gdHlwZXMuIFNjaGVkdWxlcyBhIGdhdGhlciB0YXNrIHRoYXQgY29uc3VtZXMgZW5lcmd5IGFuZCB5aWVsZHMgY2FyZ28gYmFzZWQgb24gdGhlIHNoaXAncyBnYXRoZXJlciBzdGF0cyBhbmQgdGhlIGxvY2F0aW9uJ3MgcmVzb3VyY2UgY29tcG9zaXRpb24uAMA0sV7VsmEKZ2F0aGVycGxhbgCQlYoLO6ymYgxnZW5lc2lzZmxlZXSpBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZW5lc2lzZmxlZXQKc3VtbWFyeTogJ01pbnQgdGhlIG9uZS10aW1lIGdlbmVzaXMgZmxlZXQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVtcGxhY2UgdGhlIG9uZS10aW1lIGdlbmVzaXMgZmxlZXQ6IGEgY2FsbGVyLXN1cHBsaWVkIHNldCBvZiBlbnRpdGllcyAoc2hpcHMsIHN0cnVjdHVyZXMsIGFuZCBjb250YWluZXJzKSB3cml0dGVuIHRvIHRoZSB3b3JsZCBhcy1pcy4gVmFsaWQgb25seSBkdXJpbmcgdGhlIHByZS1nZW5lc2lzIHdpbmRvdywgYmVmb3JlIGVwb2NoIDEgaXMgZmluYWxpemVkLiBUaGUgc3VwcGxpZWQgZW50aXR5IGlkcyBhcmUgaG9ub3JlZCBhbmQgdGhlIGlkIHNlcXVlbmNlIGlzIGFkdmFuY2VkIHBhc3QgdGhlbTsgaWQgMCBpcyByZXNlcnZlZCBmb3IgdGhlIEdlbmVzaXMgTmV4dXMuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AwFUZ64iyYgpnZXRjbHVzdGVyAAAAYG5NirJiCWdldGNvbmZpZ8oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGNvbmZpZwpzdW1tYXJ5OiAnR2V0IGdhbWUgY29uZmlndXJhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyB0aGUgZ2FtZSBjb25maWd1cmF0aW9uIGluY2x1ZGluZyBkZWZhdWx0IGVudGl0eSBzdGF0cyBmb3Igd2FyZWhvdXNlcyBhbmQgY29udGFpbmVycywgYW5kIHRoZSBmdWxsIGl0ZW0gZGVmaW5pdGlvbnMgdGFibGUuAEB2mFaVsmIKZ2V0ZGVwb3NpdAAAFJomY5eyYgtnZXRkaXN0YW5jZQAAVDyOuaiyYgtnZXRlbGlnaWJsZcgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVsaWdpYmxlCnN1bW1hcnk6ICdHZXQgZWxpZ2libGUgcmVzb3VyY2UgaXRlbSBJRHMgYXQgYSBsb2NhdGlvbiBhbmQgc3RyYXR1bScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGxpc3Qgb2YgcmVzb3VyY2UgaXRlbSBJRHMgZWxpZ2libGUgdG8gYmUgZ2F0aGVyZWQgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzIGFuZCBzdHJhdHVtIGRlcHRoLiBJdGVtcyBhcmUgZ2F0ZWQgYnkgYm90aCB0aGUgbG9jYXRpb24ncyByZXNvdXJjZSBwcm9maWxlIGFuZCB0aGUgZGVwdGggdGhyZXNob2xkIGZvciBlYWNoIHRpZXIuAADAEeWpsmIJZ2V0ZW50Y2xzjAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0ZW50Y2xzCnN1bW1hcnk6ICdHZXQgZW50aXR5IGNsYXNzIGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgZW50aXR5IGNsYXNzIGVudW0gdmFsdWVzIGFuZCB0aGVpciBzdHJpbmcgbmFtZXMgKE9yYml0YWxWZXNzZWwsIFBsYW5ldGFyeVN0cnVjdHVyZSkuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGVjb2RlIGVudGl0eSBjbGFzcyBpZGVudGlmaWVycy4AsHLZ5amyYgtnZXRlbnRpdGllc6QCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0aWVzCnN1bW1hcnk6ICdHZXQgYWxsIGVudGl0aWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBmdWxsIGVudGl0eSBpbmZvIGZvciBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgAA8NnlqbJiCWdldGVudGl0eaICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0eQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBlbnRpdHkgaW5jbHVkaW5nIGlkZW50aXR5LCBjYXJnbywgc2NoZWR1bGUgc3RhdGUsIGFuZCB0eXBlLXNwZWNpZmljIGZpZWxkcy6Qp7s1U7qyYgxnZXRmb290cHJpbnQAAEw2SarssmILZ2V0aXRlbWRhdGGoAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRpdGVtZGF0YQpzdW1tYXJ5OiAnR2V0IGZ1bGwgaXRlbSBjYXRhbG9nJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgY29tcGxldGUgaXRlbSBjYXRhbG9nIGFzIHRoZSBjb250cmFjdCBzZWVzIGl0LCBpbmNsdWRpbmcgdHlwZSwgc3VidHlwZSwgdGllciwgbWFzcywgYW5kIG90aGVyIHN0YXRpYyBtZXRhZGF0YS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyBhbmQgY2xpZW50cyB0byBtaXJyb3IgdGhlIGNvbnRyYWN0J3MgaXRlbSBkZWZpbml0aW9ucy4AAE5OquyyYgpnZXRpdGVtaWRzhgMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbWlkcwpzdW1tYXJ5OiAnR2V0IGl0ZW0gaWQgdG8gbmFtZSBtYXBwaW5ncycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIGZ1bGwgbWFwcGluZyBvZiBpdGVtIGlkIGNvbnN0YW50cyB0byB0aGVpciBjYW5vbmljYWwgc3RyaW5nIG5hbWVzLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHJlc29sdmUgbnVtZXJpYyBpdGVtIGlkcyB0byBodW1hbi1yZWFkYWJsZSBpZGVudGlmaWVycy4AAABYquyyYghnZXRpdGVtc5oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1zCnN1bW1hcnk6ICdHZXQgYWxsIGF2YWlsYWJsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGl0ZW1zIGluIHRoZSBnYW1lIGluY2x1ZGluZyB0aGVpciBpZCwgYmFzZSBwcmljZSwgYW5kIG1hc3MuAFT1WarssmILZ2V0aXRlbXR5cGUAgFX1WarssmIMZ2V0aXRlbXR5cGVziAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0aXRlbXR5cGVzCnN1bW1hcnk6ICdHZXQgaXRlbSB0eXBlIGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgaXRlbSB0eXBlIGVudW0gdmFsdWVzIGFuZCB0aGVpciBzdHJpbmcgbmFtZXMgKHJlc291cmNlLCBjb21wb25lbnQsIG1vZHVsZSwgZW50aXR5KS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgaXRlbSB0eXBlIGlkZW50aWZpZXJzLgAAAAAf+rJiB2dldGpvYnMAAExWMk0Hs2ILZ2V0a2luZG1ldGH4Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRraW5kbWV0YQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBraW5kIG1ldGFkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZW50aXR5IGtpbmQgcmVnaXN0cnkgYW5kIHRlbXBsYXRlIHJlZ2lzdHJ5LCBpbmNsdWRpbmcgZWFjaCBraW5kJ3MgY2xhc3NpZmljYXRpb24sIGNhcGFiaWxpdHkgZmxhZ3MsIFotY29vcmRpbmF0ZSwgYW5kIGRlZmF1bHQgbGFiZWwsIHBsdXMgdGhlIG1hcHBpbmcgb2YgZW50aXR5IGl0ZW0gaWRzIHRvIGtpbmRzIHdpdGggZGlzcGxheSBsYWJlbHMuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gaW50ZXJwcmV0IGVudGl0eSBraW5kcyBhbmQgY2FwYWJpbGl0aWVzLgAmddkgGrNiC2dldGxvY2F0aW9u4gItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bG9jYXRpb24Kc3VtbWFyeTogJ0dldCBsb2NhdGlvbiBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIGxvY2F0aW9uIGluY2x1ZGluZyB3aGV0aGVyIGEgc3lzdGVtIGV4aXN0cywgYW5kIGZvciBlYWNoIGl0ZW06IHByaWNlLCBzdXBwbHksIHJhcml0eSBtdWx0aXBsaWVyLCBhbmQgbG9jYXRpb24gbXVsdGlwbGllci4AgMkmIRqzYgpnZXRsb2NkYXRh/gItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bG9jZGF0YQpzdW1tYXJ5OiAnR2V0IGRlcml2ZWQgbG9jYXRpb24gZGF0YScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBkZXJpdmVkIGxvY2F0aW9uIGRhdGEgaW5jbHVkaW5nIHN0YXRpYyBwcm9wZXJ0aWVzICh0eXBlLCBkaWZmaWN1bHR5LCBzZWVkcykgZnJvbSB0aGUgZ2FtZSBzZWVkIGFuZCBlcG9jaC1zcGVjaWZpYyBwcm9wZXJ0aWVzIChhY3RpdmUsIHNlZWRzKSBmcm9tIHRoZSBjdXJyZW50IGVwb2NoIHNlZWQuALCqPicqs2ILZ2V0bW9kdHlwZXPWAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRtb2R0eXBlcwpzdW1tYXJ5OiAnR2V0IG1vZHVsZSB0eXBlIGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgbW9kdWxlIHR5cGUgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAoYW55LCBlbmdpbmUsIGdlbmVyYXRvciwgZ2F0aGVyZXIsIGxvYWRlciwgd2FycCwgY3JhZnRlciwgbGF1bmNoZXIsIHN0b3JhZ2UsIGhhdWxlcikuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGVjb2RlIG1vZHVsZSBzdWJ0eXBlIGlkZW50aWZpZXJzIGFuZCBzbG90IGNvbXBhdGliaWxpdHkuAABWUScqs2IKZ2V0bW9kdWxlc4ADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG1vZHVsZXMKc3VtbWFyeTogJ0dldCBhbGwgbW9kdWxlIGl0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGNsYXNzaWZpZWQgYXMgbW9kdWxlcywgaW5jbHVkaW5nIGVhY2ggbW9kdWxlJ3MgaWQsIG1hc3MsIHN1YnR5cGUsIGFuZCB0aWVyLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIGVudW1lcmF0ZSBpbnN0YWxsYWJsZSBlcXVpcG1lbnQuAADw5xo1s2IJZ2V0bmVhcmJ5ygMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0bmVhcmJ5CnN1bW1hcnk6ICdHZXQgbmVhcmJ5IHJlYWNoYWJsZSBzeXN0ZW1zJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIG5lYXJieSBzeXN0ZW1zIHJlYWNoYWJsZSBieSBhbiBlbnRpdHkgZnJvbSBpdHMgcHJvamVjdGVkIGxvY2F0aW9uLiBSZXR1cm5zIGN1cnJlbnQgc3RhdGUgKHdpdGggY29tcGxldGVkIHRhc2tzIHJlc29sdmVkKSwgcHJvamVjdGVkIHN0YXRlIChhZnRlciBhbGwgc2NoZWR1bGVkIHRhc2tzKSwgYW5kIGEgbGlzdCBvZiByZWFjaGFibGUgc3lzdGVtcyB3aXRoIGRpc3RhbmNlLCBlbmVyZ3kgY29zdCwgYW5kIGZsaWdodCB0aW1lLgCAwubkNbNiCmdldG5mdGJhc2UAAABd0+U1s2IKZ2V0bmZ0aW5mb/ADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldG5mdGluZm8Kc3VtbWFyeTogJ0dldCBORlQgc2NoZW1hIGFuZCB0ZW1wbGF0ZSBjb25maWd1cmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgQXRvbWljQXNzZXRzIHNjaGVtYXMgYW5kIHRlbXBsYXRlcyB0aGUgZ2FtZSBjb250cmFjdCBleHBlY3RzLCBwbHVzIHRoZSBjdXJyZW50IGBpdGVtX2lkIOKGkiAodGVtcGxhdGVfaWQsIHNjaGVtYV9uYW1lKWAgbWFwcGluZyBzdG9yZWQgaW4gdGhlIGBuZnRjb25maWdgIHRhYmxlLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHN5bmMgYXRvbWljYXNzZXRzIHN0YXRlIHdpdGggdGhlIGNvbnRyYWN0LgAAuMqbWLNiCWdldHBsYXllcv0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHBsYXllcgpzdW1tYXJ5OiAnR2V0IHBsYXllciBpbmZvcm1hdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBhIHBsYXllciBpbmNsdWRpbmcgYmFsYW5jZSwgZGVidCwgbmV0d29ydGgsIGVudGl0eSBjb3VudHMsIGFuZCBwcmljaW5nIGZvciBuZXh0IHB1cmNoYXNlcy4gUmV0dXJucyBpc19wbGF5ZXI9ZmFsc2UgaWYgdGhlIGFjY291bnQgaGFzIG5vdCBqb2luZWQgdGhlIGdhbWUuoLLJ+NFbs2IMZ2V0cHJvanN0YXRlywMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cHJvanN0YXRlCnN1bW1hcnk6ICdHZXQgcHJvamVjdGVkIGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHByb2plY3RlZCBzdGF0ZSBvZiBhbiBlbnRpdHkgYWZ0ZXIgYXBwbHlpbmcgdGhlIG5leHQgdGFza19jb3VudCBzY2hlZHVsZWQgdGFza3MgKG9yIGFsbCB0YXNrcyBpZiB0YXNrX2NvdW50IGlzIG9taXR0ZWQpLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIHRvIHByZXZpZXcgdGhlIHJlc3VsdCBvZiBhbiBlbnRpdHkncyBzY2hlZHVsZSB3aXRob3V0IHJlc29sdmluZyBvbi1jaGFpbi4AAFDVIXWzYglnZXRyZWNpcGWmAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRyZWNpcGUKc3VtbWFyeTogJ0dldCBhIHNpbmdsZSBjcmFmdGluZyByZWNpcGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSByZWNpcGUgd2hvc2Ugb3V0cHV0IG1hdGNoZXMgdGhlIGdpdmVuIGl0ZW0gaWQsIGluY2x1ZGluZyBpdHMgaW5wdXRzLCBibGVuZCB3ZWlnaHRzLCBzdGF0IHNsb3RzLCBhbmQgcmVzb2x2ZWQgaXRlbSBtYXNzIGluZm8uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGlzcGxheSBjcmFmdGluZyByZXF1aXJlbWVudHMuAABW1SF1s2IKZ2V0cmVjaXBlc6wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlY2lwZXMKc3VtbWFyeTogJ0xpc3QgY3JhZnRpbmcgcmVjaXBlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgYSBwYWdpbmF0ZWQgbGlzdCBvZiBjcmFmdGluZyByZWNpcGVzIHN0YXJ0aW5nIGF0IHRoZSBwcm92aWRlZCBsb3dlciBib3VuZCBvdXRwdXQgaXRlbSBpZCwgdXAgdG8gdGhlIHNwZWNpZmllZCBsaW1pdC4gRWFjaCBlbnRyeSBpbmNsdWRlcyBpbnB1dHMsIGJsZW5kIHdlaWdodHMsIHN0YXQgc2xvdHMsIGFuZCByZXNvbHZlZCBpdGVtIG1hc3MgaW5mby4AAM4GYXWzYgpnZXRyZXNjYXRzngMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ2V0cmVzY2F0cwpzdW1tYXJ5OiAnR2V0IHJlc291cmNlIGNhdGVnb3J5IGVudW0gdmFsdWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgZnVsbCBzZXQgb2YgcmVzb3VyY2UgY2F0ZWdvcnkgZW51bSB2YWx1ZXMgYW5kIHRoZWlyIHN0cmluZyBuYW1lcyAob3JlLCBnYXMsIHJlZ29saXRoLCBiaW9tYXNzLCBjcnlzdGFsKS4gVXNlZCBieSBvZmYtY2hhaW4gdG9vbGluZyB0byBkZWNvZGUgcmVzb3VyY2Ugc3VidHlwZSBpZGVudGlmaWVycy4AsNpXYXWzYgtnZXRyZXNlcnZlc/wDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc2VydmVzCnN1bW1hcnk6ICdHZXQgY3VycmVudCByZXNlcnZlIG1vZGlmaWNhdGlvbnMgYXQgYSBsb2NhdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyB0aGUgY2hhaW4ncyBtb2RpZmljYXRpb25zIHRvIGRlcml2ZWQgcmVzZXJ2ZXMgYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGUgZm9yIHRoZSBjdXJyZW50IGVwb2NoIGFzIGEgbGlzdCBvZiB7c3RyYXR1bSwgcmVtYWluaW5nfSBwYWlycy4gU3RyYXRhIG5vdCBwcmVzZW50IGluIHRoZSByZXNwb25zZSB1c2UgdGhlaXIgZGVyaXZlZCBpbml0aWFsIHJlc2VydmUuIENvbXBvc2Ugd2l0aCBTREsgZGVyaXZhdGlvbiB0byBnZXQgdGhlIGZ1bGwgcGVyLWxvY2F0aW9uIHN0cmF0YSB2aWV3LoAVuppidbNiDGdldHJlc291cmNlc4cDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHJlc291cmNlcwpzdW1tYXJ5OiAnR2V0IGFsbCByZXNvdXJjZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBpcyBhIHJlYWQtb25seSBxdWVyeSB0aGF0IHJldHVybnMgdGhlIHN1YnNldCBvZiBpdGVtcyBjbGFzc2lmaWVkIGFzIHJlc291cmNlcywgaW5jbHVkaW5nIGVhY2ggcmVzb3VyY2UncyBpZCwgbWFzcywgc3VidHlwZSwgYW5kIHRpZXIuIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZW51bWVyYXRlIGdhdGhlcmFibGUgbWF0ZXJpYWxzLgCAQm5fhbNiCmdldHNlcnZpY2UAAAAAONOIs2IIZ2V0c2xvdHO7Ay0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzbG90cwpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzbG90IGxheW91dHMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgaXMgYSByZWFkLW9ubHkgcXVlcnkgdGhhdCByZXR1cm5zIHRoZSBtb2R1bGUgc2xvdCBsYXlvdXQgZm9yIGV2ZXJ5IGVudGl0eSBpdGVtIHR5cGUsIGxpc3RpbmcgdGhlIG9yZGVyZWQgc2xvdCB0eXBlcyBhdmFpbGFibGUgZm9yIG1vZHVsZSBpbnN0YWxsYXRpb24uIFVzZWQgYnkgb2ZmLWNoYWluIHRvb2xpbmcgdG8gZGV0ZXJtaW5lIHdoaWNoIG1vZHVsZSB0eXBlcyBhcmUgY29tcGF0aWJsZSB3aXRoIGEgZ2l2ZW4gZW50aXR5IGh1bGwuAIDU2dyMs2IKZ2V0c3RyYXR1bdICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldHN0cmF0dW0Kc3VtbWFyeTogJ0dldCByZXNvdXJjZSBzdHJhdHVtIGRhdGEnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgcmVzb3VyY2Ugc3RyYXR1bSBkYXRhIGZvciBhIHNwZWNpZmljIGRlcHRoIGxheWVyIGF0IGEgY29vcmRpbmF0ZSwgaW5jbHVkaW5nIHRoZSBzdHJhdHVtIHNlZWQgaW5mbyBhbmQgZGVyaXZlZCByZXNvdXJjZSBzdGF0cy6AlbtGSo2zYgxnZXRzdW1tYXJpZXPoAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdW1tYXJpZXMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc3VtbWFyaWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBsaWdodHdlaWdodCBzdW1tYXJpZXMgb2YgYWxsIGVudGl0aWVzIG93bmVkIGJ5IGEgcGxheWVyIGluY2x1ZGluZyB0eXBlLCBpZCwgb3duZXIsIG5hbWUsIGxvY2F0aW9uLCBhbmQgaWRsZSBzdGF0dXMuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgBUpE1eyrNiC2dldHdvcm1ob2xlAJAdnubmqullDGdyb3VwdHJhbnNpdAAAotrm5qrpZQtncm91cHRyYXZlbJoELS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdyb3VwdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIG11bHRpcGxlIGVudGl0aWVzIHRvZ2V0aGVyJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWF0ZSBncm91cCB0cmF2ZWwgZm9yIG11bHRpcGxlIGVudGl0aWVzIHRvIGEgZGVzdGluYXRpb24uIEFsbCBlbnRpdGllcyBtdXN0IGJlIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFuZCBvd25lZCBieSB0aGUgY2FsbGVyLiBBdCBsZWFzdCBvbmUgZW50aXR5IHdpdGggZW5naW5lcyBpcyByZXF1aXJlZCB0byBwcm92aWRlIHRocnVzdC4gRmxpZ2h0IGR1cmF0aW9uIGlzIGNhbGN1bGF0ZWQgZnJvbSBjb21iaW5lZCB0aHJ1c3QgYW5kIHRvdGFsIG1hc3Mgb2YgYWxsIGVudGl0aWVzLiBDcmVhdGVzIGFuIGVudGl0eWdyb3VwIGZvciBhdG9taWMgcmVzb2x1dGlvbiBhbmQgY2FuY2VsbGF0aW9uLgAAAAAA0LBpBGhhc2j4AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhMjU2IGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTI1NiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAQITSsGkHaGFzaDUxMvsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2g1MTIKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGE1MTIgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhNTEyIGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4AKLsG5UurdAtpbXBvcnRjYXJnbwAAQIwK5UurdAppbXBvcnRjZWxsAOCzy1PlS6t0DGltcG9ydGVudGl0eQAAqqaX5UurdAtpbXBvcnRncm91cABwlTex5kurdAxpbXBvcnRwbGF5ZXIAuq/C6uZLq3QNaW1wb3J0cmVzZXJ2ZQAAVDYZ50urdAtpbXBvcnRzdGF0ZQAAAAAAADAdfQRqb2luxAEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogam9pbgpzdW1tYXJ5OiAnSm9pbiBhIGdhbWUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkpvaW4gYSBnYW1lIG9mIFNoaXBsb2FkAAAAADQ0tYkGbGF1bmNoAAAAAAAAkAyNBGxvYWQAgCE2WWVzmZMMbWlncmF0ZXRhc2tzAAAAAKAajpmTB21pZ3N3YXAAAAAAKrqsNpUIbW92ZXRpbGUAAACIVzPp8poJbmZ0aW1ndXJssgMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogbmZ0aW1ndXJsCnN1bW1hcnk6ICdHZXQgTkZUIGltYWdlIFVSTCBmb3IgYSBjYXJnbyBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGlzIGEgcmVhZC1vbmx5IHF1ZXJ5IHRoYXQgcmV0dXJucyB0aGUgaW1hZ2UgVVJMIHRoZSBjb250cmFjdCBlbWl0cyBmb3IgYSBnaXZlbiBjYXJnbyBpdGVtLCBvcHRpb25hbGx5IHNjb3BlZCB0byBhIGxvY2F0aW9uLiBVc2VkIGJ5IG9mZi1jaGFpbiB0b29saW5nIGFuZCBORlQgcmVuZGVyZXJzIHRvIGZldGNoIHRoZSBjYW5vbmljYWwgYXJ0d29yayBmb3IgYW4gaXRlbSBvciBwYWNrZWQgZW50aXR5LgAAAAD45TKdBm5vdGlmeYoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5vdGlmeQpzdW1tYXJ5OiAnVGFzayBsaWZlY3ljbGUgbm90aWZpY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gdGhhdCBub3RpZmllcyBlbnRpdHkgb3duZXJzIG9mIHRhc2sgbGlmZWN5Y2xlIGV2ZW50cyAocmVzb2x2ZWQsIGNhbmNlbGxlZCkuIENhbGxlZCBpbmxpbmUgd2hlbiB0YXNrcyBjaGFuZ2Ugc3RhdGUuIFVzZXMgcmVxdWlyZV9yZWNpcGllbnQgdG8gZW5hYmxlIG9mZi1jaGFpbiBtb25pdG9yaW5nIHZpYSBhY3Rpb24gdHJhY2VzLgAAZdcghUysCnBsYWNlY2FyZ2/JBC0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBwbGFjZWNhcmdvCnN1bW1hcnk6ICdSZXN0b3JlIE5GVCBjYXJnbyBvbnRvIGEgaG9zdCBlbnRpdHknCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiBjYWxsZWQgaW5saW5lIGJ5IHRoZSBwbGF0Zm9ybSBjb250cmFjdCBvbmx5LiBSZXN0b3JlcyB0aGUgY2FyZ28gcmVjb3JkZWQgaW4gYW4gdW53cmFwcGVkIE5GVCBvbnRvIGEgaG9zdCBlbnRpdHkuIFZhbGlkYXRlcyBob3N0IG93bmVyc2hpcCwgbG9hZGVycywgYW5kIHJlbWFpbmluZyBjYXBhY2l0eSwgZGVzZXJpYWxpemVzIHRoZSBORlQncyBpdGVtIGRhdGEsIGFuZCBhcHBlbmRzIGFuIHVud3JhcCB0YXNrIHRvIGRlbGl2ZXIgdGhlIGNhcmdvIHRvIHRoZSBob3N0LiBUaGUgcGxhdGZvcm0gY29udHJhY3QgY3JlZGl0cyB0aGUgZGVwb3NpdCByZWZ1bmQgYW5kIGJ1cm5zIHRoZSBhc3NldC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgB8dnkqhUysC3BsYWNlZW50aXR5wAQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcGxhY2VlbnRpdHkKc3VtbWFyeTogJ01hdGVyaWFsaXplIGEgcGFja2VkLWVudGl0eSBORlQgYXMgYSBsaXZlIGVudGl0eScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW50ZXJuYWwgYWN0aW9uIGNhbGxlZCBpbmxpbmUgYnkgdGhlIHBsYXRmb3JtIGNvbnRyYWN0IG9ubHkuIEVtcGxhY2VzIGEgbGl2ZSBvcmJpdGFsIHZlc3NlbCAoc2hpcCBvciBjb250YWluZXIpIGZyb20gaXRzIHBhY2tlZC1lbnRpdHkgTkZUIGRhdGEgYXQgdGhlIHJlY29yZGVkIHdyYXAgb3JpZ2luLCB0aGVuIHF1ZXVlcyB0cmF2ZWwgYW5kIHJlY2hhcmdlIHRhc2tzIHRvIGRlbGl2ZXIgaXQgdG8gdGhlIHRhcmdldCBuZXh1cyBhdCBmdWxsIGVuZXJneS4gVGhlIHBsYXRmb3JtIGNvbnRyYWN0IGNyZWRpdHMgdGhlIGRlcG9zaXQgcmVmdW5kIGFuZCBidXJucyB0aGUgYXNzZXQuIFJlcXVpcmVzIGNvbnRyYWN0IGF1dGhvcml0eS4AAACKXdOQughyZWNoYXJnZc0CLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlY2hhcmdlCnN1bW1hcnk6ICdSZWNoYXJnZSBzaGlwIGVuZXJneScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2NoZWR1bGUgYSByZWNoYXJnZSB0YXNrIGZvciBhbiBlbnRpdHkgdG8gcmVzdG9yZSBlbmVyZ3kgdG8gZnVsbCBjYXBhY2l0eS4gVGhlIHJlY2hhcmdlIGR1cmF0aW9uIGRlcGVuZHMgb24gY3VycmVudCBlbmVyZ3kgbGV2ZWwgYW5kIHJlY2hhcmdlIHJhdGUu4LPLUzV8l7oMcmVmcnNoZW50aXR5uAMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVmcnNoZW50aXR5CnN1bW1hcnk6ICdSZWZyZXNoIGRlcml2ZWQgZW50aXR5IHN0YXRlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZWNvbXB1dGUgZGVyaXZlZCBmaWVsZHMgb24gYW4gZW50aXR5IGZyb20gaXRzIGN1cnJlbnQgY2FyZ28gYW5kIG1vZHVsZXMsIHJlZnJlc2hpbmcgY2FwYWJpbGl0eSBzdGF0cyBhbmQgY2FyZ28gbWFzcy4gVGhlIGVudGl0eSBtdXN0IGJlIGlkbGUgd2l0aCBubyBzY2hlZHVsZWQgdGFza3MuIFVzZWQgdG8gcmVjb25jaWxlIGRlcml2ZWQgc3RhdGUgYWZ0ZXIgZGF0YSBtaWdyYXRpb25zIG9yIGNvbnRyYWN0IHVwZ3JhZGVzLqAiMpeqTaW6DHJlbW92ZW9yYWNsZQAAAAAAKGmmugZyZW5hbWUAAAAAQO1IsboHcmVzb2x2ZdADLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlc29sdmUKc3VtbWFyeTogJ0NvbXBsZXRlIHNjaGVkdWxlZCB0YXNrcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmVzb2x2ZSBjb21wbGV0ZWQgdGFza3MgaW4gYW4gZW50aXR5J3Mgc2NoZWR1bGUsIGFwcGx5aW5nIHRoZWlyIGVmZmVjdHMgKHJlY2hhcmdlIGVuZXJneSwgdXBkYXRlIGxvY2F0aW9uLCBsb2FkL3VubG9hZCBjYXJnbykuIElmIGNvdW50IGlzIHNwZWNpZmllZCwgcmVzb2x2ZSBleGFjdGx5IHRoYXQgbWFueSB0YXNrczsgb3RoZXJ3aXNlIHJlc29sdmUgYWxsIGNvbXBsZXRlZCB0YXNrcy4gRmFpbHMgaWYgY291bnQgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlZCB0YXNrcy4AQIxG7UixugpyZXNvbHZlYWxsAAAAAABEo7a6BnJldmVhbAAAAAAq6kSlvAhybW1vZHVsZbwDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJtbW9kdWxlCnN1bW1hcnk6ICdSZW1vdmUgYSBtb2R1bGUgZnJvbSBhIHNsb3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlbW92ZSBhbiBpbnN0YWxsZWQgbW9kdWxlIGZyb20gYSBzbG90IG9uIGEgbGl2ZSBlbnRpdHkgb3IgYSBwYWNrZWQgZW50aXR5IGluIGNhcmdvLiBUaGUgZW50aXR5IG11c3QgYmUgaWRsZSB3aXRoIG5vIHNjaGVkdWxlZCB0YXNrcy4gVGhlIG1vZHVsZSBpcyByZXR1cm5lZCB0byBjYXJnby4gRmFpbHMgaWYgdGhlIGVudGl0eSBkb2VzIG5vdCBoYXZlIGVub3VnaCBjYXJnbyBjYXBhY2l0eSB0byBob2xkIHRoZSByZXR1cm5lZCBtb2R1bGUuAAAAbKG8prwIcm1uZnRjZmehAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBybW5mdGNmZwpzdW1tYXJ5OiAnUmVtb3ZlIE5GVCB0ZW1wbGF0ZSBtYXBwaW5nIGZvciBhbiBpdGVtJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZW1vdmUgdGhlIEF0b21pY0Fzc2V0cyB0ZW1wbGF0ZSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gaWQgZnJvbSB0aGUgYG5mdGNvbmZpZ2AgdGFibGUuIEFmdGVyIHJlbW92YWwgdGhlIGl0ZW0gY2FuIG5vIGxvbmdlciBiZSB3cmFwcGVkIG9yIHVud3JhcHBlZCB1bnRpbCBhIG5ldyBtYXBwaW5nIGlzIHNldC4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgAAAMhth7LCCHNldGNpdmljAAAAwOlSirLCCXNldGNvb3JkcwAAAGAL5TWzwglzZXRuZnRjZmfEAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzZXRuZnRjZmcKc3VtbWFyeTogJ1NldCBORlQgdGVtcGxhdGUgbWFwcGluZyBmb3IgYW4gaXRlbScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQmluZCBhbiBpdGVtIGlkIHRvIGFuIEF0b21pY0Fzc2V0cyB0ZW1wbGF0ZSBpZCBhbmQgc2NoZW1hIG5hbWUuIFVzZWQgdG8gY29uZmlndXJlIGhvdyB0aGUgY29udHJhY3QgbWludHMgYW5kIHJlY29nbml6ZXMgTkZUcyBmb3IgYSBnaXZlbiBpdGVtLiBJbnNlcnRzIGEgbmV3IG1hcHBpbmcgaWYgb25lIGRvZXMgbm90IGV4aXN0LCBvciB1cGRhdGVzIHRoZSBleGlzdGluZyBtYXBwaW5nLiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAADICiKKs8IJc2V0c29ja2V0AJAibVjdlrPCDHNldHRocmVzaG9sZAAAMqaomsuzwgtzZXR3cmFwY29zdAAAgFKrmsuzwgpzZXR3cmFwZmVlAAAAAEDFnHXDB3NodXR0bGUAAACg7BrEacYJc3Rvd2Nhcmdv1QUtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3Rvd2NhcmdvCnN1bW1hcnk6ICdSZXNlcnZlIGEgY2FyZ28gc3RhY2sgZm9yIHdyYXBwaW5nIGludG8gYW4gTkZUJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gY2FsbGVkIGlubGluZSBieSB0aGUgcGxhdGZvcm0gY29udHJhY3Qgb25seS4gUmVzZXJ2ZXMgYW5kIGNvbnN1bWVzIGEgY2FyZ28gc3RhY2sgb24gYSBsaXZlIGVudGl0eSBmb3Igd3JhcHBpbmcgaW50byBhbiBORlQuIFZhbGlkYXRlcyBlbnRpdHkgb3duZXJzaGlwLCBsb2FkZXJzLCBhbmQgcHJlc2VuY2UgYXQgdGhlIG5leHVzLCBhbmQgY29uZmlybXMgdGhlIHRhcmdldCBjYXJnbyBzdGFjayBpcyBhdmFpbGFibGUgYW5kIG5vdCByZXNlcnZlZCBieSBhIHBlbmRpbmcgdGFzay4gQ29tcHV0ZXMgdGhlIHdyYXAgY29zdCBhbmQgZmVlLCBkZWJpdHMgdGhlbSBmcm9tIHRoZSBvd25lcidzIHBsYXRmb3JtIGRlcG9zaXQgYmFsYW5jZSwgZGVyaXZlcyB0aGUgTkZUJ3MgaW1tdXRhYmxlIGRhdGEsIGFuZCBtaW50cyB0aGUgTkZUIGlubGluZSBhcyB0aGUgZ2FtZSBjb250cmFjdCBiZWZvcmUgY29uc3VtaW5nIHRoZSBjYXJnby4gUmVxdWlyZXMgY29udHJhY3QgYXV0aG9yaXR5LgCAzy5PxWnGCnN0b3dlbnRpdHmZBS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzdG93ZW50aXR5CnN1bW1hcnk6ICdSZXNlcnZlIGFuIGVudGl0eSBmb3Igd3JhcHBpbmcgaW50byBhbiBORlQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkludGVybmFsIGFjdGlvbiBjYWxsZWQgaW5saW5lIGJ5IHRoZSBwbGF0Zm9ybSBjb250cmFjdCBvbmx5LiBSZXNlcnZlcyBhIHdob2xlIGVudGl0eSAoc2hpcCwgY29udGFpbmVyLCBvciBwbGFuZXRhcnkgc3RydWN0dXJlKSBmb3Igd3JhcHBpbmcgaW50byBhbiBORlQuIFRoZSBlbnRpdHkgbXVzdCBiZSBpZGxlIHdpdGggZW1wdHkgY2FyZ28gYW5kIG5vIHNjaGVkdWxlZCB0YXNrcy4gQ29tcHV0ZXMgdGhlIHdyYXAgY29zdCBhbmQgZmVlLCBkZWJpdHMgdGhlbSBmcm9tIHRoZSBvd25lcidzIHBsYXRmb3JtIGRlcG9zaXQgYmFsYW5jZSwgZGVyaXZlcyB0aGUgZW50aXR5IE5GVCdzIGltbXV0YWJsZSBkYXRhLCBtaW50cyB0aGUgTkZUIGlubGluZSBhcyB0aGUgZ2FtZSBjb250cmFjdCwgYW5kIGVyYXNlcyB0aGUgZW50aXR5IGZyb20gdGhlIHdvcmxkLiBSZXF1aXJlcyBjb250cmFjdCBhdXRob3JpdHkuAICKOlFZDccKc3dhcG1vZHVsZQAAAAAqulwNxwhzd2FwdGlsZQAAAAAgOzzNzQd0cmFuc2l0AAAAAABEtc3NBnRyYXZlbPsBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBhIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIHRyYXZlbCBvZiBhbiBlbnRpdHkgZnJvbSBpdHMgY3VycmVudCBsb2NhdGlvbiB0byBhIG5ldyBkZXN0aW5hdGlvbi4AwDSxRrXNzQp0cmF2ZWxwbGFuAAAAAJ7GqtLUCHVuZGVwbG955wQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdW5kZXBsb3kKc3VtbWFyeTogJ1BhY2sgYSBkZXBsb3llZCBlbnRpdHkgaW50byBhIGhvc3QnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClBhY2sgYW4gZW50aXR5IGludG8gYSBob3N0IGVudGl0eSdzIGNhcmdvIGFzIGEgcGFja2VkLWVudGl0eSBpdGVtLiBIb3N0IGFuZCB0YXJnZXQgbXVzdCBzaGFyZSB0aGUgc2FtZSBvd25lciBhbmQgY29vcmRpbmF0ZXMsIHRoZSBob3N0IG11c3QgaGF2ZSBsb2FkZXJzIGFuZCBlbm91Z2ggY2FwYWNpdHkgZm9yIHRoZSBwYWNrZWQgbWFzcywgYW5kIHRoZSB0YXJnZXQgbXVzdCBiZSBpZGxlIHdpdGggZW1wdHkgY2FyZ28uIENyZWF0ZXMgYW4gZW50aXR5Z3JvdXAgYW5kIHNjaGVkdWxlcyB1bmRlcGxveSB0YXNrcyBvbiBib3RoIGVudGl0aWVzOyBvbiByZXNvbHV0aW9uIHRoZSB0YXJnZXQgaXMgZXJhc2VkIGFuZCB0aGUgcGFja2VkIGVudGl0eSBpcyBhZGRlZCB0byB0aGUgaG9zdCdzIGNhcmdvLiBJbnZlcnNlIG9mIGRlcGxveS4AAAAAJEPj1AZ1bmxvYWQAAAAAQCVzWdUHdXBncmFkZQAAAAAAAFCv4QR3YXJwnwMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogd2FycApzdW1tYXJ5OiAnV2FycCB0byBhIGRlc3RpbmF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnN0YW50bHkgdGVsZXBvcnQgYW4gZW50aXR5IHRvIGEgZGVzdGluYXRpb24gc3lzdGVtLiBSZXF1aXJlcyB3YXJwIGNhcGFiaWxpdHksIGZ1bGwgZW5lcmd5LCBlbXB0eSBjYXJnbywgYW5kIGFuIGVtcHR5IHNjaGVkdWxlLiBUaGUgZGVzdGluYXRpb24gbXVzdCBiZSBhIHZhbGlkIHN5c3RlbSB3aXRoaW4gd2FycCByYW5nZS4gUmVzb2x2ZXMgaW1tZWRpYXRlbHkgYXMgYSB6ZXJvLWR1cmF0aW9uIHRhc2suAAAAAACgquMEd2lwZbIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGUKc3VtbWFyeTogJ0RFQlVHOiB3aXBlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLRYAAAAAAMquQQNpNjQAAAljYXJnb19yb3cAmFuTIuS2QwNpNjQAAA9jaXZpY2NvbmZpZ19yb3cAAAAAYOlMRANpNjQAAAljbGFpbV9yb3cAAADgqox1RANpNjQAAAtjbHVzdGVyX3JvdwAAAABkJyVFA2k2NAAACmNvbW1pdF9yb3cAAAAA+OzyVANpNjQAAAplbnRpdHlfcm93AABzEvjs8lQDaTY0AAAKZW50aXR5X3JvdwCqppf57PJUA2k2NAAAD2VudGl0eWdyb3VwX3JvdwAAsAr77PJUA2k2NAAADmVudGl0eV9zZXFfcm93AAAAAICGaFUDaTY0AAAJZXBvY2hfcm93AAAAAACAD30DaTY0AAAHam9iX3JvdwAAYG5NivKaA2k2NAAADW5mdGNvbmZpZ19yb3cAAGALqYjMpQNpNjQAABFvcmFjbGVfY29uZmlnX3JvdwAAAACriMylA2k2NAAACm9yYWNsZV9yb3cAAAAAXOVNrANpNjQAAApwbGF5ZXJfcm93AAAAQO2rsLoDaTY0AAALcmVzZXJ2ZV9yb3cAAAAARKO2ugNpNjQAAApyZXZlYWxfcm93AAAAQCG3r8IDaTY0AAALc2VydmljZV9yb3cAAAAAAJVNxgNpNjQAAAlzdGF0ZV9yb3cAAAAAAKyqzwNpNjQAAAl0eXBlc19yb3cAAHNrUlTN5QNpNjQAAA53cmFwY29uZmlnX3JvdwAAABlTVM3lA2k2NAAADHdyYXBjb3N0X3JvdwERU2hpcGxvYWQgKFNlcnZlcikRU2hpcGxvYWQgKFNlcnZlcikAAABFAADINNYUnT4MdGFza19yZXN1bHRzAAAAAESFpkEOY2FuY2VsX3Jlc3VsdHMAAMg0VulMRAx0YXNrX3Jlc3VsdHMAAAAAgLzMRQx0YXNrX3Jlc3VsdHMAAACHvrzMRQtqb2JfcmVjZWlwdAAAAA27SKVKDHRhc2tfcmVzdWx0cwAAAAB4GqtKDHRhc2tfcmVzdWx0cwCAzy5PhbBKBnN0cmluZwAAAABc1bJhDHRhc2tfcmVzdWx0cwDANLFe1bJhDHRhc2tfcmVzdWx0cwDAVRnriLJiC2NsdXN0ZXJfcm93AABgbk2KsmILZ2FtZV9jb25maWcAQHaYVpWyYg5leHRlbmRlZF9hc3NldAAUmiZjl7JiBnVpbnQ2NABUPI65qLJiCHVpbnQxNltdAADAEeWpsmILZW51bV9yZXN1bHQAsHLZ5amyYg1lbnRpdHlfaW5mb1tdAADw2eWpsmILZW50aXR5X2luZm+Qp7s1U7qyYhBmb290cHJpbnRfcmVzdWx0AEw2SarssmIPaXRlbWRhdGFfcmVzdWx0AABOTqrssmIPaXRlbV9pZHNfcmVzdWx0AAAAWKrssmIKaXRlbXNfaW5mbwBU9Vmq7LJiBXVpbnQ4gFX1WarssmILZW51bV9yZXN1bHQAAAAAH/qyYgtqb2JzX3Jlc3VsdABMVjJNB7NiEGtpbmRfbWV0YV9yZXN1bHQAJnXZIBqzYg1sb2NhdGlvbl9pbmZvAIDJJiEas2IQbG9jYXRpb25fZGVyaXZlZACwqj4nKrNiC2VudW1fcmVzdWx0AABWUScqs2IObW9kdWxlc19yZXN1bHQAAPDnGjWzYgtuZWFyYnlfaW5mbwCAwubkNbNiCHN0cmluZ1tdAABd0+U1s2IObmZ0aW5mb19yZXN1bHQAALjKm1izYgtwbGF5ZXJfaW5mb6CyyfjRW7NiD3Byb2plY3RlZF9zdGF0ZQAAUNUhdbNiDnJlY2lwZXNfcmVzdWx0AABW1SF1s2IOcmVjaXBlc19yZXN1bHQAAM4GYXWzYgtlbnVtX3Jlc3VsdACw2ldhdbNiE3N0cmF0dW1fcmVtYWluaW5nW12AFbqaYnWzYhByZXNvdXJjZXNfcmVzdWx0AIBCbl+Fs2ILc2VydmljZV9yb3cAAAA404izYhVlbnRpdHlfbGF5b3V0c19yZXN1bHQAgNTZ3IyzYgxzdHJhdHVtX2RhdGGAlbtGSo2zYhBlbnRpdHlfc3VtbWFyeVtdAFSkTV7Ks2INd29ybWhvbGVfaW5mb5AdnubmqullDHRhc2tfcmVzdWx0cwCi2ubmqullDHRhc2tfcmVzdWx0cwAAAAAA0LBpC2NoZWNrc3VtMjU2AAAAQITSsGkLY2hlY2tzdW01MTIAAAAANDS1iQx0YXNrX3Jlc3VsdHMAAAAAAJAMjQx0YXNrX3Jlc3VsdHMAAAAquqw2lQx0YXNrX3Jlc3VsdHMAAIhXM+nymgZzdHJpbmcAAGXXIIVMrAx0YXNrX3Jlc3VsdHMAfHZ5KoVMrAx0YXNrX3Jlc3VsdHMAAACKXdOQugx0YXNrX3Jlc3VsdHMAAABA7Uixug9yZXNvbHZlX3Jlc3VsdHMAQIxG7UixuhJyZXNvbHZlYWxsX3Jlc3VsdHMAAABAxZx1wwx0YXNrX3Jlc3VsdHMAAKDsGsRpxgx0YXNrX3Jlc3VsdHMAgM8uT8Vpxgx0YXNrX3Jlc3VsdHMAAAAqulwNxwx0YXNrX3Jlc3VsdHMAAAAgOzzNzQx0YXNrX3Jlc3VsdHMAAAAARLXNzQx0YXNrX3Jlc3VsdHMAwDSxRrXNzQx0YXNrX3Jlc3VsdHMAAACexqrS1Ax0YXNrX3Jlc3VsdHMAAAAAJEPj1Ax0YXNrX3Jlc3VsdHMAAABAJXNZ1Qx0YXNrX3Jlc3VsdHMAAAAAAFCv4Qx0YXNrX3Jlc3VsdHM=');
444
444
  const abi = ABI.from(abiBlob);
445
445
  var Types;
446
446
  (function (Types) {
@@ -561,6 +561,24 @@ var Types;
561
561
  Struct.type('blend')
562
562
  ], blend);
563
563
  Types.blend = blend;
564
+ let builder_lane = class builder_lane extends Struct {
565
+ };
566
+ __decorate([
567
+ Struct.field(UInt8)
568
+ ], builder_lane.prototype, "slot_index", void 0);
569
+ __decorate([
570
+ Struct.field(UInt16)
571
+ ], builder_lane.prototype, "speed", void 0);
572
+ __decorate([
573
+ Struct.field(UInt32)
574
+ ], builder_lane.prototype, "drain", void 0);
575
+ __decorate([
576
+ Struct.field(UInt16)
577
+ ], builder_lane.prototype, "output_pct", void 0);
578
+ builder_lane = __decorate([
579
+ Struct.type('builder_lane')
580
+ ], builder_lane);
581
+ Types.builder_lane = builder_lane;
564
582
  let buildplot = class buildplot extends Struct {
565
583
  };
566
584
  __decorate([
@@ -624,6 +642,18 @@ var Types;
624
642
  Struct.type('cancel_results')
625
643
  ], cancel_results);
626
644
  Types.cancel_results = cancel_results;
645
+ let canceljob = class canceljob extends Struct {
646
+ };
647
+ __decorate([
648
+ Struct.field(UInt64)
649
+ ], canceljob.prototype, "job_id", void 0);
650
+ __decorate([
651
+ Struct.field(UInt64)
652
+ ], canceljob.prototype, "ship_id", void 0);
653
+ canceljob = __decorate([
654
+ Struct.type('canceljob')
655
+ ], canceljob);
656
+ Types.canceljob = canceljob;
627
657
  let cargo_row = class cargo_row extends Struct {
628
658
  };
629
659
  __decorate([
@@ -675,6 +705,15 @@ var Types;
675
705
  Struct.type('cargo_view')
676
706
  ], cargo_view);
677
707
  Types.cargo_view = cargo_view;
708
+ let civicconfig_row = class civicconfig_row extends Struct {
709
+ };
710
+ __decorate([
711
+ Struct.field(Name)
712
+ ], civicconfig_row.prototype, "civic_owner", void 0);
713
+ civicconfig_row = __decorate([
714
+ Struct.type('civicconfig_row')
715
+ ], civicconfig_row);
716
+ Types.civicconfig_row = civicconfig_row;
678
717
  let claim_row = class claim_row extends Struct {
679
718
  };
680
719
  __decorate([
@@ -684,6 +723,18 @@ var Types;
684
723
  Struct.type('claim_row')
685
724
  ], claim_row);
686
725
  Types.claim_row = claim_row;
726
+ let claimjob = class claimjob extends Struct {
727
+ };
728
+ __decorate([
729
+ Struct.field(UInt64)
730
+ ], claimjob.prototype, "job_id", void 0);
731
+ __decorate([
732
+ Struct.field(UInt64)
733
+ ], claimjob.prototype, "ship_id", void 0);
734
+ claimjob = __decorate([
735
+ Struct.type('claimjob')
736
+ ], claimjob);
737
+ Types.claimjob = claimjob;
687
738
  let cluster_slot = class cluster_slot extends Struct {
688
739
  };
689
740
  __decorate([
@@ -882,6 +933,21 @@ var Types;
882
933
  Struct.type('coordinates')
883
934
  ], coordinates);
884
935
  Types.coordinates = coordinates;
936
+ let coupling = class coupling extends Struct {
937
+ };
938
+ __decorate([
939
+ Struct.field(entity_ref)
940
+ ], coupling.prototype, "counterpart", void 0);
941
+ __decorate([
942
+ Struct.field(UInt64)
943
+ ], coupling.prototype, "hold", void 0);
944
+ __decorate([
945
+ Struct.field(UInt8)
946
+ ], coupling.prototype, "kind", void 0);
947
+ coupling = __decorate([
948
+ Struct.type('coupling')
949
+ ], coupling);
950
+ Types.coupling = coupling;
885
951
  let craft = class craft extends Struct {
886
952
  };
887
953
  __decorate([
@@ -924,6 +990,39 @@ var Types;
924
990
  Struct.type('crafter_lane')
925
991
  ], crafter_lane);
926
992
  Types.crafter_lane = crafter_lane;
993
+ let craftjob = class craftjob extends Struct {
994
+ };
995
+ __decorate([
996
+ Struct.field(UInt64)
997
+ ], craftjob.prototype, "ship_id", void 0);
998
+ __decorate([
999
+ Struct.field(UInt64)
1000
+ ], craftjob.prototype, "workshop_id", void 0);
1001
+ __decorate([
1002
+ Struct.field(UInt8)
1003
+ ], craftjob.prototype, "slot", void 0);
1004
+ __decorate([
1005
+ Struct.field(UInt16)
1006
+ ], craftjob.prototype, "recipe_id", void 0);
1007
+ __decorate([
1008
+ Struct.field(UInt32)
1009
+ ], craftjob.prototype, "quantity", void 0);
1010
+ __decorate([
1011
+ Struct.field(cargo_item, { array: true })
1012
+ ], craftjob.prototype, "inputs", void 0);
1013
+ craftjob = __decorate([
1014
+ Struct.type('craftjob')
1015
+ ], craftjob);
1016
+ Types.craftjob = craftjob;
1017
+ let delentity = class delentity extends Struct {
1018
+ };
1019
+ __decorate([
1020
+ Struct.field(UInt64)
1021
+ ], delentity.prototype, "entity_id", void 0);
1022
+ delentity = __decorate([
1023
+ Struct.type('delentity')
1024
+ ], delentity);
1025
+ Types.delentity = delentity;
927
1026
  let demolish = class demolish extends Struct {
928
1027
  };
929
1028
  __decorate([
@@ -1121,18 +1220,18 @@ var Types;
1121
1220
  __decorate([
1122
1221
  Struct.field(cargo_item, { array: true })
1123
1222
  ], task.prototype, "cargo", void 0);
1223
+ __decorate([
1224
+ Struct.field(coupling, { array: true })
1225
+ ], task.prototype, "couplings", void 0);
1124
1226
  __decorate([
1125
1227
  Struct.field(entity_ref, { optional: true })
1126
- ], task.prototype, "entitytarget", void 0);
1228
+ ], task.prototype, "subject", void 0);
1127
1229
  __decorate([
1128
1230
  Struct.field(UInt64, { optional: true })
1129
1231
  ], task.prototype, "entitygroup", void 0);
1130
1232
  __decorate([
1131
1233
  Struct.field(UInt32, { optional: true })
1132
1234
  ], task.prototype, "energy_cost", void 0);
1133
- __decorate([
1134
- Struct.field(UInt64, { optional: true })
1135
- ], task.prototype, "hold", void 0);
1136
1235
  __decorate([
1137
1236
  Struct.field(UInt16, { optional: true })
1138
1237
  ], task.prototype, "target_item_id", void 0);
@@ -1241,6 +1340,9 @@ var Types;
1241
1340
  __decorate([
1242
1341
  Struct.field(crafter_lane, { array: true })
1243
1342
  ], entity_info.prototype, "crafter_lanes", void 0);
1343
+ __decorate([
1344
+ Struct.field(builder_lane, { array: true })
1345
+ ], entity_info.prototype, "builder_lanes", void 0);
1244
1346
  __decorate([
1245
1347
  Struct.field(loader_lane, { array: true })
1246
1348
  ], entity_info.prototype, "loader_lanes", void 0);
@@ -1280,6 +1382,9 @@ var Types;
1280
1382
  __decorate([
1281
1383
  Struct.field(slot_def, { array: true })
1282
1384
  ], entity_layout.prototype, "slots", void 0);
1385
+ __decorate([
1386
+ Struct.field(UInt32)
1387
+ ], entity_layout.prototype, "base_hullmass", void 0);
1283
1388
  entity_layout = __decorate([
1284
1389
  Struct.type('entity_layout')
1285
1390
  ], entity_layout);
@@ -1383,7 +1488,7 @@ var Types;
1383
1488
  Struct.field(Name)
1384
1489
  ], entity_task_info.prototype, "entity_type", void 0);
1385
1490
  __decorate([
1386
- Struct.field(UInt8)
1491
+ Struct.field(UInt32)
1387
1492
  ], entity_task_info.prototype, "task_count", void 0);
1388
1493
  __decorate([
1389
1494
  Struct.field(TimePoint)
@@ -1503,6 +1608,30 @@ var Types;
1503
1608
  Struct.type('gather')
1504
1609
  ], gather);
1505
1610
  Types.gather = gather;
1611
+ let gatherplan = class gatherplan extends Struct {
1612
+ };
1613
+ __decorate([
1614
+ Struct.field(UInt64)
1615
+ ], gatherplan.prototype, "source_id", void 0);
1616
+ __decorate([
1617
+ Struct.field(UInt64)
1618
+ ], gatherplan.prototype, "destination_id", void 0);
1619
+ __decorate([
1620
+ Struct.field(UInt16)
1621
+ ], gatherplan.prototype, "stratum", void 0);
1622
+ __decorate([
1623
+ Struct.field(UInt32)
1624
+ ], gatherplan.prototype, "quantity", void 0);
1625
+ __decorate([
1626
+ Struct.field('bool')
1627
+ ], gatherplan.prototype, "recharge", void 0);
1628
+ __decorate([
1629
+ Struct.field(Bytes)
1630
+ ], gatherplan.prototype, "slots", void 0);
1631
+ gatherplan = __decorate([
1632
+ Struct.type('gatherplan')
1633
+ ], gatherplan);
1634
+ Types.gatherplan = gatherplan;
1506
1635
  let genesisfleet = class genesisfleet extends Struct {
1507
1636
  };
1508
1637
  __decorate([
@@ -1638,6 +1767,15 @@ var Types;
1638
1767
  Struct.type('getitemtypes')
1639
1768
  ], getitemtypes);
1640
1769
  Types.getitemtypes = getitemtypes;
1770
+ let getjobs = class getjobs extends Struct {
1771
+ };
1772
+ __decorate([
1773
+ Struct.field(UInt64)
1774
+ ], getjobs.prototype, "workshop_id", void 0);
1775
+ getjobs = __decorate([
1776
+ Struct.type('getjobs')
1777
+ ], getjobs);
1778
+ Types.getjobs = getjobs;
1641
1779
  let getkindmeta = class getkindmeta extends Struct {
1642
1780
  };
1643
1781
  getkindmeta = __decorate([
@@ -1770,6 +1908,15 @@ var Types;
1770
1908
  Struct.type('getresources')
1771
1909
  ], getresources);
1772
1910
  Types.getresources = getresources;
1911
+ let getservice = class getservice extends Struct {
1912
+ };
1913
+ __decorate([
1914
+ Struct.field(UInt64)
1915
+ ], getservice.prototype, "workshop_id", void 0);
1916
+ getservice = __decorate([
1917
+ Struct.type('getservice')
1918
+ ], getservice);
1919
+ Types.getservice = getservice;
1773
1920
  let getslots = class getslots extends Struct {
1774
1921
  };
1775
1922
  getslots = __decorate([
@@ -1881,6 +2028,24 @@ var Types;
1881
2028
  Struct.type('importcargo')
1882
2029
  ], importcargo);
1883
2030
  Types.importcargo = importcargo;
2031
+ let importcell = class importcell extends Struct {
2032
+ };
2033
+ __decorate([
2034
+ Struct.field(UInt64)
2035
+ ], importcell.prototype, "root", void 0);
2036
+ __decorate([
2037
+ Struct.field(Int8)
2038
+ ], importcell.prototype, "gx", void 0);
2039
+ __decorate([
2040
+ Struct.field(Int8)
2041
+ ], importcell.prototype, "gy", void 0);
2042
+ __decorate([
2043
+ Struct.field(UInt64)
2044
+ ], importcell.prototype, "entity_id", void 0);
2045
+ importcell = __decorate([
2046
+ Struct.type('importcell')
2047
+ ], importcell);
2048
+ Types.importcell = importcell;
1884
2049
  let importentity = class importentity extends Struct {
1885
2050
  };
1886
2051
  __decorate([
@@ -2091,6 +2256,72 @@ var Types;
2091
2256
  Struct.type('items_info')
2092
2257
  ], items_info);
2093
2258
  Types.items_info = items_info;
2259
+ let job_receipt = class job_receipt extends Struct {
2260
+ };
2261
+ __decorate([
2262
+ Struct.field(UInt64)
2263
+ ], job_receipt.prototype, "job_id", void 0);
2264
+ __decorate([
2265
+ Struct.field(TimePoint)
2266
+ ], job_receipt.prototype, "starts_at", void 0);
2267
+ __decorate([
2268
+ Struct.field(TimePoint)
2269
+ ], job_receipt.prototype, "completes_at", void 0);
2270
+ job_receipt = __decorate([
2271
+ Struct.type('job_receipt')
2272
+ ], job_receipt);
2273
+ Types.job_receipt = job_receipt;
2274
+ let job_row = class job_row extends Struct {
2275
+ };
2276
+ __decorate([
2277
+ Struct.field(UInt64)
2278
+ ], job_row.prototype, "id", void 0);
2279
+ __decorate([
2280
+ Struct.field(UInt64)
2281
+ ], job_row.prototype, "workshop", void 0);
2282
+ __decorate([
2283
+ Struct.field(UInt8)
2284
+ ], job_row.prototype, "socket", void 0);
2285
+ __decorate([
2286
+ Struct.field(Name)
2287
+ ], job_row.prototype, "owner", void 0);
2288
+ __decorate([
2289
+ Struct.field(UInt64)
2290
+ ], job_row.prototype, "ship_id", void 0);
2291
+ __decorate([
2292
+ Struct.field(coordinates)
2293
+ ], job_row.prototype, "coords", void 0);
2294
+ __decorate([
2295
+ Struct.field(TimePoint)
2296
+ ], job_row.prototype, "starts_at", void 0);
2297
+ __decorate([
2298
+ Struct.field(TimePoint)
2299
+ ], job_row.prototype, "completes_at", void 0);
2300
+ __decorate([
2301
+ Struct.field(UInt16)
2302
+ ], job_row.prototype, "recipe_id", void 0);
2303
+ __decorate([
2304
+ Struct.field(UInt32)
2305
+ ], job_row.prototype, "quantity", void 0);
2306
+ __decorate([
2307
+ Struct.field(UInt32)
2308
+ ], job_row.prototype, "energy_paid", void 0);
2309
+ __decorate([
2310
+ Struct.field(cargo_item, { array: true })
2311
+ ], job_row.prototype, "cargo", void 0);
2312
+ job_row = __decorate([
2313
+ Struct.type('job_row')
2314
+ ], job_row);
2315
+ Types.job_row = job_row;
2316
+ let jobs_result = class jobs_result extends Struct {
2317
+ };
2318
+ __decorate([
2319
+ Struct.field(job_row, { array: true })
2320
+ ], jobs_result.prototype, "jobs", void 0);
2321
+ jobs_result = __decorate([
2322
+ Struct.type('jobs_result')
2323
+ ], jobs_result);
2324
+ Types.jobs_result = jobs_result;
2094
2325
  let join = class join extends Struct {
2095
2326
  };
2096
2327
  __decorate([
@@ -2226,6 +2457,24 @@ var Types;
2226
2457
  Struct.type('location_info')
2227
2458
  ], location_info);
2228
2459
  Types.location_info = location_info;
2460
+ let migratetasks = class migratetasks extends Struct {
2461
+ };
2462
+ __decorate([
2463
+ Struct.field(UInt32)
2464
+ ], migratetasks.prototype, "batch", void 0);
2465
+ migratetasks = __decorate([
2466
+ Struct.type('migratetasks')
2467
+ ], migratetasks);
2468
+ Types.migratetasks = migratetasks;
2469
+ let migswap = class migswap extends Struct {
2470
+ };
2471
+ __decorate([
2472
+ Struct.field(UInt32)
2473
+ ], migswap.prototype, "batch", void 0);
2474
+ migswap = __decorate([
2475
+ Struct.type('migswap')
2476
+ ], migswap);
2477
+ Types.migswap = migswap;
2229
2478
  let module_info = class module_info extends Struct {
2230
2479
  };
2231
2480
  __decorate([
@@ -2579,6 +2828,9 @@ var Types;
2579
2828
  __decorate([
2580
2829
  Struct.field(crafter_lane, { array: true })
2581
2830
  ], projected_state.prototype, "crafter_lanes", void 0);
2831
+ __decorate([
2832
+ Struct.field(builder_lane, { array: true })
2833
+ ], projected_state.prototype, "builder_lanes", void 0);
2582
2834
  __decorate([
2583
2835
  Struct.field(loader_lane, { array: true })
2584
2836
  ], projected_state.prototype, "loader_lanes", void 0);
@@ -2787,6 +3039,48 @@ var Types;
2787
3039
  Struct.type('rmnftcfg')
2788
3040
  ], rmnftcfg);
2789
3041
  Types.rmnftcfg = rmnftcfg;
3042
+ let route_waypoint = class route_waypoint extends Struct {
3043
+ };
3044
+ __decorate([
3045
+ Struct.field(Int64)
3046
+ ], route_waypoint.prototype, "x", void 0);
3047
+ __decorate([
3048
+ Struct.field(Int64)
3049
+ ], route_waypoint.prototype, "y", void 0);
3050
+ route_waypoint = __decorate([
3051
+ Struct.type('route_waypoint')
3052
+ ], route_waypoint);
3053
+ Types.route_waypoint = route_waypoint;
3054
+ let service_socket = class service_socket extends Struct {
3055
+ };
3056
+ __decorate([
3057
+ Struct.field('bool')
3058
+ ], service_socket.prototype, "open", void 0);
3059
+ service_socket = __decorate([
3060
+ Struct.type('service_socket')
3061
+ ], service_socket);
3062
+ Types.service_socket = service_socket;
3063
+ let service_row = class service_row extends Struct {
3064
+ };
3065
+ __decorate([
3066
+ Struct.field(UInt64)
3067
+ ], service_row.prototype, "entity", void 0);
3068
+ __decorate([
3069
+ Struct.field(service_socket, { array: true })
3070
+ ], service_row.prototype, "sockets", void 0);
3071
+ service_row = __decorate([
3072
+ Struct.type('service_row')
3073
+ ], service_row);
3074
+ Types.service_row = service_row;
3075
+ let setcivic = class setcivic extends Struct {
3076
+ };
3077
+ __decorate([
3078
+ Struct.field(Name)
3079
+ ], setcivic.prototype, "account", void 0);
3080
+ setcivic = __decorate([
3081
+ Struct.type('setcivic')
3082
+ ], setcivic);
3083
+ Types.setcivic = setcivic;
2790
3084
  let setcoords = class setcoords extends Struct {
2791
3085
  };
2792
3086
  __decorate([
@@ -2817,6 +3111,21 @@ var Types;
2817
3111
  Struct.type('setnftcfg')
2818
3112
  ], setnftcfg);
2819
3113
  Types.setnftcfg = setnftcfg;
3114
+ let setsocket = class setsocket extends Struct {
3115
+ };
3116
+ __decorate([
3117
+ Struct.field(UInt64)
3118
+ ], setsocket.prototype, "workshop_id", void 0);
3119
+ __decorate([
3120
+ Struct.field(UInt8)
3121
+ ], setsocket.prototype, "slot", void 0);
3122
+ __decorate([
3123
+ Struct.field('bool')
3124
+ ], setsocket.prototype, "open", void 0);
3125
+ setsocket = __decorate([
3126
+ Struct.type('setsocket')
3127
+ ], setsocket);
3128
+ Types.setsocket = setsocket;
2820
3129
  let setthreshold = class setthreshold extends Struct {
2821
3130
  };
2822
3131
  __decorate([
@@ -2853,6 +3162,24 @@ var Types;
2853
3162
  Struct.type('setwrapfee')
2854
3163
  ], setwrapfee);
2855
3164
  Types.setwrapfee = setwrapfee;
3165
+ let shuttle = class shuttle extends Struct {
3166
+ };
3167
+ __decorate([
3168
+ Struct.field(UInt64)
3169
+ ], shuttle.prototype, "carrier", void 0);
3170
+ __decorate([
3171
+ Struct.field(UInt64)
3172
+ ], shuttle.prototype, "from_id", void 0);
3173
+ __decorate([
3174
+ Struct.field(UInt64)
3175
+ ], shuttle.prototype, "to_id", void 0);
3176
+ __decorate([
3177
+ Struct.field(cargo_item, { array: true })
3178
+ ], shuttle.prototype, "items", void 0);
3179
+ shuttle = __decorate([
3180
+ Struct.type('shuttle')
3181
+ ], shuttle);
3182
+ Types.shuttle = shuttle;
2856
3183
  let stowcargo = class stowcargo extends Struct {
2857
3184
  };
2858
3185
  __decorate([
@@ -3021,6 +3348,21 @@ var Types;
3021
3348
  Struct.type('travel')
3022
3349
  ], travel);
3023
3350
  Types.travel = travel;
3351
+ let travelplan = class travelplan extends Struct {
3352
+ };
3353
+ __decorate([
3354
+ Struct.field(entity_ref, { array: true })
3355
+ ], travelplan.prototype, "entities", void 0);
3356
+ __decorate([
3357
+ Struct.field(route_waypoint, { array: true })
3358
+ ], travelplan.prototype, "waypoints", void 0);
3359
+ __decorate([
3360
+ Struct.field('bool')
3361
+ ], travelplan.prototype, "recharge", void 0);
3362
+ travelplan = __decorate([
3363
+ Struct.type('travelplan')
3364
+ ], travelplan);
3365
+ Types.travelplan = travelplan;
3024
3366
  let types_row = class types_row extends Struct {
3025
3367
  };
3026
3368
  __decorate([
@@ -3156,19 +3498,23 @@ var Types;
3156
3498
  })(Types || (Types = {}));
3157
3499
  const TableMap = {
3158
3500
  cargo: Types.cargo_row,
3501
+ civicconfig: Types.civicconfig_row,
3159
3502
  claims: Types.claim_row,
3160
3503
  cluster: Types.cluster_row,
3161
3504
  commit: Types.commit_row,
3162
3505
  entity: Types.entity_row,
3506
+ 'entity.mig': Types.entity_row,
3163
3507
  entitygroup: Types.entitygroup_row,
3164
3508
  entityseq: Types.entity_seq_row,
3165
3509
  epoch: Types.epoch_row,
3510
+ jobs: Types.job_row,
3166
3511
  nftconfig: Types.nftconfig_row,
3167
3512
  oraclecfg: Types.oracle_config_row,
3168
3513
  oracles: Types.oracle_row,
3169
3514
  player: Types.player_row,
3170
3515
  reserve: Types.reserve_row,
3171
3516
  reveal: Types.reveal_row,
3517
+ service: Types.service_row,
3172
3518
  state: Types.state_row,
3173
3519
  types: Types.types_row,
3174
3520
  wrapconfig: Types.wrapconfig_row,
@@ -3289,11 +3635,13 @@ const INSUFFICIENT_BALANCE = 'Insufficient balance.';
3289
3635
  const INSUFFICIENT_ITEM_QUANTITY = 'Insufficient quantity in cargo.';
3290
3636
  const INSUFFICIENT_ITEM_SUPPLY = 'Insufficient supply of item at location.';
3291
3637
 
3292
- const PRECISION$1 = 10000;
3638
+ const PRECISION = 10000;
3293
3639
  const CRAFT_ENERGY_DIVISOR = 150000;
3294
3640
  const PLANETARY_STRUCTURE_Z = 0;
3295
3641
  const CONTAINER_Z = 300;
3296
3642
  const TRAVEL_MAX_DURATION = 86400;
3643
+ const BASE_HAUL_PENALTY_MILLI$1 = 300;
3644
+ const HAULER_EFFICIENCY_DENOM$1 = 10000;
3297
3645
  const MIN_ORBITAL_ALTITUDE = 800;
3298
3646
  const MAX_ORBITAL_ALTITUDE = 3000;
3299
3647
  const BASE_ORBITAL_MASS = 100000;
@@ -3309,15 +3657,15 @@ var TaskType;
3309
3657
  TaskType[TaskType["GATHER"] = 5] = "GATHER";
3310
3658
  TaskType[TaskType["WARP"] = 6] = "WARP";
3311
3659
  TaskType[TaskType["CRAFT"] = 7] = "CRAFT";
3312
- TaskType[TaskType["DEPLOY"] = 8] = "DEPLOY";
3313
3660
  TaskType[TaskType["TRANSIT"] = 9] = "TRANSIT";
3314
3661
  TaskType[TaskType["UNWRAP"] = 10] = "UNWRAP";
3315
3662
  TaskType[TaskType["UNDEPLOY"] = 11] = "UNDEPLOY";
3663
+ TaskType[TaskType["LAUNCH"] = 12] = "LAUNCH";
3316
3664
  TaskType[TaskType["DEMOLISH"] = 13] = "DEMOLISH";
3317
- TaskType[TaskType["CLAIMPLOT"] = 14] = "CLAIMPLOT";
3318
3665
  TaskType[TaskType["BUILDPLOT"] = 15] = "BUILDPLOT";
3319
3666
  TaskType[TaskType["CHARGE"] = 16] = "CHARGE";
3320
3667
  TaskType[TaskType["UPGRADE"] = 17] = "UPGRADE";
3668
+ TaskType[TaskType["SHUTTLE"] = 18] = "SHUTTLE";
3321
3669
  })(TaskType || (TaskType = {}));
3322
3670
  var HoldKind;
3323
3671
  (function (HoldKind) {
@@ -3325,6 +3673,7 @@ var HoldKind;
3325
3673
  HoldKind[HoldKind["PUSH"] = 2] = "PUSH";
3326
3674
  HoldKind[HoldKind["GATHER"] = 3] = "GATHER";
3327
3675
  HoldKind[HoldKind["BUILD"] = 4] = "BUILD";
3676
+ HoldKind[HoldKind["FLIGHT"] = 5] = "FLIGHT";
3328
3677
  HoldKind[HoldKind["UPGRADE"] = 6] = "UPGRADE";
3329
3678
  })(HoldKind || (HoldKind = {}));
3330
3679
  var LocationType;
@@ -3459,6 +3808,7 @@ const ITEM_HAULER_T1 = 10106;
3459
3808
  const ITEM_WARP_T1 = 10107;
3460
3809
  const ITEM_BATTERY_T1 = 10108;
3461
3810
  const ITEM_LAUNCHER_T1 = 10109;
3811
+ const ITEM_BUILDER_T1 = 10110;
3462
3812
  const ITEM_CONTAINER_T1_PACKED = 10200;
3463
3813
  const ITEM_SHIP_T1_PACKED = 10201;
3464
3814
  const ITEM_WAREHOUSE_T1_PACKED = 10202;
@@ -3467,6 +3817,15 @@ const ITEM_FACTORY_T1_PACKED = 10204;
3467
3817
  const ITEM_MASS_DRIVER_T1_PACKED = 10205;
3468
3818
  const ITEM_MASS_CATCHER_T1_PACKED = 10206;
3469
3819
  const ITEM_HUB_T1_PACKED = 10207;
3820
+ const ITEM_WORKSHOP_T1_PACKED = 10208;
3821
+ const ITEM_ROUSTABOUT_T1_PACKED = 10210;
3822
+ const ITEM_PROSPECTOR_T1_PACKED = 10211;
3823
+ const ITEM_TENDER_T1_PACKED = 10212;
3824
+ const ITEM_WRIGHT_T1_PACKED = 10213;
3825
+ const ITEM_TUG_T1_PACKED = 10214;
3826
+ const ITEM_PORTER_T1_PACKED = 10215;
3827
+ const ITEM_WRANGLER_T1_PACKED = 10216;
3828
+ const ITEM_DREDGER_T1_PACKED = 10217;
3470
3829
  const ITEM_PLATE_T2 = 20001;
3471
3830
  const ITEM_FRAME_T2 = 20002;
3472
3831
  const ITEM_PLASMA_CELL_T2 = 20003;
@@ -4270,47 +4629,31 @@ var recipes = [
4270
4629
  ]
4271
4630
  },
4272
4631
  {
4273
- outputItemId: 10200,
4274
- outputMass: 1900000,
4632
+ outputItemId: 10110,
4633
+ outputMass: 960000,
4275
4634
  inputs: [
4276
4635
  {
4277
- itemId: 10001,
4278
- quantity: 600
4636
+ itemId: 10005,
4637
+ quantity: 300
4279
4638
  },
4280
4639
  {
4281
- itemId: 10008,
4282
- quantity: 600
4640
+ itemId: 10002,
4641
+ quantity: 300
4283
4642
  }
4284
4643
  ],
4285
4644
  statSlots: [
4286
- {
4287
- sources: [
4288
- {
4289
- inputIndex: 0,
4290
- statIndex: 0
4291
- }
4292
- ]
4293
- },
4294
- {
4295
- sources: [
4296
- {
4297
- inputIndex: 0,
4298
- statIndex: 1
4299
- }
4300
- ]
4301
- },
4302
4645
  {
4303
4646
  sources: [
4304
4647
  {
4305
4648
  inputIndex: 1,
4306
- statIndex: 0
4649
+ statIndex: 1
4307
4650
  }
4308
4651
  ]
4309
4652
  },
4310
4653
  {
4311
4654
  sources: [
4312
4655
  {
4313
- inputIndex: 1,
4656
+ inputIndex: 0,
4314
4657
  statIndex: 1
4315
4658
  }
4316
4659
  ]
@@ -4320,28 +4663,16 @@ var recipes = [
4320
4663
  ]
4321
4664
  },
4322
4665
  {
4323
- outputItemId: 10201,
4324
- outputMass: 2400000,
4666
+ outputItemId: 10200,
4667
+ outputMass: 1900000,
4325
4668
  inputs: [
4326
4669
  {
4327
4670
  itemId: 10001,
4328
- quantity: 300
4671
+ quantity: 600
4329
4672
  },
4330
4673
  {
4331
4674
  itemId: 10008,
4332
- quantity: 300
4333
- },
4334
- {
4335
- itemId: 10007,
4336
- quantity: 300
4337
- },
4338
- {
4339
- itemId: 10003,
4340
- quantity: 300
4341
- },
4342
- {
4343
- itemId: 10006,
4344
- quantity: 300
4675
+ quantity: 600
4345
4676
  }
4346
4677
  ],
4347
4678
  statSlots: [
@@ -4363,10 +4694,18 @@ var recipes = [
4363
4694
  },
4364
4695
  {
4365
4696
  sources: [
4697
+ {
4698
+ inputIndex: 1,
4699
+ statIndex: 0
4700
+ }
4366
4701
  ]
4367
4702
  },
4368
4703
  {
4369
4704
  sources: [
4705
+ {
4706
+ inputIndex: 1,
4707
+ statIndex: 1
4708
+ }
4370
4709
  ]
4371
4710
  }
4372
4711
  ],
@@ -4538,12 +4877,28 @@ var recipes = [
4538
4877
  ]
4539
4878
  },
4540
4879
  {
4541
- outputItemId: 20001,
4542
- outputMass: 4800,
4880
+ outputItemId: 10210,
4881
+ outputMass: 1600000,
4543
4882
  inputs: [
4544
4883
  {
4545
- itemId: 102,
4546
- quantity: 12
4884
+ itemId: 10001,
4885
+ quantity: 200
4886
+ },
4887
+ {
4888
+ itemId: 10008,
4889
+ quantity: 200
4890
+ },
4891
+ {
4892
+ itemId: 10007,
4893
+ quantity: 200
4894
+ },
4895
+ {
4896
+ itemId: 10003,
4897
+ quantity: 200
4898
+ },
4899
+ {
4900
+ itemId: 10006,
4901
+ quantity: 200
4547
4902
  }
4548
4903
  ],
4549
4904
  statSlots: [
@@ -4558,27 +4913,746 @@ var recipes = [
4558
4913
  {
4559
4914
  sources: [
4560
4915
  {
4561
- inputIndex: 0,
4562
- statIndex: 2
4916
+ inputIndex: 1,
4917
+ statIndex: 0
4563
4918
  }
4564
4919
  ]
4565
4920
  },
4566
4921
  {
4567
4922
  sources: [
4568
4923
  {
4569
- inputIndex: 0,
4570
- statIndex: 1
4924
+ inputIndex: 2,
4925
+ statIndex: 0
4571
4926
  }
4572
4927
  ]
4573
- }
4574
- ],
4575
- blendWeights: [
4576
- ]
4577
- },
4578
- {
4579
- outputItemId: 20002,
4580
- outputMass: 4800,
4581
- inputs: [
4928
+ },
4929
+ {
4930
+ sources: [
4931
+ {
4932
+ inputIndex: 3,
4933
+ statIndex: 0
4934
+ }
4935
+ ]
4936
+ },
4937
+ {
4938
+ sources: [
4939
+ {
4940
+ inputIndex: 4,
4941
+ statIndex: 0
4942
+ }
4943
+ ]
4944
+ }
4945
+ ],
4946
+ blendWeights: [
4947
+ ]
4948
+ },
4949
+ {
4950
+ outputItemId: 10211,
4951
+ outputMass: 2400000,
4952
+ inputs: [
4953
+ {
4954
+ itemId: 10005,
4955
+ quantity: 100
4956
+ },
4957
+ {
4958
+ itemId: 10002,
4959
+ quantity: 100
4960
+ },
4961
+ {
4962
+ itemId: 10010,
4963
+ quantity: 100
4964
+ },
4965
+ {
4966
+ itemId: 10009,
4967
+ quantity: 100
4968
+ },
4969
+ {
4970
+ itemId: 10004,
4971
+ quantity: 100
4972
+ },
4973
+ {
4974
+ itemId: 10210,
4975
+ quantity: 1
4976
+ }
4977
+ ],
4978
+ statSlots: [
4979
+ {
4980
+ sources: [
4981
+ {
4982
+ inputIndex: 0,
4983
+ statIndex: 0
4984
+ },
4985
+ {
4986
+ inputIndex: 5,
4987
+ statIndex: 0
4988
+ }
4989
+ ]
4990
+ },
4991
+ {
4992
+ sources: [
4993
+ {
4994
+ inputIndex: 1,
4995
+ statIndex: 0
4996
+ },
4997
+ {
4998
+ inputIndex: 5,
4999
+ statIndex: 1
5000
+ }
5001
+ ]
5002
+ },
5003
+ {
5004
+ sources: [
5005
+ {
5006
+ inputIndex: 2,
5007
+ statIndex: 0
5008
+ },
5009
+ {
5010
+ inputIndex: 5,
5011
+ statIndex: 2
5012
+ }
5013
+ ]
5014
+ },
5015
+ {
5016
+ sources: [
5017
+ {
5018
+ inputIndex: 3,
5019
+ statIndex: 0
5020
+ },
5021
+ {
5022
+ inputIndex: 5,
5023
+ statIndex: 3
5024
+ }
5025
+ ]
5026
+ },
5027
+ {
5028
+ sources: [
5029
+ {
5030
+ inputIndex: 4,
5031
+ statIndex: 0
5032
+ },
5033
+ {
5034
+ inputIndex: 5,
5035
+ statIndex: 4
5036
+ }
5037
+ ]
5038
+ }
5039
+ ],
5040
+ blendWeights: [
5041
+ ],
5042
+ sourceSubclass: 10210
5043
+ },
5044
+ {
5045
+ outputItemId: 10212,
5046
+ outputMass: 2400000,
5047
+ inputs: [
5048
+ {
5049
+ itemId: 10005,
5050
+ quantity: 100
5051
+ },
5052
+ {
5053
+ itemId: 10002,
5054
+ quantity: 100
5055
+ },
5056
+ {
5057
+ itemId: 10010,
5058
+ quantity: 100
5059
+ },
5060
+ {
5061
+ itemId: 10009,
5062
+ quantity: 100
5063
+ },
5064
+ {
5065
+ itemId: 10004,
5066
+ quantity: 100
5067
+ },
5068
+ {
5069
+ itemId: 10210,
5070
+ quantity: 1
5071
+ }
5072
+ ],
5073
+ statSlots: [
5074
+ {
5075
+ sources: [
5076
+ {
5077
+ inputIndex: 0,
5078
+ statIndex: 0
5079
+ },
5080
+ {
5081
+ inputIndex: 5,
5082
+ statIndex: 0
5083
+ }
5084
+ ]
5085
+ },
5086
+ {
5087
+ sources: [
5088
+ {
5089
+ inputIndex: 1,
5090
+ statIndex: 0
5091
+ },
5092
+ {
5093
+ inputIndex: 5,
5094
+ statIndex: 1
5095
+ }
5096
+ ]
5097
+ },
5098
+ {
5099
+ sources: [
5100
+ {
5101
+ inputIndex: 2,
5102
+ statIndex: 0
5103
+ },
5104
+ {
5105
+ inputIndex: 5,
5106
+ statIndex: 2
5107
+ }
5108
+ ]
5109
+ },
5110
+ {
5111
+ sources: [
5112
+ {
5113
+ inputIndex: 3,
5114
+ statIndex: 0
5115
+ },
5116
+ {
5117
+ inputIndex: 5,
5118
+ statIndex: 3
5119
+ }
5120
+ ]
5121
+ },
5122
+ {
5123
+ sources: [
5124
+ {
5125
+ inputIndex: 4,
5126
+ statIndex: 0
5127
+ },
5128
+ {
5129
+ inputIndex: 5,
5130
+ statIndex: 4
5131
+ }
5132
+ ]
5133
+ }
5134
+ ],
5135
+ blendWeights: [
5136
+ ],
5137
+ sourceSubclass: 10210
5138
+ },
5139
+ {
5140
+ outputItemId: 10213,
5141
+ outputMass: 2400000,
5142
+ inputs: [
5143
+ {
5144
+ itemId: 10005,
5145
+ quantity: 100
5146
+ },
5147
+ {
5148
+ itemId: 10002,
5149
+ quantity: 100
5150
+ },
5151
+ {
5152
+ itemId: 10010,
5153
+ quantity: 100
5154
+ },
5155
+ {
5156
+ itemId: 10009,
5157
+ quantity: 100
5158
+ },
5159
+ {
5160
+ itemId: 10004,
5161
+ quantity: 100
5162
+ },
5163
+ {
5164
+ itemId: 10210,
5165
+ quantity: 1
5166
+ }
5167
+ ],
5168
+ statSlots: [
5169
+ {
5170
+ sources: [
5171
+ {
5172
+ inputIndex: 0,
5173
+ statIndex: 0
5174
+ },
5175
+ {
5176
+ inputIndex: 5,
5177
+ statIndex: 0
5178
+ }
5179
+ ]
5180
+ },
5181
+ {
5182
+ sources: [
5183
+ {
5184
+ inputIndex: 1,
5185
+ statIndex: 0
5186
+ },
5187
+ {
5188
+ inputIndex: 5,
5189
+ statIndex: 1
5190
+ }
5191
+ ]
5192
+ },
5193
+ {
5194
+ sources: [
5195
+ {
5196
+ inputIndex: 2,
5197
+ statIndex: 0
5198
+ },
5199
+ {
5200
+ inputIndex: 5,
5201
+ statIndex: 2
5202
+ }
5203
+ ]
5204
+ },
5205
+ {
5206
+ sources: [
5207
+ {
5208
+ inputIndex: 3,
5209
+ statIndex: 0
5210
+ },
5211
+ {
5212
+ inputIndex: 5,
5213
+ statIndex: 3
5214
+ }
5215
+ ]
5216
+ },
5217
+ {
5218
+ sources: [
5219
+ {
5220
+ inputIndex: 4,
5221
+ statIndex: 0
5222
+ },
5223
+ {
5224
+ inputIndex: 5,
5225
+ statIndex: 4
5226
+ }
5227
+ ]
5228
+ }
5229
+ ],
5230
+ blendWeights: [
5231
+ ],
5232
+ sourceSubclass: 10210
5233
+ },
5234
+ {
5235
+ outputItemId: 10214,
5236
+ outputMass: 2400000,
5237
+ inputs: [
5238
+ {
5239
+ itemId: 10005,
5240
+ quantity: 100
5241
+ },
5242
+ {
5243
+ itemId: 10002,
5244
+ quantity: 100
5245
+ },
5246
+ {
5247
+ itemId: 10010,
5248
+ quantity: 100
5249
+ },
5250
+ {
5251
+ itemId: 10009,
5252
+ quantity: 100
5253
+ },
5254
+ {
5255
+ itemId: 10004,
5256
+ quantity: 100
5257
+ },
5258
+ {
5259
+ itemId: 10210,
5260
+ quantity: 1
5261
+ }
5262
+ ],
5263
+ statSlots: [
5264
+ {
5265
+ sources: [
5266
+ {
5267
+ inputIndex: 0,
5268
+ statIndex: 0
5269
+ },
5270
+ {
5271
+ inputIndex: 5,
5272
+ statIndex: 0
5273
+ }
5274
+ ]
5275
+ },
5276
+ {
5277
+ sources: [
5278
+ {
5279
+ inputIndex: 1,
5280
+ statIndex: 0
5281
+ },
5282
+ {
5283
+ inputIndex: 5,
5284
+ statIndex: 1
5285
+ }
5286
+ ]
5287
+ },
5288
+ {
5289
+ sources: [
5290
+ {
5291
+ inputIndex: 2,
5292
+ statIndex: 0
5293
+ },
5294
+ {
5295
+ inputIndex: 5,
5296
+ statIndex: 2
5297
+ }
5298
+ ]
5299
+ },
5300
+ {
5301
+ sources: [
5302
+ {
5303
+ inputIndex: 3,
5304
+ statIndex: 0
5305
+ },
5306
+ {
5307
+ inputIndex: 5,
5308
+ statIndex: 3
5309
+ }
5310
+ ]
5311
+ },
5312
+ {
5313
+ sources: [
5314
+ {
5315
+ inputIndex: 4,
5316
+ statIndex: 0
5317
+ },
5318
+ {
5319
+ inputIndex: 5,
5320
+ statIndex: 4
5321
+ }
5322
+ ]
5323
+ }
5324
+ ],
5325
+ blendWeights: [
5326
+ ],
5327
+ sourceSubclass: 10210
5328
+ },
5329
+ {
5330
+ outputItemId: 10215,
5331
+ outputMass: 2400000,
5332
+ inputs: [
5333
+ {
5334
+ itemId: 10005,
5335
+ quantity: 100
5336
+ },
5337
+ {
5338
+ itemId: 10002,
5339
+ quantity: 100
5340
+ },
5341
+ {
5342
+ itemId: 10010,
5343
+ quantity: 100
5344
+ },
5345
+ {
5346
+ itemId: 10009,
5347
+ quantity: 100
5348
+ },
5349
+ {
5350
+ itemId: 10004,
5351
+ quantity: 100
5352
+ },
5353
+ {
5354
+ itemId: 10210,
5355
+ quantity: 1
5356
+ }
5357
+ ],
5358
+ statSlots: [
5359
+ {
5360
+ sources: [
5361
+ {
5362
+ inputIndex: 0,
5363
+ statIndex: 0
5364
+ },
5365
+ {
5366
+ inputIndex: 5,
5367
+ statIndex: 0
5368
+ }
5369
+ ]
5370
+ },
5371
+ {
5372
+ sources: [
5373
+ {
5374
+ inputIndex: 1,
5375
+ statIndex: 0
5376
+ },
5377
+ {
5378
+ inputIndex: 5,
5379
+ statIndex: 1
5380
+ }
5381
+ ]
5382
+ },
5383
+ {
5384
+ sources: [
5385
+ {
5386
+ inputIndex: 2,
5387
+ statIndex: 0
5388
+ },
5389
+ {
5390
+ inputIndex: 5,
5391
+ statIndex: 2
5392
+ }
5393
+ ]
5394
+ },
5395
+ {
5396
+ sources: [
5397
+ {
5398
+ inputIndex: 3,
5399
+ statIndex: 0
5400
+ },
5401
+ {
5402
+ inputIndex: 5,
5403
+ statIndex: 3
5404
+ }
5405
+ ]
5406
+ },
5407
+ {
5408
+ sources: [
5409
+ {
5410
+ inputIndex: 4,
5411
+ statIndex: 0
5412
+ },
5413
+ {
5414
+ inputIndex: 5,
5415
+ statIndex: 4
5416
+ }
5417
+ ]
5418
+ }
5419
+ ],
5420
+ blendWeights: [
5421
+ ],
5422
+ sourceSubclass: 10210
5423
+ },
5424
+ {
5425
+ outputItemId: 10216,
5426
+ outputMass: 3600000,
5427
+ inputs: [
5428
+ {
5429
+ itemId: 10005,
5430
+ quantity: 150
5431
+ },
5432
+ {
5433
+ itemId: 10002,
5434
+ quantity: 150
5435
+ },
5436
+ {
5437
+ itemId: 10010,
5438
+ quantity: 150
5439
+ },
5440
+ {
5441
+ itemId: 10009,
5442
+ quantity: 150
5443
+ },
5444
+ {
5445
+ itemId: 10004,
5446
+ quantity: 150
5447
+ },
5448
+ {
5449
+ itemId: 10211,
5450
+ quantity: 1
5451
+ }
5452
+ ],
5453
+ statSlots: [
5454
+ {
5455
+ sources: [
5456
+ {
5457
+ inputIndex: 0,
5458
+ statIndex: 0
5459
+ },
5460
+ {
5461
+ inputIndex: 5,
5462
+ statIndex: 0
5463
+ }
5464
+ ]
5465
+ },
5466
+ {
5467
+ sources: [
5468
+ {
5469
+ inputIndex: 1,
5470
+ statIndex: 0
5471
+ },
5472
+ {
5473
+ inputIndex: 5,
5474
+ statIndex: 1
5475
+ }
5476
+ ]
5477
+ },
5478
+ {
5479
+ sources: [
5480
+ {
5481
+ inputIndex: 2,
5482
+ statIndex: 0
5483
+ },
5484
+ {
5485
+ inputIndex: 5,
5486
+ statIndex: 2
5487
+ }
5488
+ ]
5489
+ },
5490
+ {
5491
+ sources: [
5492
+ {
5493
+ inputIndex: 3,
5494
+ statIndex: 0
5495
+ },
5496
+ {
5497
+ inputIndex: 5,
5498
+ statIndex: 3
5499
+ }
5500
+ ]
5501
+ },
5502
+ {
5503
+ sources: [
5504
+ {
5505
+ inputIndex: 4,
5506
+ statIndex: 0
5507
+ },
5508
+ {
5509
+ inputIndex: 5,
5510
+ statIndex: 4
5511
+ }
5512
+ ]
5513
+ }
5514
+ ],
5515
+ blendWeights: [
5516
+ ],
5517
+ sourceSubclass: 10211
5518
+ },
5519
+ {
5520
+ outputItemId: 10217,
5521
+ outputMass: 3600000,
5522
+ inputs: [
5523
+ {
5524
+ itemId: 10005,
5525
+ quantity: 150
5526
+ },
5527
+ {
5528
+ itemId: 10002,
5529
+ quantity: 150
5530
+ },
5531
+ {
5532
+ itemId: 10010,
5533
+ quantity: 150
5534
+ },
5535
+ {
5536
+ itemId: 10009,
5537
+ quantity: 150
5538
+ },
5539
+ {
5540
+ itemId: 10004,
5541
+ quantity: 150
5542
+ },
5543
+ {
5544
+ itemId: 10211,
5545
+ quantity: 1
5546
+ }
5547
+ ],
5548
+ statSlots: [
5549
+ {
5550
+ sources: [
5551
+ {
5552
+ inputIndex: 0,
5553
+ statIndex: 0
5554
+ },
5555
+ {
5556
+ inputIndex: 5,
5557
+ statIndex: 0
5558
+ }
5559
+ ]
5560
+ },
5561
+ {
5562
+ sources: [
5563
+ {
5564
+ inputIndex: 1,
5565
+ statIndex: 0
5566
+ },
5567
+ {
5568
+ inputIndex: 5,
5569
+ statIndex: 1
5570
+ }
5571
+ ]
5572
+ },
5573
+ {
5574
+ sources: [
5575
+ {
5576
+ inputIndex: 2,
5577
+ statIndex: 0
5578
+ },
5579
+ {
5580
+ inputIndex: 5,
5581
+ statIndex: 2
5582
+ }
5583
+ ]
5584
+ },
5585
+ {
5586
+ sources: [
5587
+ {
5588
+ inputIndex: 3,
5589
+ statIndex: 0
5590
+ },
5591
+ {
5592
+ inputIndex: 5,
5593
+ statIndex: 3
5594
+ }
5595
+ ]
5596
+ },
5597
+ {
5598
+ sources: [
5599
+ {
5600
+ inputIndex: 4,
5601
+ statIndex: 0
5602
+ },
5603
+ {
5604
+ inputIndex: 5,
5605
+ statIndex: 4
5606
+ }
5607
+ ]
5608
+ }
5609
+ ],
5610
+ blendWeights: [
5611
+ ],
5612
+ sourceSubclass: 10211
5613
+ },
5614
+ {
5615
+ outputItemId: 20001,
5616
+ outputMass: 4800,
5617
+ inputs: [
5618
+ {
5619
+ itemId: 102,
5620
+ quantity: 12
5621
+ }
5622
+ ],
5623
+ statSlots: [
5624
+ {
5625
+ sources: [
5626
+ {
5627
+ inputIndex: 0,
5628
+ statIndex: 0
5629
+ }
5630
+ ]
5631
+ },
5632
+ {
5633
+ sources: [
5634
+ {
5635
+ inputIndex: 0,
5636
+ statIndex: 2
5637
+ }
5638
+ ]
5639
+ },
5640
+ {
5641
+ sources: [
5642
+ {
5643
+ inputIndex: 0,
5644
+ statIndex: 1
5645
+ }
5646
+ ]
5647
+ }
5648
+ ],
5649
+ blendWeights: [
5650
+ ]
5651
+ },
5652
+ {
5653
+ outputItemId: 20002,
5654
+ outputMass: 4800,
5655
+ inputs: [
4582
5656
  {
4583
5657
  itemId: 402,
4584
5658
  quantity: 6
@@ -5137,27 +6211,27 @@ var recipes = [
5137
6211
  outputMass: 3840000,
5138
6212
  inputs: [
5139
6213
  {
5140
- itemId: 20001,
5141
- quantity: 300
6214
+ itemId: 20005,
6215
+ quantity: 150
5142
6216
  },
5143
6217
  {
5144
- itemId: 20008,
5145
- quantity: 300
6218
+ itemId: 20002,
6219
+ quantity: 150
5146
6220
  },
5147
6221
  {
5148
- itemId: 20007,
5149
- quantity: 300
6222
+ itemId: 20010,
6223
+ quantity: 150
5150
6224
  },
5151
6225
  {
5152
- itemId: 20003,
5153
- quantity: 300
6226
+ itemId: 20009,
6227
+ quantity: 150
5154
6228
  },
5155
6229
  {
5156
- itemId: 20006,
5157
- quantity: 300
6230
+ itemId: 20004,
6231
+ quantity: 150
5158
6232
  },
5159
6233
  {
5160
- itemId: 10201,
6234
+ itemId: 10211,
5161
6235
  quantity: 1
5162
6236
  }
5163
6237
  ],
@@ -5177,8 +6251,8 @@ var recipes = [
5177
6251
  {
5178
6252
  sources: [
5179
6253
  {
5180
- inputIndex: 0,
5181
- statIndex: 1
6254
+ inputIndex: 1,
6255
+ statIndex: 0
5182
6256
  },
5183
6257
  {
5184
6258
  inputIndex: 5,
@@ -5188,43 +6262,71 @@ var recipes = [
5188
6262
  },
5189
6263
  {
5190
6264
  sources: [
6265
+ {
6266
+ inputIndex: 2,
6267
+ statIndex: 0
6268
+ },
6269
+ {
6270
+ inputIndex: 5,
6271
+ statIndex: 2
6272
+ }
6273
+ ]
6274
+ },
6275
+ {
6276
+ sources: [
6277
+ {
6278
+ inputIndex: 3,
6279
+ statIndex: 0
6280
+ },
6281
+ {
6282
+ inputIndex: 5,
6283
+ statIndex: 3
6284
+ }
5191
6285
  ]
5192
6286
  },
5193
6287
  {
5194
6288
  sources: [
6289
+ {
6290
+ inputIndex: 4,
6291
+ statIndex: 0
6292
+ },
6293
+ {
6294
+ inputIndex: 5,
6295
+ statIndex: 4
6296
+ }
5195
6297
  ]
5196
6298
  }
5197
6299
  ],
5198
6300
  blendWeights: [
5199
6301
  ],
5200
- sourceSubclass: 10201
6302
+ sourceSubclass: 10211
5201
6303
  },
5202
6304
  {
5203
6305
  outputItemId: 20211,
5204
6306
  outputMass: 3840000,
5205
6307
  inputs: [
5206
6308
  {
5207
- itemId: 20001,
5208
- quantity: 300
6309
+ itemId: 20005,
6310
+ quantity: 150
5209
6311
  },
5210
6312
  {
5211
6313
  itemId: 20002,
5212
- quantity: 300
6314
+ quantity: 150
5213
6315
  },
5214
6316
  {
5215
- itemId: 20008,
5216
- quantity: 300
6317
+ itemId: 20010,
6318
+ quantity: 150
5217
6319
  },
5218
6320
  {
5219
- itemId: 20010,
5220
- quantity: 300
6321
+ itemId: 20009,
6322
+ quantity: 150
5221
6323
  },
5222
6324
  {
5223
6325
  itemId: 20004,
5224
- quantity: 300
6326
+ quantity: 150
5225
6327
  },
5226
6328
  {
5227
- itemId: 10201,
6329
+ itemId: 10214,
5228
6330
  quantity: 1
5229
6331
  }
5230
6332
  ],
@@ -5244,8 +6346,8 @@ var recipes = [
5244
6346
  {
5245
6347
  sources: [
5246
6348
  {
5247
- inputIndex: 0,
5248
- statIndex: 1
6349
+ inputIndex: 1,
6350
+ statIndex: 0
5249
6351
  },
5250
6352
  {
5251
6353
  inputIndex: 5,
@@ -5254,141 +6356,390 @@ var recipes = [
5254
6356
  ]
5255
6357
  },
5256
6358
  {
5257
- sources: [
5258
- ]
6359
+ sources: [
6360
+ {
6361
+ inputIndex: 2,
6362
+ statIndex: 0
6363
+ },
6364
+ {
6365
+ inputIndex: 5,
6366
+ statIndex: 2
6367
+ }
6368
+ ]
6369
+ },
6370
+ {
6371
+ sources: [
6372
+ {
6373
+ inputIndex: 3,
6374
+ statIndex: 0
6375
+ },
6376
+ {
6377
+ inputIndex: 5,
6378
+ statIndex: 3
6379
+ }
6380
+ ]
6381
+ },
6382
+ {
6383
+ sources: [
6384
+ {
6385
+ inputIndex: 4,
6386
+ statIndex: 0
6387
+ },
6388
+ {
6389
+ inputIndex: 5,
6390
+ statIndex: 4
6391
+ }
6392
+ ]
6393
+ }
6394
+ ],
6395
+ blendWeights: [
6396
+ ],
6397
+ sourceSubclass: 10214
6398
+ }
6399
+ ];
6400
+
6401
+ var entities = [
6402
+ {
6403
+ entityItemId: 10200,
6404
+ slots: [
6405
+ ],
6406
+ baseHullmass: 100000
6407
+ },
6408
+ {
6409
+ entityItemId: 10201,
6410
+ slots: [
6411
+ {
6412
+ type: "any",
6413
+ outputPct: 80,
6414
+ maxTier: 1
6415
+ },
6416
+ {
6417
+ type: "any",
6418
+ outputPct: 80,
6419
+ maxTier: 1
6420
+ },
6421
+ {
6422
+ type: "any",
6423
+ outputPct: 80,
6424
+ maxTier: 1
6425
+ },
6426
+ {
6427
+ type: "any",
6428
+ outputPct: 80,
6429
+ maxTier: 1
6430
+ },
6431
+ {
6432
+ type: "any",
6433
+ outputPct: 80,
6434
+ maxTier: 1
6435
+ }
6436
+ ],
6437
+ baseHullmass: 4000000
6438
+ },
6439
+ {
6440
+ entityItemId: 10202,
6441
+ slots: [
6442
+ {
6443
+ type: "loader",
6444
+ outputPct: 100,
6445
+ maxTier: 1
6446
+ },
6447
+ {
6448
+ type: "storage",
6449
+ outputPct: 100,
6450
+ maxTier: 1
6451
+ },
6452
+ {
6453
+ type: "storage",
6454
+ outputPct: 100,
6455
+ maxTier: 1
6456
+ },
6457
+ {
6458
+ type: "storage",
6459
+ outputPct: 100,
6460
+ maxTier: 1
6461
+ },
6462
+ {
6463
+ type: "storage",
6464
+ outputPct: 100,
6465
+ maxTier: 1
6466
+ }
6467
+ ],
6468
+ baseHullmass: 100000
6469
+ },
6470
+ {
6471
+ entityItemId: 10203,
6472
+ slots: [
6473
+ {
6474
+ type: "generator",
6475
+ outputPct: 200,
6476
+ maxTier: 1
6477
+ },
6478
+ {
6479
+ type: "gatherer",
6480
+ outputPct: 200,
6481
+ maxTier: 1
6482
+ }
6483
+ ],
6484
+ baseHullmass: 100000
6485
+ },
6486
+ {
6487
+ entityItemId: 10204,
6488
+ slots: [
6489
+ {
6490
+ type: "generator",
6491
+ outputPct: 200,
6492
+ maxTier: 1
6493
+ },
6494
+ {
6495
+ type: "crafter",
6496
+ outputPct: 200,
6497
+ maxTier: 1
6498
+ }
6499
+ ],
6500
+ baseHullmass: 100000
6501
+ },
6502
+ {
6503
+ entityItemId: 10205,
6504
+ slots: [
6505
+ {
6506
+ type: "generator",
6507
+ outputPct: 200,
6508
+ maxTier: 1
6509
+ },
6510
+ {
6511
+ type: "launcher",
6512
+ outputPct: 200,
6513
+ maxTier: 1
6514
+ }
6515
+ ],
6516
+ baseHullmass: 100000
6517
+ },
6518
+ {
6519
+ entityItemId: 10206,
6520
+ slots: [
6521
+ {
6522
+ type: "storage",
6523
+ outputPct: 100,
6524
+ maxTier: 1
6525
+ },
6526
+ {
6527
+ type: "storage",
6528
+ outputPct: 100,
6529
+ maxTier: 1
6530
+ },
6531
+ {
6532
+ type: "storage",
6533
+ outputPct: 100,
6534
+ maxTier: 1
6535
+ }
6536
+ ],
6537
+ baseHullmass: 100000
6538
+ },
6539
+ {
6540
+ entityItemId: 10207,
6541
+ slots: [
6542
+ ],
6543
+ baseHullmass: 100000
6544
+ },
6545
+ {
6546
+ entityItemId: 10208,
6547
+ slots: [
6548
+ {
6549
+ type: "crafter",
6550
+ outputPct: 75,
6551
+ maxTier: 1
6552
+ },
6553
+ {
6554
+ type: "crafter",
6555
+ outputPct: 75,
6556
+ maxTier: 1
5259
6557
  },
5260
6558
  {
5261
- sources: [
5262
- ]
6559
+ type: "crafter",
6560
+ outputPct: 75,
6561
+ maxTier: 1
6562
+ },
6563
+ {
6564
+ type: "crafter",
6565
+ outputPct: 75,
6566
+ maxTier: 1
6567
+ },
6568
+ {
6569
+ type: "crafter",
6570
+ outputPct: 75,
6571
+ maxTier: 1
5263
6572
  }
5264
6573
  ],
5265
- blendWeights: [
5266
- ],
5267
- sourceSubclass: 10201
5268
- }
5269
- ];
5270
-
5271
- var entities = [
5272
- {
5273
- entityItemId: 10200,
5274
- slots: [
5275
- ]
6574
+ baseHullmass: 100000
5276
6575
  },
5277
6576
  {
5278
- entityItemId: 10201,
6577
+ entityItemId: 10210,
5279
6578
  slots: [
5280
6579
  {
5281
- type: "any",
6580
+ type: "generator",
5282
6581
  outputPct: 80,
5283
6582
  maxTier: 1
5284
6583
  },
5285
6584
  {
5286
- type: "any",
6585
+ type: "engine",
5287
6586
  outputPct: 80,
5288
6587
  maxTier: 1
5289
6588
  },
5290
6589
  {
5291
6590
  type: "any",
5292
- outputPct: 80,
6591
+ outputPct: 60,
6592
+ maxTier: 1
6593
+ }
6594
+ ],
6595
+ baseHullmass: 3200000
6596
+ },
6597
+ {
6598
+ entityItemId: 10211,
6599
+ slots: [
6600
+ {
6601
+ type: "generator",
6602
+ outputPct: 85,
5293
6603
  maxTier: 1
5294
6604
  },
5295
6605
  {
5296
- type: "any",
5297
- outputPct: 80,
6606
+ type: "engine",
6607
+ outputPct: 85,
5298
6608
  maxTier: 1
5299
6609
  },
5300
6610
  {
5301
- type: "any",
5302
- outputPct: 80,
6611
+ type: "gatherer",
6612
+ outputPct: 100,
5303
6613
  maxTier: 1
5304
6614
  }
5305
- ]
6615
+ ],
6616
+ baseHullmass: 3600000
5306
6617
  },
5307
6618
  {
5308
- entityItemId: 10202,
6619
+ entityItemId: 10212,
5309
6620
  slots: [
5310
6621
  {
5311
- type: "loader",
5312
- outputPct: 100,
6622
+ type: "generator",
6623
+ outputPct: 85,
5313
6624
  maxTier: 1
5314
6625
  },
5315
6626
  {
5316
- type: "storage",
5317
- outputPct: 100,
6627
+ type: "engine",
6628
+ outputPct: 85,
5318
6629
  maxTier: 1
5319
6630
  },
5320
6631
  {
5321
- type: "storage",
6632
+ type: "loader",
5322
6633
  outputPct: 100,
5323
6634
  maxTier: 1
6635
+ }
6636
+ ],
6637
+ baseHullmass: 3600000
6638
+ },
6639
+ {
6640
+ entityItemId: 10213,
6641
+ slots: [
6642
+ {
6643
+ type: "generator",
6644
+ outputPct: 85,
6645
+ maxTier: 1
5324
6646
  },
5325
6647
  {
5326
- type: "storage",
5327
- outputPct: 100,
6648
+ type: "engine",
6649
+ outputPct: 85,
5328
6650
  maxTier: 1
5329
6651
  },
5330
6652
  {
5331
- type: "storage",
6653
+ type: "builder",
5332
6654
  outputPct: 100,
5333
6655
  maxTier: 1
5334
6656
  }
5335
- ]
6657
+ ],
6658
+ baseHullmass: 4400000
5336
6659
  },
5337
6660
  {
5338
- entityItemId: 10203,
6661
+ entityItemId: 10214,
5339
6662
  slots: [
5340
6663
  {
5341
6664
  type: "generator",
5342
- outputPct: 200,
6665
+ outputPct: 85,
5343
6666
  maxTier: 1
5344
6667
  },
5345
6668
  {
5346
- type: "gatherer",
5347
- outputPct: 200,
6669
+ type: "engine",
6670
+ outputPct: 85,
6671
+ maxTier: 1
6672
+ },
6673
+ {
6674
+ type: "hauler",
6675
+ outputPct: 100,
5348
6676
  maxTier: 1
5349
6677
  }
5350
- ]
6678
+ ],
6679
+ baseHullmass: 4400000
5351
6680
  },
5352
6681
  {
5353
- entityItemId: 10204,
6682
+ entityItemId: 10215,
5354
6683
  slots: [
5355
6684
  {
5356
6685
  type: "generator",
5357
- outputPct: 200,
6686
+ outputPct: 85,
5358
6687
  maxTier: 1
5359
6688
  },
5360
6689
  {
5361
- type: "crafter",
5362
- outputPct: 200,
6690
+ type: "engine",
6691
+ outputPct: 85,
6692
+ maxTier: 1
6693
+ },
6694
+ {
6695
+ type: "storage",
6696
+ outputPct: 100,
5363
6697
  maxTier: 1
5364
6698
  }
5365
- ]
6699
+ ],
6700
+ baseHullmass: 5000000
5366
6701
  },
5367
6702
  {
5368
- entityItemId: 10205,
6703
+ entityItemId: 10216,
5369
6704
  slots: [
5370
6705
  {
5371
6706
  type: "generator",
5372
- outputPct: 200,
6707
+ outputPct: 90,
5373
6708
  maxTier: 1
5374
6709
  },
5375
6710
  {
5376
- type: "launcher",
5377
- outputPct: 200,
6711
+ type: "engine",
6712
+ outputPct: 90,
6713
+ maxTier: 1
6714
+ },
6715
+ {
6716
+ type: "gatherer",
6717
+ outputPct: 100,
6718
+ maxTier: 1
6719
+ },
6720
+ {
6721
+ type: "gatherer",
6722
+ outputPct: 100,
5378
6723
  maxTier: 1
5379
6724
  }
5380
- ]
6725
+ ],
6726
+ baseHullmass: 4000000
5381
6727
  },
5382
6728
  {
5383
- entityItemId: 10206,
6729
+ entityItemId: 10217,
5384
6730
  slots: [
5385
6731
  {
5386
- type: "storage",
5387
- outputPct: 100,
6732
+ type: "generator",
6733
+ outputPct: 90,
5388
6734
  maxTier: 1
5389
6735
  },
5390
6736
  {
5391
- type: "storage",
6737
+ type: "engine",
6738
+ outputPct: 90,
6739
+ maxTier: 1
6740
+ },
6741
+ {
6742
+ type: "gatherer",
5392
6743
  outputPct: 100,
5393
6744
  maxTier: 1
5394
6745
  },
@@ -5397,23 +6748,20 @@ var entities = [
5397
6748
  outputPct: 100,
5398
6749
  maxTier: 1
5399
6750
  }
5400
- ]
5401
- },
5402
- {
5403
- entityItemId: 10207,
5404
- slots: [
5405
- ]
6751
+ ],
6752
+ baseHullmass: 4800000
5406
6753
  },
5407
6754
  {
5408
6755
  entityItemId: 20200,
5409
6756
  slots: [
5410
- ]
6757
+ ],
6758
+ baseHullmass: 100000
5411
6759
  },
5412
6760
  {
5413
6761
  entityItemId: 20210,
5414
6762
  slots: [
5415
6763
  {
5416
- type: "engine",
6764
+ type: "generator",
5417
6765
  outputPct: 100,
5418
6766
  maxTier: 2
5419
6767
  },
@@ -5423,7 +6771,7 @@ var entities = [
5423
6771
  maxTier: 2
5424
6772
  },
5425
6773
  {
5426
- type: "gatherer",
6774
+ type: "engine",
5427
6775
  outputPct: 100,
5428
6776
  maxTier: 2
5429
6777
  },
@@ -5431,24 +6779,20 @@ var entities = [
5431
6779
  type: "gatherer",
5432
6780
  outputPct: 100,
5433
6781
  maxTier: 2
5434
- },
5435
- {
5436
- type: "any",
5437
- outputPct: 80,
5438
- maxTier: 1
5439
6782
  }
5440
- ]
6783
+ ],
6784
+ baseHullmass: 5760000
5441
6785
  },
5442
6786
  {
5443
6787
  entityItemId: 20211,
5444
6788
  slots: [
5445
6789
  {
5446
- type: "engine",
6790
+ type: "generator",
5447
6791
  outputPct: 100,
5448
6792
  maxTier: 2
5449
6793
  },
5450
6794
  {
5451
- type: "generator",
6795
+ type: "engine",
5452
6796
  outputPct: 100,
5453
6797
  maxTier: 2
5454
6798
  },
@@ -5462,7 +6806,8 @@ var entities = [
5462
6806
  outputPct: 100,
5463
6807
  maxTier: 2
5464
6808
  }
5465
- ]
6809
+ ],
6810
+ baseHullmass: 7040000
5466
6811
  }
5467
6812
  ];
5468
6813
 
@@ -5987,6 +7332,13 @@ var items = [
5987
7332
  tier: 1,
5988
7333
  subtype: "launcher"
5989
7334
  },
7335
+ {
7336
+ id: 10110,
7337
+ mass: 960000,
7338
+ type: "module",
7339
+ tier: 1,
7340
+ subtype: "builder"
7341
+ },
5990
7342
  {
5991
7343
  id: 10200,
5992
7344
  mass: 1900000,
@@ -6035,6 +7387,60 @@ var items = [
6035
7387
  type: "entity",
6036
7388
  tier: 1
6037
7389
  },
7390
+ {
7391
+ id: 10208,
7392
+ mass: 1900000,
7393
+ type: "entity",
7394
+ tier: 1
7395
+ },
7396
+ {
7397
+ id: 10210,
7398
+ mass: 1600000,
7399
+ type: "entity",
7400
+ tier: 1
7401
+ },
7402
+ {
7403
+ id: 10211,
7404
+ mass: 2400000,
7405
+ type: "entity",
7406
+ tier: 1
7407
+ },
7408
+ {
7409
+ id: 10212,
7410
+ mass: 2400000,
7411
+ type: "entity",
7412
+ tier: 1
7413
+ },
7414
+ {
7415
+ id: 10213,
7416
+ mass: 2400000,
7417
+ type: "entity",
7418
+ tier: 1
7419
+ },
7420
+ {
7421
+ id: 10214,
7422
+ mass: 2400000,
7423
+ type: "entity",
7424
+ tier: 1
7425
+ },
7426
+ {
7427
+ id: 10215,
7428
+ mass: 2400000,
7429
+ type: "entity",
7430
+ tier: 1
7431
+ },
7432
+ {
7433
+ id: 10216,
7434
+ mass: 3600000,
7435
+ type: "entity",
7436
+ tier: 1
7437
+ },
7438
+ {
7439
+ id: 10217,
7440
+ mass: 3600000,
7441
+ type: "entity",
7442
+ tier: 1
7443
+ },
6038
7444
  {
6039
7445
  id: 20001,
6040
7446
  mass: 4800,
@@ -6298,7 +7704,7 @@ const itemMetadata = {
6298
7704
  },
6299
7705
  10106: {
6300
7706
  name: 'Tractor Beam',
6301
- description: 'Projects a haul beam to lock onto and transport containers or warehouses through group travel.',
7707
+ description: 'Projects a haul beam to lock onto and transport containers through group travel.',
6302
7708
  color: '#4ADBFF',
6303
7709
  },
6304
7710
  10107: {
@@ -6316,13 +7722,18 @@ const itemMetadata = {
6316
7722
  description: 'Accelerates and launches cargo payloads toward a remote mass catcher.',
6317
7723
  color: '#E86344',
6318
7724
  },
7725
+ 10110: {
7726
+ name: 'Assembly Arm',
7727
+ description: 'Heavy manipulator arms for on-site construction work. Claims build sites, builds them out, and upgrades ships in place.',
7728
+ color: '#FFB347',
7729
+ },
6319
7730
  10200: {
6320
7731
  name: 'Container',
6321
7732
  description: 'Passive floating cargo storage in space. Towed by ships.',
6322
7733
  color: '#7B8D9E',
6323
7734
  },
6324
7735
  10201: {
6325
- name: 'Roustabout',
7736
+ name: 'Ship',
6326
7737
  description: 'General-purpose vessel with 5 module slots.',
6327
7738
  color: '#4AE898',
6328
7739
  },
@@ -6356,6 +7767,51 @@ const itemMetadata = {
6356
7767
  description: 'Orbital command structure. Anchors a player station cluster.',
6357
7768
  color: '#A0B8D0',
6358
7769
  },
7770
+ 10208: {
7771
+ name: 'Workshop',
7772
+ description: 'A station workshop with five independent workers. Visiting ships bring materials and power, and the workshop does the crafting.',
7773
+ color: '#B877FF',
7774
+ },
7775
+ 10210: {
7776
+ name: 'Roustabout',
7777
+ description: 'A basic starter ship. One engine, one power core, and one open slot to fit as you like.',
7778
+ color: '#4AE898',
7779
+ },
7780
+ 10211: {
7781
+ name: 'Prospector',
7782
+ description: 'A light gathering ship. One engine, one power core, one gathering rig.',
7783
+ color: '#4AE898',
7784
+ },
7785
+ 10212: {
7786
+ name: 'Tender',
7787
+ description: 'A logistics ship with a shuttle bay for moving cargo between ships and stations.',
7788
+ color: '#4AE898',
7789
+ },
7790
+ 10213: {
7791
+ name: 'Wright',
7792
+ description: 'A construction ship with an assembly arm for building structures and upgrading ships.',
7793
+ color: '#4AE898',
7794
+ },
7795
+ 10214: {
7796
+ name: 'Tug',
7797
+ description: 'A logistics ship with a tractor beam for towing containers from place to place.',
7798
+ color: '#4AE898',
7799
+ },
7800
+ 10215: {
7801
+ name: 'Porter',
7802
+ description: 'A cargo ship built around a large storage hold. The extra mass makes it slower than a Roustabout.',
7803
+ color: '#4AE898',
7804
+ },
7805
+ 10216: {
7806
+ name: 'Wrangler',
7807
+ description: 'A heavy gathering ship with two gathering rigs, so it mines faster.',
7808
+ color: '#4AE898',
7809
+ },
7810
+ 10217: {
7811
+ name: 'Dredger',
7812
+ description: 'A gathering ship with its own storage hold, so it can keep mining before it has to offload.',
7813
+ color: '#4AE898',
7814
+ },
6359
7815
  20001: {
6360
7816
  name: 'Plate',
6361
7817
  description: 'Advanced structural plating reinforced with tier 2 ore.',
@@ -6427,13 +7883,21 @@ const itemMetadata = {
6427
7883
  color: '#4AE898',
6428
7884
  },
6429
7885
  20211: {
6430
- name: 'Hauler',
7886
+ name: 'Tug',
6431
7887
  description: 'Advanced towing vessel with tiered engine, generator, and tractor beam slots.',
6432
7888
  color: '#4AE898',
6433
7889
  },
6434
7890
  };
6435
7891
  const entityMetadata = {
6436
7892
  10201: { moduleSlotLabels: ['Engine', 'Power Core', 'Limpet Bay', 'Shuttle Bay', 'Cargo Hold'] },
7893
+ 10210: { moduleSlotLabels: ['Power Core', 'Engine', 'Utility Bay'] },
7894
+ 10211: { moduleSlotLabels: ['Power Core', 'Engine', 'Limpet Bay'] },
7895
+ 10212: { moduleSlotLabels: ['Power Core', 'Engine', 'Shuttle Bay'] },
7896
+ 10213: { moduleSlotLabels: ['Power Core', 'Engine', 'Assembly Arm'] },
7897
+ 10214: { moduleSlotLabels: ['Power Core', 'Engine', 'Tractor Beam'] },
7898
+ 10215: { moduleSlotLabels: ['Power Core', 'Engine', 'Cargo Hold'] },
7899
+ 10216: { moduleSlotLabels: ['Power Core', 'Engine', 'Limpet Bay', 'Limpet Bay'] },
7900
+ 10217: { moduleSlotLabels: ['Power Core', 'Engine', 'Limpet Bay', 'Cargo Hold'] },
6437
7901
  10202: {
6438
7902
  moduleSlotLabels: ['Shuttle Bay', 'Cargo Hold', 'Cargo Hold', 'Cargo Hold', 'Cargo Hold'],
6439
7903
  },
@@ -6441,8 +7905,11 @@ const entityMetadata = {
6441
7905
  10204: { moduleSlotLabels: ['Power Core', 'Fabricator'] },
6442
7906
  10205: { moduleSlotLabels: ['Power Core', 'Drive Coil'] },
6443
7907
  10206: { moduleSlotLabels: ['Cargo Hold', 'Cargo Hold', 'Cargo Hold'] },
6444
- 20210: { moduleSlotLabels: ['Engine', 'Power Core', 'Limpet Bay', 'Limpet Bay', 'Flex Slot'] },
6445
- 20211: { moduleSlotLabels: ['Engine', 'Power Core', 'Tractor Beam', 'Tractor Beam'] },
7908
+ 10208: {
7909
+ moduleSlotLabels: ['Fabricator', 'Fabricator', 'Fabricator', 'Fabricator', 'Fabricator'],
7910
+ },
7911
+ 20210: { moduleSlotLabels: ['Power Core', 'Power Core', 'Engine', 'Limpet Bay'] },
7912
+ 20211: { moduleSlotLabels: ['Power Core', 'Engine', 'Tractor Beam', 'Tractor Beam'] },
6446
7913
  };
6447
7914
  for (const item of items) {
6448
7915
  if (!itemMetadata[item.id]) {
@@ -9328,18 +10795,65 @@ var kinds = [
9328
10795
  defaultLabel: "Plot"
9329
10796
  },
9330
10797
  {
9331
- kind: "hub",
9332
- classification: "OrbitalStructure",
9333
- capabilityFlags: 4,
9334
- zCoord: 0,
9335
- defaultLabel: "Station Hub"
9336
- }
9337
- ];
9338
- var templates = [
10798
+ kind: "hub",
10799
+ classification: "OrbitalStructure",
10800
+ capabilityFlags: 4,
10801
+ zCoord: 0,
10802
+ defaultLabel: "Station Hub"
10803
+ },
10804
+ {
10805
+ kind: "workshop",
10806
+ classification: "OrbitalStructure",
10807
+ capabilityFlags: 20,
10808
+ zCoord: 0,
10809
+ defaultLabel: "Workshop"
10810
+ }
10811
+ ];
10812
+ var templates = [
10813
+ {
10814
+ itemId: 10201,
10815
+ kind: "ship",
10816
+ displayLabel: "Ship"
10817
+ },
10818
+ {
10819
+ itemId: 10210,
10820
+ kind: "ship",
10821
+ displayLabel: "Roustabout"
10822
+ },
10823
+ {
10824
+ itemId: 10211,
10825
+ kind: "ship",
10826
+ displayLabel: "Prospector"
10827
+ },
10828
+ {
10829
+ itemId: 10212,
10830
+ kind: "ship",
10831
+ displayLabel: "Tender"
10832
+ },
10833
+ {
10834
+ itemId: 10213,
10835
+ kind: "ship",
10836
+ displayLabel: "Wright"
10837
+ },
10838
+ {
10839
+ itemId: 10214,
10840
+ kind: "ship",
10841
+ displayLabel: "Tug"
10842
+ },
10843
+ {
10844
+ itemId: 10215,
10845
+ kind: "ship",
10846
+ displayLabel: "Porter"
10847
+ },
9339
10848
  {
9340
- itemId: 10201,
10849
+ itemId: 10216,
9341
10850
  kind: "ship",
9342
- displayLabel: "Roustabout"
10851
+ displayLabel: "Wrangler"
10852
+ },
10853
+ {
10854
+ itemId: 10217,
10855
+ kind: "ship",
10856
+ displayLabel: "Dredger"
9343
10857
  },
9344
10858
  {
9345
10859
  itemId: 10202,
@@ -9381,6 +10895,11 @@ var templates = [
9381
10895
  kind: "hub",
9382
10896
  displayLabel: ""
9383
10897
  },
10898
+ {
10899
+ itemId: 10208,
10900
+ kind: "workshop",
10901
+ displayLabel: ""
10902
+ },
9384
10903
  {
9385
10904
  itemId: 20210,
9386
10905
  kind: "ship",
@@ -9389,7 +10908,7 @@ var templates = [
9389
10908
  {
9390
10909
  itemId: 20211,
9391
10910
  kind: "ship",
9392
- displayLabel: "Hauler"
10911
+ displayLabel: "Tug"
9393
10912
  }
9394
10913
  ];
9395
10914
  var kindRegistryJson = {
@@ -9473,6 +10992,7 @@ const ENTITY_SHIP = Name.from('ship');
9473
10992
  const ENTITY_WAREHOUSE = Name.from('warehouse');
9474
10993
  const ENTITY_EXTRACTOR = Name.from('extractor');
9475
10994
  const ENTITY_FACTORY = Name.from('factory');
10995
+ const ENTITY_WORKSHOP = Name.from('workshop');
9476
10996
  const ENTITY_CONTAINER = Name.from('container');
9477
10997
  const ENTITY_NEXUS = Name.from('nexus');
9478
10998
  const ENTITY_PLOT = Name.from('plot');
@@ -9491,6 +11011,9 @@ function isExtractor(entity) {
9491
11011
  function isFactory(entity) {
9492
11012
  return entity.type?.equals(ENTITY_FACTORY) ?? false;
9493
11013
  }
11014
+ function isWorkshop(entity) {
11015
+ return entity.type?.equals(ENTITY_WORKSHOP) ?? false;
11016
+ }
9494
11017
  function isContainer(entity) {
9495
11018
  return entity.type?.equals(ENTITY_CONTAINER) ?? false;
9496
11019
  }
@@ -9972,7 +11495,7 @@ function distanceBetweenCoordinates(origin, destination) {
9972
11495
  function distanceBetweenPoints(x1, y1, x2, y2) {
9973
11496
  const x = (x1 - x2) ** 2;
9974
11497
  const y = (y1 - y2) ** 2;
9975
- return UInt64.from(Math.sqrt(x + y) * PRECISION$1);
11498
+ return UInt64.from(Math.sqrt(x + y) * PRECISION);
9976
11499
  }
9977
11500
  function lerp$1(origin, destination, time) {
9978
11501
  return {
@@ -10018,9 +11541,9 @@ function getInterpolatedPosition(entity, taskIndex, taskProgress) {
10018
11541
  function rotation(origin, destination) {
10019
11542
  return Math.atan2(destination.y - origin.y, destination.x - origin.x) * (180 / Math.PI) + 90;
10020
11543
  }
10021
- function findNearbyPlanets(seed, origin, maxDistance = 20 * PRECISION$1) {
11544
+ function findNearbyPlanets(seed, origin, maxDistance = 20 * PRECISION) {
10022
11545
  const nearbySystems = [];
10023
- const max = UInt64.from(maxDistance / PRECISION$1);
11546
+ const max = UInt64.from(maxDistance / PRECISION);
10024
11547
  const xMin = Int64.from(origin.x).subtracting(max);
10025
11548
  const xMax = Int64.from(origin.x).adding(max);
10026
11549
  const yMin = Int64.from(origin.y).subtracting(max);
@@ -10046,19 +11569,28 @@ function calc_rechargetime(capacity, energy, recharge) {
10046
11569
  const eng = UInt32.from(energy);
10047
11570
  if (eng.gte(cap))
10048
11571
  return UInt32.zero;
10049
- return cap.subtracting(eng).dividing(recharge);
11572
+ const ticks = cap.subtracting(eng).dividing(recharge);
11573
+ return ticks.equals(UInt32.zero) ? UInt32.from(1) : ticks;
10050
11574
  }
10051
11575
  function calc_ship_rechargetime(ship) {
10052
11576
  if (!ship.generator)
10053
11577
  return UInt32.from(0);
10054
- return calc_rechargetime(ship.generator.capacity, ship.energy ?? UInt16.from(0), ship.generator.recharge);
11578
+ return calc_rechargetime(ship.generator.capacity, ship.energy ?? UInt32.from(0), ship.generator.recharge);
10055
11579
  }
10056
11580
  function calc_flighttime(distance, acceleration) {
10057
11581
  return UInt32.from(2 * Math.sqrt(Number(distance) / acceleration));
10058
11582
  }
11583
+ function calc_travel_flighttime(distance, acceleration) {
11584
+ const cruiseTransitionDistance = 2 * PRECISION;
11585
+ if (Number(distance) <= cruiseTransitionDistance) {
11586
+ return calc_flighttime(distance, acceleration);
11587
+ }
11588
+ const cruiseVelocity = Math.sqrt(acceleration * cruiseTransitionDistance);
11589
+ return UInt32.from(Number(distance) / cruiseVelocity + cruiseVelocity / acceleration);
11590
+ }
10059
11591
  function calc_transit_duration(ax, ay, bx, by) {
10060
11592
  const distance = distanceBetweenPoints(ax, ay, bx, by);
10061
- return UInt32.from(Math.floor(distance.toNumber() / (PRECISION$1 * WH.TRANSIT_SPEED)));
11593
+ return UInt32.from(Math.floor(distance.toNumber() / (PRECISION * WH.TRANSIT_SPEED)));
10062
11594
  }
10063
11595
  function shipLoaderLane(ship) {
10064
11596
  const lanes = ship.loader_lanes ?? [];
@@ -10082,14 +11614,14 @@ function calc_loader_acceleration(ship, mass) {
10082
11614
  }
10083
11615
  function calc_ship_flighttime(ship, mass, distance) {
10084
11616
  const acceleration = calc_ship_acceleration(ship, mass);
10085
- return calc_flighttime(distance, acceleration);
11617
+ return calc_travel_flighttime(distance, acceleration);
10086
11618
  }
10087
11619
  function calc_ship_acceleration(ship, mass) {
10088
11620
  const thrust = ship.engines ? Number(ship.engines.thrust) : 0;
10089
11621
  return calc_acceleration(thrust, Number(mass));
10090
11622
  }
10091
11623
  function calc_acceleration(thrust, mass) {
10092
- return (thrust / mass) * PRECISION$1;
11624
+ return (thrust / mass) * PRECISION;
10093
11625
  }
10094
11626
  function calc_ship_mass(ship, cargos) {
10095
11627
  const mass = UInt64.from(0);
@@ -10105,8 +11637,20 @@ function calc_ship_mass(ship, cargos) {
10105
11637
  }
10106
11638
  return mass;
10107
11639
  }
11640
+ function calc_group_flighttime(totalThrust, haulCount, pooledHaulCap, weightedHaulEffNum, totalMass, distance) {
11641
+ const avgHaulEff = pooledHaulCap > 0 ? Math.trunc(weightedHaulEffNum / pooledHaulCap) : 0;
11642
+ let effectiveThrust = totalThrust;
11643
+ if (haulCount > 0) {
11644
+ const penaltyMilli = 1000 +
11645
+ Math.trunc((haulCount * BASE_HAUL_PENALTY_MILLI$1 * (HAULER_EFFICIENCY_DENOM$1 - avgHaulEff)) /
11646
+ HAULER_EFFICIENCY_DENOM$1);
11647
+ effectiveThrust = Math.trunc((totalThrust * 1000) / penaltyMilli);
11648
+ }
11649
+ const acceleration = calc_acceleration(effectiveThrust, totalMass);
11650
+ return calc_travel_flighttime(distance, acceleration);
11651
+ }
10108
11652
  function calc_energyusage(distance, drain) {
10109
- return UInt64.from(distance).dividing(PRECISION$1).multiplying(drain);
11653
+ return UInt64.from(distance).multiplying(drain).dividing(PRECISION);
10110
11654
  }
10111
11655
  function calculateTransferTime(ship, cargos, quantities) {
10112
11656
  let mass = UInt64.from(0);
@@ -10206,7 +11750,7 @@ function estimateDealTravelTime(ship, shipMass, distance, loadMass) {
10206
11750
  function hasEnergyForDistance(ship, distance) {
10207
11751
  if (!ship.engines)
10208
11752
  return false;
10209
- const energyNeeded = UInt64.from(distance).dividing(PRECISION$1).multiplying(ship.engines.drain);
11753
+ const energyNeeded = UInt64.from(distance).dividing(PRECISION).multiplying(ship.engines.drain);
10210
11754
  return UInt64.from(ship.energy ?? 0).gte(energyNeeded);
10211
11755
  }
10212
11756
  function toNum$1(v) {
@@ -10913,6 +12457,8 @@ function getItemStatKeys(itemId) {
10913
12457
  return [];
10914
12458
  return getStatDefinitions(item.category).map((d) => d.key);
10915
12459
  }
12460
+ if (itemId === ITEM_SHIP_T1_PACKED)
12461
+ return ['strength', 'density', '', ''];
10916
12462
  const recipe = getRecipe(itemId);
10917
12463
  if (!recipe)
10918
12464
  return [];
@@ -11723,6 +13269,7 @@ const MODULE_LAUNCHER = 7;
11723
13269
  const MODULE_STORAGE = 8;
11724
13270
  const MODULE_HAULER = 9;
11725
13271
  const MODULE_BATTERY = 10;
13272
+ const MODULE_BUILDER = 12;
11726
13273
  function moduleAccepts(slotType, moduleType) {
11727
13274
  return slotType === MODULE_ANY || slotType === moduleType;
11728
13275
  }
@@ -11739,6 +13286,8 @@ function getModuleCapabilityType(itemId) {
11739
13286
  return MODULE_LOADER;
11740
13287
  case ITEM_CRAFTER_T1:
11741
13288
  return MODULE_CRAFTER;
13289
+ case ITEM_BUILDER_T1:
13290
+ return MODULE_BUILDER;
11742
13291
  case ITEM_STORAGE_T1:
11743
13292
  return MODULE_STORAGE;
11744
13293
  case ITEM_HAULER_T1:
@@ -11773,6 +13322,8 @@ function moduleSlotTypeToCode(slotType) {
11773
13322
  return MODULE_WARP;
11774
13323
  case 'crafter':
11775
13324
  return MODULE_CRAFTER;
13325
+ case 'builder':
13326
+ return MODULE_BUILDER;
11776
13327
  case 'launcher':
11777
13328
  return MODULE_LAUNCHER;
11778
13329
  case 'storage':
@@ -13416,7 +14967,7 @@ const UINT32_MAX = 4294967295;
13416
14967
  const UINT32_MAX_BIGINT = 4294967295n;
13417
14968
  const UINT32_MOD = 4294967296n;
13418
14969
  const UINT64_MAX = 18446744073709551615n;
13419
- const PRECISION_BIGINT = BigInt(PRECISION$1);
14970
+ const PRECISION_BIGINT = BigInt(PRECISION);
13420
14971
  function toNumber(value) {
13421
14972
  if (typeof value === 'number')
13422
14973
  return Math.trunc(value);
@@ -13465,7 +15016,7 @@ function calcDistance(origin, destination) {
13465
15016
  const b = Coordinates.from(destination);
13466
15017
  const dx = toNumber(a.x) - toNumber(b.x);
13467
15018
  const dy = toNumber(a.y) - toNumber(b.y);
13468
- return BigInt(Math.trunc(Math.sqrt(dx * dx + dy * dy) * PRECISION$1));
15019
+ return BigInt(Math.trunc(Math.sqrt(dx * dx + dy * dy) * PRECISION));
13469
15020
  }
13470
15021
  function calcCargoItemMassUint32(item) {
13471
15022
  let mass = toUint32(BigInt(getItem(item.item_id).mass) * toUint32(toBigInt(item.quantity)));
@@ -13535,6 +15086,15 @@ class ActionsManager extends BaseManager {
13535
15086
  recharge,
13536
15087
  });
13537
15088
  }
15089
+ travelplan(entities, waypoints, recharge = true) {
15090
+ const entityRefs = this.entityRefs(entities);
15091
+ const wps = waypoints.map((w) => Types.route_waypoint.from({ x: Int64.from(w.x), y: Int64.from(w.y) }));
15092
+ return this.server.action('travelplan', {
15093
+ entities: entityRefs,
15094
+ waypoints: wps,
15095
+ recharge,
15096
+ });
15097
+ }
13538
15098
  transit(shipId, entrance, exit) {
13539
15099
  return this.server.action('transit', {
13540
15100
  id: UInt64.from(shipId),
@@ -13616,6 +15176,14 @@ class ActionsManager extends BaseManager {
13616
15176
  items,
13617
15177
  });
13618
15178
  }
15179
+ shuttle(carrierId, fromId, toId, items) {
15180
+ return this.server.action('shuttle', {
15181
+ carrier: UInt64.from(carrierId),
15182
+ from_id: UInt64.from(fromId),
15183
+ to_id: UInt64.from(toId),
15184
+ items,
15185
+ });
15186
+ }
13619
15187
  launch(launcherId, catcherId, items) {
13620
15188
  return this.server.action('launch', {
13621
15189
  launcher_id: UInt64.from(launcherId),
@@ -13664,26 +15232,16 @@ class ActionsManager extends BaseManager {
13664
15232
  }
13665
15233
  return this.server.action('gather', params);
13666
15234
  }
13667
- bundleGather(gathers) {
13668
- const actions = gathers.map(({ sourceId, destinationId, stratum, quantity, slot }) => this.gather(sourceId, destinationId, stratum, quantity, slot));
13669
- return Transaction.from({
13670
- expiration: 0,
13671
- ref_block_num: 0,
13672
- ref_block_prefix: 0,
13673
- actions,
15235
+ gatherplan(sourceId, destinationId, stratum, quantity, recharge = true, slots = []) {
15236
+ return this.server.action('gatherplan', {
15237
+ source_id: UInt64.from(sourceId),
15238
+ destination_id: UInt64.from(destinationId),
15239
+ stratum: UInt16.from(stratum),
15240
+ quantity: UInt32.from(quantity),
15241
+ recharge,
15242
+ slots: Bytes.from(slots),
13674
15243
  });
13675
15244
  }
13676
- flattenGatherPlan(plan, ctx) {
13677
- const actions = [];
13678
- for (const cycle of plan.cycles) {
13679
- if (cycle.rechargeBefore)
13680
- actions.push(this.recharge(ctx.sourceId));
13681
- for (const limpet of cycle.limpets) {
13682
- actions.push(this.gather(ctx.sourceId, ctx.destinationId, ctx.stratum, limpet.quantity, limpet.slot));
13683
- }
13684
- }
13685
- return actions;
13686
- }
13687
15245
  warp(entityId, destination) {
13688
15246
  const x = Int64.from(destination.x);
13689
15247
  const y = Int64.from(destination.y);
@@ -13708,6 +15266,39 @@ class ActionsManager extends BaseManager {
13708
15266
  }
13709
15267
  return this.server.action('craft', params);
13710
15268
  }
15269
+ craftjob(shipId, workshopId, slot, recipeId, quantity, inputs) {
15270
+ const params = {
15271
+ ship_id: UInt64.from(shipId),
15272
+ workshop_id: UInt64.from(workshopId),
15273
+ slot: UInt8.from(slot),
15274
+ recipe_id: UInt16.from(recipeId),
15275
+ quantity: UInt32.from(quantity),
15276
+ inputs,
15277
+ };
15278
+ return this.server.action('craftjob', params);
15279
+ }
15280
+ claimjob(jobId, shipId) {
15281
+ const params = {
15282
+ job_id: UInt64.from(jobId),
15283
+ ship_id: UInt64.from(shipId),
15284
+ };
15285
+ return this.server.action('claimjob', params);
15286
+ }
15287
+ canceljob(jobId, shipId) {
15288
+ const params = {
15289
+ job_id: UInt64.from(jobId),
15290
+ ship_id: UInt64.from(shipId),
15291
+ };
15292
+ return this.server.action('canceljob', params);
15293
+ }
15294
+ setsocket(workshopId, slot, open) {
15295
+ const params = {
15296
+ workshop_id: UInt64.from(workshopId),
15297
+ slot: UInt8.from(slot),
15298
+ open,
15299
+ };
15300
+ return this.server.action('setsocket', params);
15301
+ }
13711
15302
  blend(entityId, inputs) {
13712
15303
  return this.server.action('blend', {
13713
15304
  id: UInt64.from(entityId),
@@ -14622,6 +16213,15 @@ class Shipload {
14622
16213
  }
14623
16214
  }
14624
16215
 
16216
+ const MODULE_STAT_SCALING_ANCHOR = 213;
16217
+ const MODULE_STAT_SCALING_POST_ANCHOR_PERCENT = 40;
16218
+ function computeEffectiveModuleStat(stat) {
16219
+ if (stat <= MODULE_STAT_SCALING_ANCHOR)
16220
+ return stat;
16221
+ return (MODULE_STAT_SCALING_ANCHOR +
16222
+ Math.floor(((stat - MODULE_STAT_SCALING_ANCHOR) * MODULE_STAT_SCALING_POST_ANCHOR_PERCENT) / 100));
16223
+ }
16224
+
14625
16225
  const U16_MAX = 65535;
14626
16226
  function packedModulesToInstalled(entries) {
14627
16227
  const installed = [];
@@ -14653,13 +16253,27 @@ function getSlotAmp(layout, slotIndex) {
14653
16253
  function idiv(a, b) {
14654
16254
  return Math.floor(a / b);
14655
16255
  }
14656
- function computeBaseHullmass$1(stats) {
16256
+ function toWholeEnergy$1(milli) {
16257
+ return idiv(milli + 500, 1000);
16258
+ }
16259
+ function isShipHull$1(itemId) {
16260
+ return getPackedEntityType(itemId)?.equals(ENTITY_SHIP) ?? false;
16261
+ }
16262
+ function sumPackedShipChannels(stats) {
16263
+ let sum = 0;
16264
+ for (let slot = 0; slot < 5; slot++)
16265
+ sum += decodeStat(stats, slot);
16266
+ return sum;
16267
+ }
16268
+ function computeBaseHullmass$1(itemId, stats) {
16269
+ if (isShipHull$1(itemId)) {
16270
+ return Math.floor((getBaseHullmassFor(itemId) * (10000 - sumPackedShipChannels(stats))) / 10000);
16271
+ }
14657
16272
  const density = decodeStat(stats, 1);
14658
- return 100000 - 75 * density;
16273
+ return Math.floor((getBaseHullmassFor(itemId) * (2000 - density)) / 2000);
14659
16274
  }
14660
16275
  function computeBaseCapacityShip(stats) {
14661
- const s = decodeStat(stats, 0) + decodeStat(stats, 2);
14662
- return Math.floor(5000000 * 6 ** (s / 1998));
16276
+ return Math.floor(5000000 * 6 ** (sumPackedShipChannels(stats) / 4995));
14663
16277
  }
14664
16278
  function computeBaseCapacityContainer(stats) {
14665
16279
  const s = decodeStat(stats, 0) + decodeStat(stats, 2);
@@ -14671,35 +16285,57 @@ function computeBaseCapacityWarehouse(stats) {
14671
16285
  }
14672
16286
  const computeEngineThrust = (vol) => 400 + idiv(vol * 3, 4);
14673
16287
  const computeEngineDrain = (thm) => 2 * Math.max(30, 50 - idiv(thm, 70));
14674
- const ENGINE_DRAIN_BASE = 118;
16288
+ const ENGINE_DRAIN_BASE = 156;
14675
16289
  const ENGINE_DRAIN_REF_THRUST = 775;
14676
16290
  const ENGINE_DRAIN_REF_THM = 500;
14677
16291
  const computeTravelDrain = (totalThrust, avgThm) => {
14678
16292
  if (totalThrust <= 0)
14679
16293
  return 0;
14680
- const num = ENGINE_DRAIN_BASE * ENGINE_DRAIN_REF_THRUST * computeEngineDrain(avgThm);
14681
- const den = totalThrust * computeEngineDrain(ENGINE_DRAIN_REF_THM);
14682
- return idiv(num, den);
16294
+ const thermalFactor = computeEngineDrain(avgThm) / computeEngineDrain(ENGINE_DRAIN_REF_THM);
16295
+ const thrustFactor = Math.sqrt(ENGINE_DRAIN_REF_THRUST / totalThrust);
16296
+ return Math.floor(ENGINE_DRAIN_BASE * 1000 * thermalFactor * thrustFactor);
14683
16297
  };
14684
- const computeGeneratorCap = (com) => 1300 + idiv(com, 2);
14685
- const computeGeneratorRech = (fin) => 2 * (1 + idiv(fin * 3, 1000));
16298
+ const computeGeneratorCap = (com) => 1300000 + com * 500;
16299
+ const computeGeneratorRech = (fin) => 2000 + fin * 6;
14686
16300
  const computeGathererYield = (str) => 200 + str;
14687
- const computeGathererDrain = (con) => 2 * Math.max(250, 1250 - idiv(con * 25, 20));
16301
+ const computeGathererDrain = (con) => 2 * Math.max(250000, 1250000 - con * 1250);
14688
16302
  const computeGathererDepth = (tol, tier) => gathererDepthForTier(tol, tier);
14689
16303
  const computeLoaderMass = (ins) => Math.max(200, 2000 - ins * 2);
14690
16304
  const computeLoaderThrust = (pla) => 1 + idiv(pla * pla, 10000);
14691
16305
  const computeCrafterSpeed = (rea) => 100 + idiv(rea * 4, 5);
14692
- const computeCrafterDrain = (fin) => Math.max(5, 30 - idiv(fin, 33));
16306
+ const computeCrafterDrain = (fin) => Math.max(5000, 30000 - idiv(fin * 1000, 33));
16307
+ const computeBuilderSpeed = (coh) => 100 + idiv(coh * 4, 5);
16308
+ const computeBuilderDrain = (tol) => Math.max(5000, 30000 - idiv(tol * 1000, 33));
14693
16309
  const computeHaulerCapacity = (fin, tier) => Math.max(tier, tier + idiv(fin, 400));
14694
16310
  const computeHaulerEfficiency = (con) => 2000 + con * 6;
14695
- const computeHaulerDrain$1 = (com) => Math.max(3, 15 - idiv(com, 80));
16311
+ const supportDrainTierPercent = (tier) => {
16312
+ const clampedTier = Math.min(10, Math.max(1, Math.trunc(tier)));
16313
+ return Math.max(50, 110 - clampedTier * 10);
16314
+ };
16315
+ const computeT1LogisticsDrain = (stat) => Math.max(3000, 15000 - Math.min(12000, idiv(stat * 1000, 80)));
16316
+ const computeHaulerDrain = (conductivity, tier) => idiv(computeT1LogisticsDrain(conductivity) * supportDrainTierPercent(tier), 100);
16317
+ const computeCargoBayDrain = (cohesion, tier) => idiv(computeT1LogisticsDrain(cohesion) * 3 * supportDrainTierPercent(tier), 400);
14696
16318
  const computeWarpRange = (stat) => 100 + stat * 3;
14697
- const computeCargoBayCapacity = (strength, density, hardness, cohesion) => 10000000 + idiv((strength + density + hardness + cohesion) * 50000000, 3996);
14698
- const computeBatteryBankCapacity = (volatility, thermal, plasticity, insulation) => 2500 + idiv((volatility + thermal + plasticity + insulation) * 7500, 3996);
16319
+ const computeCargoBayCapacity = (strength, density, hardness) => 10000000 + idiv((strength + density + hardness) * 50000000, 2997);
16320
+ const computeBatteryBankCapacity = (volatility, thermal, plasticity, insulation) => 2500000 + idiv((volatility + thermal + plasticity + insulation) * 7500000, 3996);
14699
16321
  function entityDisplayName(itemId) {
14700
16322
  switch (itemId) {
14701
16323
  case ITEM_SHIP_T1_PACKED:
16324
+ return 'Ship';
16325
+ case ITEM_ROUSTABOUT_T1_PACKED:
14702
16326
  return 'Roustabout';
16327
+ case ITEM_PROSPECTOR_T1_PACKED:
16328
+ return 'Prospector';
16329
+ case ITEM_TENDER_T1_PACKED:
16330
+ return 'Tender';
16331
+ case ITEM_TUG_T1_PACKED:
16332
+ return 'Tug';
16333
+ case ITEM_PORTER_T1_PACKED:
16334
+ return 'Porter';
16335
+ case ITEM_WRANGLER_T1_PACKED:
16336
+ return 'Wrangler';
16337
+ case ITEM_DREDGER_T1_PACKED:
16338
+ return 'Dredger';
14703
16339
  case ITEM_WAREHOUSE_T1_PACKED:
14704
16340
  return 'Warehouse';
14705
16341
  case ITEM_EXTRACTOR_T1_PACKED:
@@ -14713,7 +16349,7 @@ function entityDisplayName(itemId) {
14713
16349
  case ITEM_PROSPECTOR_T2_PACKED:
14714
16350
  return 'Prospector';
14715
16351
  case ITEM_HAULER_SHIP_T2_PACKED:
14716
- return 'Hauler';
16352
+ return 'Tug';
14717
16353
  default:
14718
16354
  return 'Entity';
14719
16355
  }
@@ -14731,6 +16367,8 @@ function moduleDisplayName(itemId) {
14731
16367
  return 'Shuttle Bay';
14732
16368
  case ITEM_CRAFTER_T1:
14733
16369
  return 'Fabricator';
16370
+ case ITEM_BUILDER_T1:
16371
+ return 'Assembly Arm';
14734
16372
  case ITEM_STORAGE_T1:
14735
16373
  return 'Cargo Hold';
14736
16374
  case ITEM_HAULER_T1:
@@ -14756,15 +16394,15 @@ function formatModuleLine(slot, itemId, stats) {
14756
16394
  const subtype = getModuleCapabilityType(itemId);
14757
16395
  switch (subtype) {
14758
16396
  case MODULE_ENGINE: {
14759
- const vol = decodeStat(stats, 0);
14760
- const thm = decodeStat(stats, 1);
16397
+ const vol = computeEffectiveModuleStat(decodeStat(stats, 0));
16398
+ const thm = computeEffectiveModuleStat(decodeStat(stats, 1));
14761
16399
  out += ` Thrust ${computeEngineThrust(vol)} Drain ${computeEngineDrain(thm)}`;
14762
16400
  break;
14763
16401
  }
14764
16402
  case MODULE_GENERATOR: {
14765
- const res = decodeStat(stats, 0);
14766
- const ref = decodeStat(stats, 1);
14767
- out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(ref)}`;
16403
+ const res = computeEffectiveModuleStat(decodeStat(stats, 0));
16404
+ const ref = computeEffectiveModuleStat(decodeStat(stats, 1));
16405
+ out += ` Capacity ${toWholeEnergy$1(computeGeneratorCap(res))} Recharge ${toWholeEnergy$1(computeGeneratorRech(ref))}`;
14768
16406
  break;
14769
16407
  }
14770
16408
  case MODULE_GATHERER: {
@@ -14772,7 +16410,7 @@ function formatModuleLine(slot, itemId, stats) {
14772
16410
  const tol = decodeStat(stats, 1);
14773
16411
  const con = decodeStat(stats, 2);
14774
16412
  const tier = getItem(itemId).tier;
14775
- out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol, tier)} Drain ${computeGathererDrain(con)}`;
16413
+ out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(tol, tier)} Drain ${toWholeEnergy$1(computeGathererDrain(con))}`;
14776
16414
  break;
14777
16415
  }
14778
16416
  case MODULE_LOADER: {
@@ -14784,23 +16422,30 @@ function formatModuleLine(slot, itemId, stats) {
14784
16422
  case MODULE_CRAFTER: {
14785
16423
  const rea = decodeStat(stats, 0);
14786
16424
  const con = decodeStat(stats, 1);
14787
- out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(con)}`;
16425
+ out += ` Speed ${computeCrafterSpeed(rea)} Drain ${toWholeEnergy$1(computeCrafterDrain(con))}`;
16426
+ break;
16427
+ }
16428
+ case MODULE_BUILDER: {
16429
+ const coh = decodeStat(stats, 0);
16430
+ const tol = decodeStat(stats, 1);
16431
+ out += ` Speed ${computeBuilderSpeed(coh)} Drain ${toWholeEnergy$1(computeBuilderDrain(tol))}`;
14788
16432
  break;
14789
16433
  }
14790
16434
  case MODULE_STORAGE: {
14791
16435
  const str = decodeStat(stats, 0);
14792
16436
  const den = decodeStat(stats, 1);
14793
16437
  const hrd = decodeStat(stats, 2);
14794
- const com = decodeStat(stats, 3);
14795
- out += ` Cargo Capacity ${computeCargoBayCapacity(str, den, hrd, com)}`;
16438
+ const coh = decodeStat(stats, 3);
16439
+ const tier = getItem(itemId).tier;
16440
+ out += ` Cargo Capacity ${computeCargoBayCapacity(str, den, hrd)} Drain ${toWholeEnergy$1(computeCargoBayDrain(coh, tier))}`;
14796
16441
  break;
14797
16442
  }
14798
16443
  case MODULE_HAULER: {
14799
16444
  const res = decodeStat(stats, 0);
14800
16445
  const pla = decodeStat(stats, 1);
14801
- const ref = decodeStat(stats, 2);
16446
+ const con = decodeStat(stats, 2);
14802
16447
  const tier = getItem(itemId).tier;
14803
- out += ` Capacity ${computeHaulerCapacity(res, tier)} Efficiency ${computeHaulerEfficiency(pla)} Drain ${computeHaulerDrain$1(ref)}`;
16448
+ out += ` Capacity ${computeHaulerCapacity(res, tier)} Efficiency ${computeHaulerEfficiency(pla)} Drain ${toWholeEnergy$1(computeHaulerDrain(con, tier))}`;
14804
16449
  break;
14805
16450
  }
14806
16451
  case MODULE_WARP: {
@@ -14813,18 +16458,16 @@ function formatModuleLine(slot, itemId, stats) {
14813
16458
  const thm = decodeStat(stats, 1);
14814
16459
  const pla = decodeStat(stats, 2);
14815
16460
  const ins = decodeStat(stats, 3);
14816
- out += ` Energy Capacity ${computeBatteryBankCapacity(vol, thm, pla, ins)}`;
16461
+ out += ` Energy Capacity ${toWholeEnergy$1(computeBatteryBankCapacity(vol, thm, pla, ins))}`;
14817
16462
  break;
14818
16463
  }
14819
16464
  }
14820
16465
  return out;
14821
16466
  }
14822
16467
  function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
14823
- const hullMass = computeBaseHullmass$1(hullStats);
16468
+ const hullMass = computeBaseHullmass$1(itemId, hullStats);
14824
16469
  let baseCapacity = 0;
14825
- if (itemId === ITEM_SHIP_T1_PACKED ||
14826
- itemId === ITEM_PROSPECTOR_T2_PACKED ||
14827
- itemId === ITEM_HAULER_SHIP_T2_PACKED) {
16470
+ if (isShipHull$1(itemId)) {
14828
16471
  baseCapacity = computeBaseCapacityShip(hullStats);
14829
16472
  }
14830
16473
  else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
@@ -14849,31 +16492,45 @@ function buildEntityDescription(itemId, hullStats, moduleItems, moduleStats) {
14849
16492
  return out;
14850
16493
  }
14851
16494
 
14852
- function computeBaseHullmass(stats) {
14853
- return 100000 - 75 * stats.density;
16495
+ const DEFAULT_BASE_HULLMASS = 100000;
16496
+ function getBaseHullmassFor(itemId) {
16497
+ return getEntityLayout(itemId)?.baseHullmass ?? DEFAULT_BASE_HULLMASS;
14854
16498
  }
14855
- function computeShipHullCapabilities(stats) {
14856
- const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
14857
- const exponent = statSum / 1998.0;
16499
+ function isShipHull(itemId) {
16500
+ return getPackedEntityType(itemId)?.equals(ENTITY_SHIP) ?? false;
16501
+ }
16502
+ function sumHullStats(stats) {
16503
+ return Object.values(stats).reduce((sum, value) => sum + value, 0);
16504
+ }
16505
+ function computeBaseHullmass(itemId, stats) {
16506
+ if (isShipHull(itemId)) {
16507
+ return Math.floor((getBaseHullmassFor(itemId) * (10000 - sumHullStats(stats))) / 10000);
16508
+ }
16509
+ const lightness = stats.density ?? stats.hardness ?? 0;
16510
+ return Math.floor((getBaseHullmassFor(itemId) * (2000 - lightness)) / 2000);
16511
+ }
16512
+ function computeShipHullCapabilities(stats, itemId = ITEM_SHIP_T1_PACKED) {
16513
+ const statSum = sumHullStats(stats);
16514
+ const exponent = statSum / 4995.0;
14858
16515
  return {
14859
- hullmass: computeBaseHullmass(stats),
16516
+ hullmass: computeBaseHullmass(itemId, stats),
14860
16517
  capacity: Math.floor(5000000 * 6 ** exponent),
14861
16518
  };
14862
16519
  }
14863
16520
  function computeEngineCapabilities(stats) {
14864
- const vol = stats.volatility;
14865
- const thm = stats.thermal;
16521
+ const vol = computeEffectiveModuleStat(stats.volatility);
16522
+ const thm = computeEffectiveModuleStat(stats.thermal);
14866
16523
  return {
14867
16524
  thrust: 400 + Math.floor((vol * 3) / 4),
14868
16525
  drain: 2 * Math.max(30, 50 - Math.floor(thm / 70)),
14869
16526
  };
14870
16527
  }
14871
16528
  function computeGeneratorCapabilities(stats) {
14872
- const res = stats.resonance;
14873
- const ref = stats.reflectivity;
16529
+ const res = computeEffectiveModuleStat(stats.resonance);
16530
+ const ref = computeEffectiveModuleStat(stats.reflectivity);
14874
16531
  return {
14875
- capacity: 1300 + Math.floor(res / 2),
14876
- recharge: 2 * (1 + Math.floor((ref * 3) / 1000)),
16532
+ capacity: 1300000 + res * 500,
16533
+ recharge: 2000 + ref * 6,
14877
16534
  };
14878
16535
  }
14879
16536
  const GATHERER_DEPTH_TABLE = [
@@ -14899,11 +16556,11 @@ function gathererDepthForTier(tol, tier) {
14899
16556
  function computeGathererCapabilities(stats, tier) {
14900
16557
  const str = stats.strength;
14901
16558
  const con = stats.saturation;
14902
- const hrd = stats.hardness;
16559
+ const tol = stats.tolerance ?? stats.hardness;
14903
16560
  return {
14904
16561
  yield: 200 + str,
14905
- drain: 2 * Math.max(250, 1250 - Math.floor((con * 25) / 20)),
14906
- depth: gathererDepthForTier(hrd, tier),
16562
+ drain: 2 * Math.max(250000, 1250000 - con * 1250),
16563
+ depth: gathererDepthForTier(tol, tier),
14907
16564
  };
14908
16565
  }
14909
16566
  function computeLoaderCapabilities(stats) {
@@ -14920,7 +16577,15 @@ function computeCrafterCapabilities(stats) {
14920
16577
  const con = stats.conductivity;
14921
16578
  return {
14922
16579
  speed: 100 + Math.floor((fin * 4) / 5),
14923
- drain: Math.max(5, 30 - Math.floor(con / 33)),
16580
+ drain: Math.max(5000, 30000 - Math.floor((con * 1000) / 33)),
16581
+ };
16582
+ }
16583
+ function computeBuilderCapabilities(stats) {
16584
+ const coh = stats.cohesion;
16585
+ const tol = stats.tolerance;
16586
+ return {
16587
+ speed: 100 + Math.floor((coh * 4) / 5),
16588
+ drain: Math.max(5000, 30000 - Math.floor((tol * 1000) / 33)),
14924
16589
  };
14925
16590
  }
14926
16591
  function computeHaulerCapabilities(stats, tier) {
@@ -14930,7 +16595,7 @@ function computeHaulerCapabilities(stats, tier) {
14930
16595
  return {
14931
16596
  capacity: computeHaulerCapacity(resonance, tier),
14932
16597
  efficiency: 2000 + plasticity * 6,
14933
- drain: Math.max(3, 15 - Math.floor(conductivity / 80)),
16598
+ drain: computeHaulerDrain(conductivity, tier),
14934
16599
  };
14935
16600
  }
14936
16601
  function computeLauncherCapabilities(stats, amp = 100) {
@@ -14940,13 +16605,11 @@ function computeLauncherCapabilities(stats, amp = 100) {
14940
16605
  drain: stats.drain,
14941
16606
  };
14942
16607
  }
14943
- function computeStorageCapabilities(stats) {
14944
- const strength = stats.strength ?? 0;
14945
- const density = stats.density ?? 0;
14946
- const hardness = stats.hardness ?? 0;
14947
- const cohesion = stats.cohesion ?? 0;
14948
- const statSum = strength + density + hardness + cohesion;
14949
- return { capacity: 10000000 + Math.floor((statSum * 50000000) / 3996) };
16608
+ function computeStorageCapabilities(stats, tier) {
16609
+ return {
16610
+ capacity: computeCargoBayCapacity(stats.strength ?? 0, stats.density ?? 0, stats.hardness ?? 0),
16611
+ drain: computeCargoBayDrain(stats.cohesion ?? 0, tier),
16612
+ };
14950
16613
  }
14951
16614
  function computeBatteryCapabilities(stats) {
14952
16615
  const volatility = stats.volatility ?? 0;
@@ -14954,7 +16617,7 @@ function computeBatteryCapabilities(stats) {
14954
16617
  const plasticity = stats.plasticity ?? 0;
14955
16618
  const insulation = stats.insulation ?? 0;
14956
16619
  const statSum = volatility + thermal + plasticity + insulation;
14957
- return { capacity: 2500 + Math.floor((statSum * 7500) / 3996) };
16620
+ return { capacity: 2500000 + Math.floor((statSum * 7500000) / 3996) };
14958
16621
  }
14959
16622
  const CAPACITY_TIER_TABLE = [1.0, 1.4, 1.8, 2.2, 2.6, 3.0, 3.4, 3.8, 4.2, 4.6];
14960
16623
  function capacityTierMultiplier(tier) {
@@ -14966,25 +16629,25 @@ function applyCapacityTier(baseCapacity, tier) {
14966
16629
  }
14967
16630
  function computeBaseCapacity(itemId, stats) {
14968
16631
  let base;
14969
- switch (itemId) {
14970
- case ITEM_SHIP_T1_PACKED:
14971
- case ITEM_PROSPECTOR_T2_PACKED:
14972
- case ITEM_HAULER_SHIP_T2_PACKED:
14973
- base = computeShipHullCapabilities(stats).capacity;
14974
- break;
14975
- case ITEM_EXTRACTOR_T1_PACKED:
14976
- case ITEM_FACTORY_T1_PACKED:
14977
- case ITEM_MASS_DRIVER_T1_PACKED:
14978
- case ITEM_MASS_CATCHER_T1_PACKED:
14979
- case ITEM_CONTAINER_T1_PACKED:
14980
- case ITEM_CONTAINER_T2_PACKED:
14981
- base = computeContainerCapabilities(stats).capacity;
14982
- break;
14983
- case ITEM_WAREHOUSE_T1_PACKED:
14984
- base = computeWarehouseHullCapabilities(stats).capacity;
14985
- break;
14986
- default:
14987
- return 0;
16632
+ if (isShipHull(itemId)) {
16633
+ base = computeShipHullCapabilities(stats, itemId).capacity;
16634
+ }
16635
+ else {
16636
+ switch (itemId) {
16637
+ case ITEM_EXTRACTOR_T1_PACKED:
16638
+ case ITEM_FACTORY_T1_PACKED:
16639
+ case ITEM_MASS_DRIVER_T1_PACKED:
16640
+ case ITEM_MASS_CATCHER_T1_PACKED:
16641
+ case ITEM_CONTAINER_T1_PACKED:
16642
+ case ITEM_CONTAINER_T2_PACKED:
16643
+ base = computeContainerCapabilities(stats).capacity;
16644
+ break;
16645
+ case ITEM_WAREHOUSE_T1_PACKED:
16646
+ base = computeWarehouseHullCapabilities(stats).capacity;
16647
+ break;
16648
+ default:
16649
+ return 0;
16650
+ }
14988
16651
  }
14989
16652
  return applyCapacityTier(base, getItem(itemId).tier);
14990
16653
  }
@@ -14996,7 +16659,7 @@ function computeWarehouseHullCapabilities(stats) {
14996
16659
  const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
14997
16660
  const exponent = statSum / 1998.0;
14998
16661
  return {
14999
- hullmass: computeBaseHullmass(stats),
16662
+ hullmass: computeBaseHullmass(ITEM_WAREHOUSE_T1_PACKED, stats),
15000
16663
  capacity: Math.floor(100000000 * 6 ** exponent),
15001
16664
  };
15002
16665
  }
@@ -15017,11 +16680,15 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
15017
16680
  let maxGathDepth = 0;
15018
16681
  let hasGatherer = false;
15019
16682
  let totalStorageCapacity = 0;
16683
+ let totalCargoHoldDrain = 0;
15020
16684
  const baseCapacity = computeBaseCapacity(itemId, stats);
15021
16685
  let installedModuleMass = 0;
15022
16686
  let totalCrafterSpeed = 0;
15023
16687
  let totalCrafterDrain = 0;
15024
16688
  let hasCrafter = false;
16689
+ let totalBuilderSpeed = 0;
16690
+ let totalBuilderDrain = 0;
16691
+ let hasBuilder = false;
15025
16692
  let totalHaulerCapacity = 0;
15026
16693
  let weightedHaulerEffNum = 0n;
15027
16694
  let totalHaulerDrain = 0;
@@ -15036,6 +16703,7 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
15036
16703
  let totalBatteryCapacity = 0;
15037
16704
  const gathererLanes = [];
15038
16705
  const crafterLanes = [];
16706
+ const builderLanes = [];
15039
16707
  const loaderLanes = [];
15040
16708
  for (const mod of modules) {
15041
16709
  const item = getItem(mod.itemId);
@@ -15047,19 +16715,23 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
15047
16715
  hasEngine = true;
15048
16716
  const caps = computeEngineCapabilities(decodedStats);
15049
16717
  totalThrust += applySlotMultiplier(caps.thrust, amp);
15050
- totalEngineThm += decodedStats.thermal ?? 0;
16718
+ totalEngineThm += computeEffectiveModuleStat(decodedStats.thermal ?? 0);
15051
16719
  engineCount += 1;
15052
16720
  }
15053
16721
  else if (modType === MODULE_GENERATOR) {
15054
16722
  hasGenerator = true;
15055
16723
  const caps = computeGeneratorCapabilities(decodedStats);
15056
- totalGenCapacity += applySlotMultiplier(caps.capacity, amp);
15057
- totalGenRecharge += applySlotMultiplier(caps.recharge, amp);
16724
+ totalGenCapacity += applySlotMultiplierUint32(caps.capacity, amp);
16725
+ totalGenRecharge += applySlotMultiplierUint32(caps.recharge, amp);
15058
16726
  }
15059
16727
  else if (modType === MODULE_GATHERER) {
15060
16728
  hasGatherer = true;
15061
16729
  const tier = item.tier;
15062
- const caps = computeGathererCapabilities(decodedStats, tier);
16730
+ const caps = computeGathererCapabilities({
16731
+ strength: decodeStat(mod.stats, 0),
16732
+ tolerance: decodeStat(mod.stats, 1),
16733
+ saturation: decodeStat(mod.stats, 2),
16734
+ }, tier);
15063
16735
  const scaledYield = applySlotMultiplier(caps.yield, amp);
15064
16736
  totalGathYield += scaledYield;
15065
16737
  totalGathDrain += caps.drain;
@@ -15087,8 +16759,9 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
15087
16759
  });
15088
16760
  }
15089
16761
  else if (modType === MODULE_STORAGE) {
15090
- const caps = computeStorageCapabilities(decodedStats);
16762
+ const caps = computeStorageCapabilities(decodedStats, item.tier);
15091
16763
  totalStorageCapacity += applySlotMultiplierUint32(caps.capacity, amp);
16764
+ totalCargoHoldDrain += caps.drain;
15092
16765
  }
15093
16766
  else if (modType === MODULE_CRAFTER) {
15094
16767
  hasCrafter = true;
@@ -15103,6 +16776,19 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
15103
16776
  outputPct: amp,
15104
16777
  });
15105
16778
  }
16779
+ else if (modType === MODULE_BUILDER) {
16780
+ hasBuilder = true;
16781
+ const caps = computeBuilderCapabilities(decodedStats);
16782
+ const scaledSpeed = applySlotMultiplier(caps.speed, amp);
16783
+ totalBuilderSpeed += scaledSpeed;
16784
+ totalBuilderDrain += caps.drain;
16785
+ builderLanes.push({
16786
+ slotIndex: mod.slotIndex,
16787
+ speed: scaledSpeed,
16788
+ drain: caps.drain,
16789
+ outputPct: amp,
16790
+ });
16791
+ }
15106
16792
  else if (modType === MODULE_HAULER) {
15107
16793
  hasHauler = true;
15108
16794
  const caps = computeHaulerCapabilities(decodedStats, item.tier);
@@ -15137,12 +16823,20 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
15137
16823
  totalGenCapacity += totalBatteryCapacity;
15138
16824
  }
15139
16825
  const result = {
15140
- hullmass: computeBaseHullmass(stats) + installedModuleMass,
16826
+ hullmass: computeBaseHullmass(itemId, stats) + installedModuleMass,
15141
16827
  capacity: clampUint32(baseCapacity + totalStorageCapacity),
15142
16828
  };
15143
16829
  if (hasEngine) {
15144
16830
  const avgThm = engineCount > 0 ? Math.trunc(totalEngineThm / engineCount) : 0;
15145
- result.engines = { thrust: totalThrust, drain: computeTravelDrain(totalThrust, avgThm) };
16831
+ const engineDrain = computeTravelDrain(totalThrust, avgThm);
16832
+ const totalDrain = clampUint32(engineDrain + totalCargoHoldDrain + totalHaulerDrain);
16833
+ result.engines = { thrust: totalThrust, drain: totalDrain };
16834
+ result.travelDrain = {
16835
+ engine: engineDrain,
16836
+ cargoHolds: totalCargoHoldDrain,
16837
+ tractorBeams: totalHaulerDrain,
16838
+ total: totalDrain,
16839
+ };
15146
16840
  }
15147
16841
  if (hasGenerator) {
15148
16842
  result.generator = {
@@ -15170,6 +16864,10 @@ function computeEntityCapabilities(stats, itemId, modules, layout) {
15170
16864
  result.crafter = { speed: clampUint16(totalCrafterSpeed), drain: totalCrafterDrain };
15171
16865
  result.crafterLanes = crafterLanes;
15172
16866
  }
16867
+ if (hasBuilder) {
16868
+ result.builder = { speed: clampUint16(totalBuilderSpeed), drain: totalBuilderDrain };
16869
+ result.builderLanes = builderLanes;
16870
+ }
15173
16871
  if (hasHauler) {
15174
16872
  const efficiency = totalHaulerCapacity > 0 ? Number(weightedHaulerEffNum / BigInt(totalHaulerCapacity)) : 0;
15175
16873
  result.hauler = {
@@ -15197,7 +16895,7 @@ function computeContainerCapabilities(stats) {
15197
16895
  const statSum = (stats.strength ?? 0) + (stats.hardness ?? 0);
15198
16896
  const exponent = statSum / 1998.0;
15199
16897
  return {
15200
- hullmass: computeBaseHullmass(stats),
16898
+ hullmass: computeBaseHullmass(ITEM_CONTAINER_T1_PACKED, stats),
15201
16899
  capacity: Math.floor(22000000 * 6 ** exponent),
15202
16900
  };
15203
16901
  }
@@ -15263,7 +16961,7 @@ function makeEntity(packedItemId, state) {
15263
16961
  holds: [],
15264
16962
  };
15265
16963
  if (state.energy !== undefined)
15266
- info.energy = UInt16.from(state.energy);
16964
+ info.energy = UInt32.from(state.energy);
15267
16965
  if (kind === 'container') {
15268
16966
  info.modules = [];
15269
16967
  if (state.hullmass !== undefined)
@@ -15323,6 +17021,12 @@ function makeEntity(packedItemId, state) {
15323
17021
  drain: l.drain,
15324
17022
  output_pct: l.outputPct,
15325
17023
  }));
17024
+ info.builder_lanes = (caps.builderLanes ?? []).map((l) => Types.builder_lane.from({
17025
+ slot_index: l.slotIndex,
17026
+ speed: l.speed,
17027
+ drain: l.drain,
17028
+ output_pct: l.outputPct,
17029
+ }));
15326
17030
  info.loader_lanes = (caps.loaderLanes ?? []).map((l) => Types.loader_lane.from({
15327
17031
  slot_index: l.slotIndex,
15328
17032
  mass: l.mass,
@@ -15334,6 +17038,8 @@ function makeEntity(packedItemId, state) {
15334
17038
  info.gatherer_lanes = [];
15335
17039
  if (!info.crafter_lanes)
15336
17040
  info.crafter_lanes = [];
17041
+ if (!info.builder_lanes)
17042
+ info.builder_lanes = [];
15337
17043
  if (!info.loader_lanes)
15338
17044
  info.loader_lanes = [];
15339
17045
  const entityInfo = Types.entity_info.from(info);
@@ -15349,7 +17055,13 @@ function calc_craft_duration(speed, totalInputMass) {
15349
17055
  }
15350
17056
  function calc_craft_energy(drain, totalInputMass) {
15351
17057
  const raw = Math.floor((totalInputMass * drain) / CRAFT_ENERGY_DIVISOR);
15352
- return UInt32.from(Math.min(Math.max(raw + 1, 1), 4294967295));
17058
+ return UInt32.from(Math.min(Math.max(raw + 1, 1000), 4294967295));
17059
+ }
17060
+ function calc_build_duration(speed, totalInputMass) {
17061
+ return calc_craft_duration(speed, totalInputMass);
17062
+ }
17063
+ function calc_build_energy(drain, totalInputMass) {
17064
+ return calc_craft_energy(drain, totalInputMass);
15353
17065
  }
15354
17066
 
15355
17067
  class PlotManager extends BaseManager {
@@ -15412,7 +17124,7 @@ class PlotManager extends BaseManager {
15412
17124
  recipe,
15413
17125
  progress,
15414
17126
  finalizeAction: Name.from('buildplot'),
15415
- finalizerCapability: 'crafter',
17127
+ finalizerCapability: 'builder',
15416
17128
  activeTask,
15417
17129
  scheduledBuild,
15418
17130
  };
@@ -15460,16 +17172,16 @@ class ConstructionManager extends BaseManager {
15460
17172
  continue;
15461
17173
  if (!coordsEqual(entity.coordinates, target.coordinates))
15462
17174
  continue;
15463
- const crafterLanes = entity.crafter_lanes ?? [];
15464
- if (crafterLanes.length === 0)
17175
+ const builderLanes = entity.builder_lanes ?? [];
17176
+ if (builderLanes.length === 0)
15465
17177
  continue;
15466
- const speed = crafterLanes.reduce((s, l) => s + Number(l.speed), 0);
17178
+ const speed = builderLanes.reduce((s, l) => s + Number(l.speed), 0);
15467
17179
  out.push({
15468
17180
  entityId: entity.id,
15469
17181
  entityType: entity.type,
15470
17182
  name: entity.entity_name,
15471
- capability: 'crafter',
15472
- crafterSpeed: speed,
17183
+ capability: 'builder',
17184
+ builderSpeed: speed,
15473
17185
  estimatedDuration: this.estimateFinalizeDuration(target, speed),
15474
17186
  });
15475
17187
  }
@@ -15491,12 +17203,12 @@ class ConstructionManager extends BaseManager {
15491
17203
  cumulativeSec += task.duration.toNumber();
15492
17204
  if (!isPushTask(task))
15493
17205
  continue;
15494
- if (!task.entitytarget)
17206
+ if (task.couplings.length === 0)
15495
17207
  continue;
15496
17208
  const projectedEndMs = startedMs + cumulativeSec * 1000;
15497
17209
  if (projectedEndMs < nowMs)
15498
17210
  continue;
15499
- const targetIdStr = task.entitytarget.entity_id.toString();
17211
+ const targetIdStr = task.couplings[0].counterpart.entity_id.toString();
15500
17212
  const etaSeconds = Math.max(0, Math.round((projectedEndMs - nowMs) / 1000));
15501
17213
  let perTarget = buckets.get(targetIdStr);
15502
17214
  if (!perTarget) {
@@ -15621,8 +17333,8 @@ class ConstructionManager extends BaseManager {
15621
17333
  return [];
15622
17334
  return reservationsOf(source);
15623
17335
  }
15624
- estimateFinalizeDuration(target, crafterSpeed) {
15625
- return calc_craft_duration(crafterSpeed, target.progress.massRequired);
17336
+ estimateFinalizeDuration(target, builderSpeed) {
17337
+ return calc_build_duration(builderSpeed, target.progress.massRequired);
15626
17338
  }
15627
17339
  static isConstructionKind(kind) {
15628
17340
  return CONSTRUCTION_KINDS.has(kind);
@@ -15715,18 +17427,18 @@ function isPushTask(task) {
15715
17427
  }
15716
17428
  function isBuildOfPlot(task, plotId) {
15717
17429
  return (task.type.toNumber() === TaskType.BUILDPLOT &&
15718
- task.entitytarget !== undefined &&
15719
- task.entitytarget.entity_id.equals(plotId));
17430
+ task.couplings.length > 0 &&
17431
+ task.couplings[0].counterpart.entity_id.equals(plotId));
15720
17432
  }
15721
17433
  function reservationsOf(source) {
15722
17434
  const out = new Map();
15723
17435
  for (const task of getTasks(source)) {
15724
17436
  if (!isPushTask(task))
15725
17437
  continue;
15726
- if (!task.entitytarget)
17438
+ if (task.couplings.length === 0)
15727
17439
  continue;
15728
- const targetType = task.entitytarget.entity_type;
15729
- const targetId = task.entitytarget.entity_id;
17440
+ const targetType = task.couplings[0].counterpart.entity_type;
17441
+ const targetId = task.couplings[0].counterpart.entity_id;
15730
17442
  for (const c of task.cargo) {
15731
17443
  const itemId = c.item_id.toNumber();
15732
17444
  const quantity = c.quantity.toNumber();
@@ -15815,11 +17527,23 @@ function planRoute(params) {
15815
17527
  return { ok: false, reason: 'empty-destination' };
15816
17528
  }
15817
17529
  const straightLine = dist(origin, dest);
15818
- const heuristic = (c) => Math.ceil(dist(c, dest) / perLegReach);
17530
+ if (straightLine <= perLegReach) {
17531
+ const directCost = params.legCost?.({
17532
+ from: origin,
17533
+ to: dest,
17534
+ distance: straightLine,
17535
+ isDestination: true,
17536
+ });
17537
+ if (directCost !== null) {
17538
+ return { ok: true, waypoints: [dest], legs: 1, totalDistance: straightLine };
17539
+ }
17540
+ }
17541
+ const heuristic = (c) => params.heuristicCost?.(c, dest) ??
17542
+ (params.legCost ? 0 : Math.ceil(dist(c, dest) / perLegReach));
15819
17543
  const gScore = new Map([[key(origin), 0]]);
15820
17544
  const cameFrom = new Map();
15821
17545
  const frontier = [
15822
- { coord: origin, g: 0, f: heuristic(origin), remaining: straightLine },
17546
+ { coord: origin, legs: 0, cost: 0, f: heuristic(origin), remaining: straightLine },
15823
17547
  ];
15824
17548
  let furthest = origin;
15825
17549
  let furthestRemaining = dist(origin, dest);
@@ -15835,6 +17559,8 @@ function planRoute(params) {
15835
17559
  }
15836
17560
  }
15837
17561
  const current = frontier.splice(bestIdx, 1)[0];
17562
+ if (current.cost !== gScore.get(key(current.coord)))
17563
+ continue;
15838
17564
  if (sameCoord(current.coord, dest)) {
15839
17565
  return reconstruct(cameFrom, origin, dest);
15840
17566
  }
@@ -15848,20 +17574,33 @@ function planRoute(params) {
15848
17574
  const inCorridor = dist(origin, n.coord) + dist(n.coord, dest) <= straightLine + corridorSlack;
15849
17575
  if (!inCorridor)
15850
17576
  continue;
15851
- const tentativeG = current.g + 1;
15852
- if (tentativeG > maxLegs) {
17577
+ const tentativeLegs = current.legs + 1;
17578
+ if (tentativeLegs > maxLegs) {
15853
17579
  cappedByMaxLegs = true;
15854
17580
  continue;
15855
17581
  }
17582
+ const evaluatedCost = params.legCost?.({
17583
+ from: current.coord,
17584
+ to: n.coord,
17585
+ distance: n.dist,
17586
+ isDestination: sameCoord(n.coord, dest),
17587
+ });
17588
+ if (evaluatedCost === null)
17589
+ continue;
17590
+ const legCost = evaluatedCost ?? 1;
17591
+ if (!(legCost >= 0) || !Number.isFinite(legCost))
17592
+ continue;
15856
17593
  const nk = key(n.coord);
15857
- if (tentativeG < (gScore.get(nk) ?? Infinity)) {
15858
- gScore.set(nk, tentativeG);
17594
+ const nextCost = current.cost + legCost;
17595
+ if (nextCost < (gScore.get(nk) ?? Infinity)) {
17596
+ gScore.set(nk, nextCost);
15859
17597
  cameFrom.set(nk, current.coord);
15860
17598
  const remaining = dist(n.coord, dest);
15861
17599
  frontier.push({
15862
17600
  coord: n.coord,
15863
- g: tentativeG,
15864
- f: tentativeG + Math.ceil(remaining / perLegReach),
17601
+ legs: tentativeLegs,
17602
+ cost: nextCost,
17603
+ f: nextCost + heuristic(n.coord),
15865
17604
  remaining,
15866
17605
  });
15867
17606
  }
@@ -15911,47 +17650,22 @@ function reconstruct(cameFrom, origin, dest) {
15911
17650
  const waypoints = path.slice(1);
15912
17651
  return { ok: true, waypoints, legs: waypoints.length, totalDistance };
15913
17652
  }
15914
- let scanProvider = null;
15915
- const graphCache = new Map();
15916
- function setScanProvider(provider) {
15917
- scanProvider = provider;
15918
- graphCache.clear();
15919
- }
15920
- function sdkSystemGraph(seed) {
17653
+ const graphCache = new WeakMap();
17654
+ function sdkSystemGraph(seed, scan) {
15921
17655
  const s = Checksum256.from(seed);
15922
17656
  const seedHex = s.toString();
15923
- const cached = graphCache.get(seedHex);
17657
+ let bySeed = graphCache.get(scan);
17658
+ if (!bySeed) {
17659
+ bySeed = new Map();
17660
+ graphCache.set(scan, bySeed);
17661
+ }
17662
+ const cached = bySeed.get(seedHex);
15924
17663
  if (cached)
15925
17664
  return cached;
15926
- const graph = scanProvider ? wasmSystemGraph(s, seedHex, scanProvider) : jsSystemGraph(s);
15927
- graphCache.set(seedHex, graph);
17665
+ const graph = wasmSystemGraph(s, seedHex, scan);
17666
+ bySeed.set(seedHex, graph);
15928
17667
  return graph;
15929
17668
  }
15930
- function jsSystemGraph(s) {
15931
- return {
15932
- hasSystem: (c) => hasSystem(s, { x: c.x, y: c.y }) || wormholeAt(s, c.x, c.y) !== null,
15933
- nearby: (c, reachTiles) => {
15934
- const seen = new Set([`${c.x},${c.y}`]);
15935
- const out = [];
15936
- for (const d of findNearbyPlanets(s, { x: c.x, y: c.y }, reachTiles * PRECISION$1)) {
15937
- const coord = { x: Number(d.destination.x), y: Number(d.destination.y) };
15938
- const k = `${coord.x},${coord.y}`;
15939
- if (seen.has(k))
15940
- continue;
15941
- seen.add(k);
15942
- out.push({ coord, dist: Number(d.distance) / PRECISION$1 });
15943
- }
15944
- for (const coord of nearbyWormholes(s, c.x, c.y, reachTiles)) {
15945
- const k = `${coord.x},${coord.y}`;
15946
- if (seen.has(k))
15947
- continue;
15948
- seen.add(k);
15949
- out.push({ coord, dist: Math.hypot(coord.x - c.x, coord.y - c.y) });
15950
- }
15951
- return out;
15952
- },
15953
- };
15954
- }
15955
17669
  const SCAN_BUCKET = 48;
15956
17670
  function wasmSystemGraph(s, seedHex, scan) {
15957
17671
  const bucketCache = new Map();
@@ -16004,21 +17718,120 @@ function wasmSystemGraph(s, seedHex, scan) {
16004
17718
  };
16005
17719
  }
16006
17720
 
16007
- function computePerLegReach(s, haulCount = 0) {
17721
+ function computePerLegReach(s) {
16008
17722
  const capacity = s.generator?.capacity;
16009
17723
  const drain = s.engines?.drain;
16010
17724
  if (capacity === undefined || drain === undefined || drain === 0n) {
16011
17725
  throw new Error('entity has no usable engine/generator (cannot compute per-leg reach)');
16012
17726
  }
16013
- const haulDrain = s.hauler && haulCount > 0 ? s.hauler.drain * BigInt(haulCount) : 0n;
16014
- return Number(capacity) / Number(drain + haulDrain);
17727
+ return Number(capacity) / Number(drain);
16015
17728
  }
16016
- function computeGroupPerLegReach(participants, haulCount) {
17729
+ function computeGroupPerLegReach(participants) {
16017
17730
  const movers = participants.filter((p) => p.engines !== undefined && p.engines.drain !== 0n);
16018
17731
  if (movers.length === 0) {
16019
17732
  throw new Error('group has no moving entity (cannot compute per-leg reach)');
16020
17733
  }
16021
- return Math.min(...movers.map((p) => computePerLegReach(p, haulCount)));
17734
+ return Math.min(...movers.map(computePerLegReach));
17735
+ }
17736
+
17737
+ function simulateRoute(movers, waypoints, origin, recharge) {
17738
+ const totalThrust = movers
17739
+ .filter((m) => m.hasMovement && m.engines)
17740
+ .reduce((sum, m) => sum + m.engines.thrust, 0);
17741
+ const totalMass = movers.reduce((sum, m) => sum + m.mass, 0);
17742
+ const haulCount = movers.filter((m) => !m.hasMovement).length;
17743
+ const pooledHaulCap = movers
17744
+ .filter((m) => m.hasMovement && m.hauler)
17745
+ .reduce((sum, m) => sum + m.hauler.capacity, 0);
17746
+ const weightedHaulEffNum = movers
17747
+ .filter((m) => m.hasMovement && m.hauler)
17748
+ .reduce((sum, m) => sum + m.hauler.efficiency * m.hauler.capacity, 0);
17749
+ const energyByMover = new Map(movers.map((m) => [String(m.ref.entityId), m.energy]));
17750
+ let reachable = true;
17751
+ const legs = [];
17752
+ const mobilityBarrier = movers
17753
+ .filter((m) => m.hasMovement)
17754
+ .reduce((mx, m) => Math.max(mx, m.priorMobilityEnd, m.narrowBarrierEnd), 0);
17755
+ const rechargeFloor = movers
17756
+ .filter((m) => m.hasMovement && m.generator)
17757
+ .reduce((mx, m) => Math.max(mx, m.allLanesEnd ?? 0), 0);
17758
+ let clock = 0;
17759
+ let from = origin;
17760
+ for (const to of waypoints) {
17761
+ const distance = distanceBetweenPoints(from.x, from.y, to.x, to.y);
17762
+ const distanceNum = Number(distance);
17763
+ const distanceCells = distanceNum / PRECISION;
17764
+ const energyCostByMover = {};
17765
+ for (const m of movers) {
17766
+ if (!m.hasMovement || !m.engines)
17767
+ continue;
17768
+ const key = String(m.ref.entityId);
17769
+ energyCostByMover[key] = Number(calc_energyusage(distance, m.engines.drain));
17770
+ }
17771
+ let rechargeBefore = false;
17772
+ let rechargeSeconds = 0;
17773
+ if (recharge) {
17774
+ let maxDur = 0;
17775
+ for (const m of movers) {
17776
+ if (!m.hasMovement || !m.generator)
17777
+ continue;
17778
+ const key = String(m.ref.entityId);
17779
+ const curEnergy = energyByMover.get(key) ?? 0;
17780
+ const dur = Number(calc_rechargetime(m.generator.capacity, curEnergy, m.generator.recharge));
17781
+ if (dur > maxDur)
17782
+ maxDur = dur;
17783
+ }
17784
+ rechargeSeconds = maxDur;
17785
+ rechargeBefore = rechargeSeconds > 0;
17786
+ if (rechargeBefore) {
17787
+ for (const m of movers) {
17788
+ if (!m.hasMovement || !m.generator)
17789
+ continue;
17790
+ const key = String(m.ref.entityId);
17791
+ energyByMover.set(key, m.generator.capacity);
17792
+ }
17793
+ clock = Math.max(clock, rechargeFloor) + rechargeSeconds;
17794
+ }
17795
+ }
17796
+ for (const m of movers) {
17797
+ if (!m.hasMovement || !m.engines)
17798
+ continue;
17799
+ const key = String(m.ref.entityId);
17800
+ const cost = energyCostByMover[key] ?? 0;
17801
+ const curEnergy = energyByMover.get(key) ?? 0;
17802
+ if (recharge && m.generator) {
17803
+ if (cost > m.generator.capacity)
17804
+ reachable = false;
17805
+ }
17806
+ else {
17807
+ if (cost > curEnergy)
17808
+ reachable = false;
17809
+ }
17810
+ }
17811
+ const flightSeconds = Number(calc_group_flighttime(totalThrust, haulCount, pooledHaulCap, weightedHaulEffNum, totalMass, distance));
17812
+ if (flightSeconds > TRAVEL_MAX_DURATION)
17813
+ reachable = false;
17814
+ for (const m of movers) {
17815
+ if (!m.hasMovement || !m.engines)
17816
+ continue;
17817
+ const key = String(m.ref.entityId);
17818
+ const cost = energyCostByMover[key] ?? 0;
17819
+ const curEnergy = energyByMover.get(key) ?? 0;
17820
+ energyByMover.set(key, Math.max(0, curEnergy - cost));
17821
+ }
17822
+ clock = Math.max(clock, mobilityBarrier) + flightSeconds;
17823
+ legs.push({
17824
+ from,
17825
+ to,
17826
+ distanceCells,
17827
+ energyCostByMover,
17828
+ rechargeBefore,
17829
+ rechargeSeconds,
17830
+ flightSeconds,
17831
+ });
17832
+ from = to;
17833
+ }
17834
+ return { legs, totalSeconds: clock, reachable };
16022
17835
  }
16023
17836
 
16024
17837
  function laneKeyForModule(slotIndex) {
@@ -16074,6 +17887,23 @@ function resolveLaneCrafter(modules, entityItemId, laneKey) {
16074
17887
  const drain = computeCrafterDrain(fin);
16075
17888
  return { slotIndex: idx, speed, drain, outputPct: amp };
16076
17889
  }
17890
+ function resolveLaneBuilder(modules, entityItemId, laneKey) {
17891
+ const idx = laneKey - 1;
17892
+ const installed = idx >= 0 && idx < modules.length ? modules[idx].installed : undefined;
17893
+ if (!installed)
17894
+ throw new Error('builder lane has no module');
17895
+ const item = getItem(Number(installed.item_id.value ?? installed.item_id));
17896
+ if (item.moduleType !== 'builder')
17897
+ throw new Error('lane module is not a builder');
17898
+ const stats = BigInt(installed.stats.toString());
17899
+ const coh = decodeStat(stats, 0);
17900
+ const tol = decodeStat(stats, 1);
17901
+ const layout = getEntityLayout(entityItemId)?.slots ?? [];
17902
+ const amp = getSlotAmp(layout, idx);
17903
+ const speed = applySlotMultiplier(computeBuilderSpeed(coh), amp);
17904
+ const drain = computeBuilderDrain(tol);
17905
+ return { slotIndex: idx, speed, drain, outputPct: amp };
17906
+ }
16077
17907
  function resolveLaneLoader(modules, entityItemId, laneKey) {
16078
17908
  if (laneKey === LANE_MOBILITY) {
16079
17909
  return { slotIndex: -1, thrust: 0, mass: 0, outputPct: 0, valid: false };
@@ -16381,6 +18211,10 @@ function recomputeCaps(entity) {
16381
18211
  hullStats.strength = decodeStat(entity.stats, 0);
16382
18212
  if (hullStats.hardness === undefined)
16383
18213
  hullStats.hardness = decodeStat(entity.stats, 2);
18214
+ if (itemId === ITEM_SHIP_T1_PACKED) {
18215
+ hullStats.__legacyShipChannel3 = decodeStat(entity.stats, 3);
18216
+ hullStats.__legacyShipChannel4 = decodeStat(entity.stats, 4);
18217
+ }
16384
18218
  const layout = getEntityLayout(itemId)?.slots ?? [];
16385
18219
  const installed = toInstalledModules(entity.modules);
16386
18220
  const caps = computeEntityCapabilities(hullStats, itemId, installed, layout);
@@ -16403,6 +18237,12 @@ function recomputeCaps(entity) {
16403
18237
  drain: l.drain,
16404
18238
  output_pct: l.outputPct,
16405
18239
  });
18240
+ const toBuilderLane = (l) => Types.builder_lane.from({
18241
+ slot_index: l.slotIndex,
18242
+ speed: l.speed,
18243
+ drain: l.drain,
18244
+ output_pct: l.outputPct,
18245
+ });
16406
18246
  return {
16407
18247
  hullmass: UInt32.from(caps.hullmass),
16408
18248
  capacity: UInt32.from(caps.capacity),
@@ -16413,6 +18253,7 @@ function recomputeCaps(entity) {
16413
18253
  loaderLanes: (caps.loaderLanes ?? []).map(toLoaderLane),
16414
18254
  gathererLanes: (caps.gathererLanes ?? []).map(toGathererLane),
16415
18255
  crafterLanes: (caps.crafterLanes ?? []).map(toCrafterLane),
18256
+ builderLanes: (caps.builderLanes ?? []).map(toBuilderLane),
16416
18257
  hauler: caps.hauler
16417
18258
  ? Types.hauler_stats.from({
16418
18259
  capacity: caps.hauler.capacity,
@@ -16449,6 +18290,7 @@ function createProjectedEntity(entity) {
16449
18290
  const loaderLanes = entity.loader_lanes ?? caps?.loaderLanes ?? [];
16450
18291
  const gathererLanes = entity.gatherer_lanes ?? caps?.gathererLanes ?? [];
16451
18292
  const crafterLanes = entity.crafter_lanes ?? caps?.crafterLanes ?? [];
18293
+ const builderLanes = entity.builder_lanes ?? caps?.builderLanes ?? [];
16452
18294
  const engines = entity.engines ?? caps?.engines;
16453
18295
  const generator = entity.generator ?? caps?.generator;
16454
18296
  const hauler = entity.hauler ?? caps?.hauler;
@@ -16457,7 +18299,7 @@ function createProjectedEntity(entity) {
16457
18299
  const cargo = entity.cargo.map(cargoItemToStack);
16458
18300
  const projected = {
16459
18301
  location: Coordinates.from(entity.coordinates),
16460
- energy: UInt16.from(entity.energy ?? 0),
18302
+ energy: UInt32.from(entity.energy ?? 0),
16461
18303
  cargo,
16462
18304
  shipMass,
16463
18305
  capacity: capacity ? UInt64.from(capacity) : undefined,
@@ -16468,6 +18310,7 @@ function createProjectedEntity(entity) {
16468
18310
  loaderLanes,
16469
18311
  gathererLanes,
16470
18312
  crafterLanes,
18313
+ builderLanes,
16471
18314
  get cargoMass() {
16472
18315
  return calcStacksMass(this.cargo);
16473
18316
  },
@@ -16513,13 +18356,13 @@ function applyRechargeTask(projected, _task, options) {
16513
18356
  if (!projected.generator)
16514
18357
  return;
16515
18358
  if (options.complete) {
16516
- projected.energy = UInt16.from(projected.generator.capacity);
18359
+ projected.energy = UInt32.from(projected.generator.capacity);
16517
18360
  }
16518
18361
  else if (options.progress !== undefined) {
16519
18362
  const capacity = Number(projected.generator.capacity);
16520
18363
  const currentEnergy = Number(projected.energy);
16521
18364
  const rechargeAmount = (capacity - currentEnergy) * options.progress;
16522
- projected.energy = UInt16.from(Math.min(capacity, currentEnergy + rechargeAmount));
18365
+ projected.energy = UInt32.from(Math.min(capacity, currentEnergy + rechargeAmount));
16523
18366
  }
16524
18367
  }
16525
18368
  function applyFlightTask(projected, task, options) {
@@ -16538,8 +18381,8 @@ function applyFlightTask(projected, task, options) {
16538
18381
  });
16539
18382
  const partialEnergy = UInt64.from(Math.floor(Number(task.energy_cost ?? 0) * options.progress));
16540
18383
  projected.energy = projected.energy.gt(partialEnergy)
16541
- ? UInt16.from(projected.energy.subtracting(partialEnergy))
16542
- : UInt16.from(0);
18384
+ ? UInt32.from(projected.energy.subtracting(partialEnergy))
18385
+ : UInt32.from(0);
16543
18386
  }
16544
18387
  }
16545
18388
  function addCargoItem(projected, item) {
@@ -16561,16 +18404,16 @@ function applyRemoveCargoTask(projected, task) {
16561
18404
  function applyEnergyCost(projected, task) {
16562
18405
  if (!task.energy_cost)
16563
18406
  return;
16564
- const energyCost = UInt16.from(task.energy_cost);
18407
+ const energyCost = UInt32.from(task.energy_cost);
16565
18408
  projected.energy = projected.energy.gt(energyCost)
16566
- ? UInt16.from(projected.energy.subtracting(energyCost))
16567
- : UInt16.from(0);
18409
+ ? UInt32.from(projected.energy.subtracting(energyCost))
18410
+ : UInt32.from(0);
16568
18411
  }
16569
18412
  function applyGatherTask(projected, task, options) {
16570
18413
  if (!options.complete)
16571
18414
  return;
16572
18415
  applyEnergyCost(projected, task);
16573
- if (!task.entitytarget) {
18416
+ if (task.couplings.length === 0) {
16574
18417
  applyAddCargoTask(projected, task);
16575
18418
  }
16576
18419
  }
@@ -16581,12 +18424,8 @@ function applyCraftTask(projected, task) {
16581
18424
  for (let i = 0; i < task.cargo.length - 1; i++) {
16582
18425
  removeCargoItem(projected, task.cargo[i]);
16583
18426
  }
16584
- addCargoItem(projected, task.cargo[task.cargo.length - 1]);
16585
- }
16586
- function applyDeployTask(projected, task) {
16587
- applyEnergyCost(projected, task);
16588
- if (task.cargo.length > 0) {
16589
- removeCargoItem(projected, task.cargo[0]);
18427
+ if (task.couplings.length === 0) {
18428
+ addCargoItem(projected, task.cargo[task.cargo.length - 1]);
16590
18429
  }
16591
18430
  }
16592
18431
  function applyTask(projected, task) {
@@ -16612,9 +18451,6 @@ function applyTask(projected, task) {
16612
18451
  case TaskType.CRAFT:
16613
18452
  applyCraftTask(projected, task);
16614
18453
  break;
16615
- case TaskType.DEPLOY:
16616
- applyDeployTask(projected, task);
16617
- break;
16618
18454
  case TaskType.UNDEPLOY:
16619
18455
  case TaskType.DEMOLISH:
16620
18456
  break;
@@ -16752,10 +18588,6 @@ function projectEntityAt(entity, now) {
16752
18588
  if (taskComplete)
16753
18589
  applyCraftTask(projected, task);
16754
18590
  break;
16755
- case TaskType.DEPLOY:
16756
- if (taskComplete)
16757
- applyDeployTask(projected, task);
16758
- break;
16759
18591
  case TaskType.UNDEPLOY:
16760
18592
  case TaskType.DEMOLISH:
16761
18593
  break;
@@ -16782,7 +18614,7 @@ function taskCargoChanges(task) {
16782
18614
  case TaskType.UNWRAP:
16783
18615
  return items.map((i) => toChange(i, 'in'));
16784
18616
  case TaskType.GATHER:
16785
- return task.entitytarget ? [] : items.map((i) => toChange(i, 'in'));
18617
+ return task.couplings.length > 0 ? [] : items.map((i) => toChange(i, 'in'));
16786
18618
  case TaskType.UNLOAD:
16787
18619
  return items.map((i) => toChange(i, 'out'));
16788
18620
  case TaskType.CRAFT:
@@ -16795,6 +18627,49 @@ function taskCargoChanges(task) {
16795
18627
  }
16796
18628
  }
16797
18629
 
18630
+ const JOB_QUEUE_CAP = 25;
18631
+ function activeOn(jobs, socket, now) {
18632
+ return jobs
18633
+ .filter((j) => j.socket === socket && j.completesAt > now)
18634
+ .sort((a, b) => a.startsAt.getTime() - b.startsAt.getTime());
18635
+ }
18636
+ function jobsToLanes(jobs, socketCount, now) {
18637
+ const lanes = [];
18638
+ for (let socket = 0; socket < socketCount; socket++) {
18639
+ const entries = [];
18640
+ let cursor = null;
18641
+ for (const j of activeOn(jobs, socket, now)) {
18642
+ if (cursor && j.startsAt > cursor) {
18643
+ entries.push({ kind: 'idle', startsAt: cursor, completesAt: j.startsAt });
18644
+ }
18645
+ entries.push({ kind: 'job', startsAt: j.startsAt, completesAt: j.completesAt, job: j });
18646
+ cursor = j.completesAt;
18647
+ }
18648
+ lanes.push({ socket, entries });
18649
+ }
18650
+ return lanes;
18651
+ }
18652
+ function socketTail(jobs, socket, now) {
18653
+ const active = activeOn(jobs, socket, now);
18654
+ const last = active[active.length - 1];
18655
+ return last && last.completesAt > now ? last.completesAt : now;
18656
+ }
18657
+ function pickFabricator(jobs, sockets, durationBySocketMinutes, now) {
18658
+ let best = null;
18659
+ for (let slot = 0; slot < sockets.length; slot++) {
18660
+ if (!sockets[slot].open)
18661
+ continue;
18662
+ if (activeOn(jobs, slot, now).length >= JOB_QUEUE_CAP)
18663
+ continue;
18664
+ const startsAt = socketTail(jobs, slot, now);
18665
+ const completesAt = new Date(startsAt.getTime() + durationBySocketMinutes[slot] * 60000);
18666
+ if (!best || completesAt < best.completesAt) {
18667
+ best = { slot, startsAt, completesAt };
18668
+ }
18669
+ }
18670
+ return best;
18671
+ }
18672
+
16798
18673
  function composeIdleResolve(blocker, action, actions, now, lookupCounterpart) {
16799
18674
  const ids = [];
16800
18675
  const seen = new Set();
@@ -16829,15 +18704,16 @@ function taskCargoEffect(task) {
16829
18704
  case TaskType.UNLOAD:
16830
18705
  return { added: [], removed: task.cargo };
16831
18706
  case TaskType.GATHER:
16832
- return task.entitytarget ? { added: [], removed: [] } : { added: task.cargo, removed: [] };
18707
+ return task.couplings.length > 0
18708
+ ? { added: [], removed: [] }
18709
+ : { added: task.cargo, removed: [] };
16833
18710
  case TaskType.CRAFT:
16834
18711
  if (task.cargo.length === 0)
16835
18712
  return { added: [], removed: [] };
16836
- return { added: [task.cargo[task.cargo.length - 1]], removed: task.cargo.slice(0, -1) };
16837
- case TaskType.DEPLOY:
16838
- return task.cargo.length > 0
16839
- ? { added: [], removed: [task.cargo[0]] }
16840
- : { added: [], removed: [] };
18713
+ return {
18714
+ added: task.couplings.length === 0 ? [task.cargo[task.cargo.length - 1]] : [],
18715
+ removed: task.cargo.slice(0, -1),
18716
+ };
16841
18717
  default:
16842
18718
  return { added: [], removed: [] };
16843
18719
  }
@@ -17015,31 +18891,24 @@ function cancelEligibility(entity, laneKey, fromTaskIndex, input) {
17015
18891
  effects.abandonsRunning = true;
17016
18892
  if (t.energy_cost)
17017
18893
  energyForfeited += t.energy_cost.toNumber();
17018
- if (t.type.equals(TaskType.BUILDPLOT) && t.entitytarget)
17019
- effects.keepsPlotDeposits = { plot: t.entitytarget };
17020
- if (t.hold && t.entitytarget) {
17021
- const counterpart = input.counterparts?.get(t.entitytarget.entity_id.toString());
17022
- const hold = (counterpart?.holds ?? []).find((h) => h.id.equals(t.hold)) ??
17023
- (entity.holds ?? []).find((h) => h.id.equals(t.hold));
17024
- if (hold) {
17025
- const kind = hold.kind.toNumber();
17026
- effects.releasedHolds.push({ counterpart: t.entitytarget, kind });
17027
- if (kind === 1 ) {
17028
- effects.refunds.push({ giver: t.entitytarget, cargo: t.cargo });
17029
- const giver = counterpart;
17030
- if (giver) {
17031
- const returned = t.cargo.reduce((s, c) => s + calcCargoItemMass(c).toNumber(), 0);
17032
- const cap = giver.capacity
17033
- ? giver.capacity.toNumber()
17034
- : Number.MAX_SAFE_INTEGER;
17035
- if (giver.cargomass.toNumber() + returned > cap) {
17036
- return {
17037
- ok: false,
17038
- blockedReason: CancelBlockReason.WOULD_OVERFILL,
17039
- range,
17040
- effects: { ...EMPTY_EFFECTS },
17041
- };
17042
- }
18894
+ if (t.type.equals(TaskType.BUILDPLOT) && t.couplings.length > 0)
18895
+ effects.keepsPlotDeposits = { plot: t.couplings[0].counterpart };
18896
+ for (const c of t.couplings) {
18897
+ const kind = c.kind.toNumber();
18898
+ effects.releasedHolds.push({ counterpart: c.counterpart, kind });
18899
+ if (kind === HoldKind.PULL) {
18900
+ effects.refunds.push({ giver: c.counterpart, cargo: t.cargo });
18901
+ const giver = input.counterparts?.get(c.counterpart.entity_id.toString());
18902
+ if (giver) {
18903
+ const returned = t.cargo.reduce((s, c) => s + calcCargoItemMass(c).toNumber(), 0);
18904
+ const cap = giver.capacity ? giver.capacity.toNumber() : Number.MAX_SAFE_INTEGER;
18905
+ if (giver.cargomass.toNumber() + returned > cap) {
18906
+ return {
18907
+ ok: false,
18908
+ blockedReason: CancelBlockReason.WOULD_OVERFILL,
18909
+ range,
18910
+ effects: { ...EMPTY_EFFECTS },
18911
+ };
17043
18912
  }
17044
18913
  }
17045
18914
  }
@@ -17072,7 +18941,7 @@ function derivedLoaders(lanes) {
17072
18941
  function acceleration(thrust, mass) {
17073
18942
  if (mass <= 0)
17074
18943
  return 0;
17075
- return (thrust / mass) * PRECISION$1;
18944
+ return (thrust / mass) * PRECISION;
17076
18945
  }
17077
18946
  function flightTime(distance, accel) {
17078
18947
  if (accel <= 0 || distance <= 0)
@@ -17082,7 +18951,7 @@ function flightTime(distance, accel) {
17082
18951
  function distance2d(ax, ay, bx, by) {
17083
18952
  const dx = ax - bx;
17084
18953
  const dy = ay - by;
17085
- return Math.floor(Math.sqrt(dx * dx + dy * dy) * PRECISION$1);
18954
+ return Math.floor(Math.sqrt(dx * dx + dy * dy) * PRECISION);
17086
18955
  }
17087
18956
  function unwrapTransitDuration(itemMass, origin, dest) {
17088
18957
  if (itemMass <= 0)
@@ -17247,10 +19116,10 @@ function hasGatherer(e) {
17247
19116
  function maxTravelDistance(entity) {
17248
19117
  return UInt32.from(entity.generator.capacity)
17249
19118
  .dividing(entity.engines.drain)
17250
- .multiplying(PRECISION$1);
19119
+ .multiplying(PRECISION);
17251
19120
  }
17252
19121
  function calcEnergyUsage(entity, distance) {
17253
- return distance.dividing(PRECISION$1).multiplying(entity.engines.drain);
19122
+ return distance.multiplying(entity.engines.drain).dividing(PRECISION);
17254
19123
  }
17255
19124
  function energyPercent(entity) {
17256
19125
  return (Number(entity.energy) / Number(entity.generator.capacity)) * 100;
@@ -17285,13 +19154,12 @@ function calc_gather_rate(gatherer, itemMass, stratum, richness) {
17285
19154
  function calc_gather_energy(gatherer, duration) {
17286
19155
  if (duration <= 0)
17287
19156
  return UInt32.from(0);
17288
- const raw = Math.floor((duration * gatherer.drain.toNumber()) / PRECISION$1);
17289
- return UInt32.from(Math.min(Math.max(raw, 1), 4294967295));
19157
+ const raw = Math.floor((duration * gatherer.drain.toNumber()) / PRECISION);
19158
+ return UInt32.from(Math.min(Math.max(raw, 1000), 4294967295));
17290
19159
  }
17291
19160
 
17292
19161
  const BASE_HAUL_PENALTY_MILLI = 300;
17293
19162
  const HAULER_EFFICIENCY_DENOM = 10000;
17294
- const PRECISION = 10000;
17295
19163
  function computeHaulPenalty(totalThrust, haulCount, avgEfficiency) {
17296
19164
  if (haulCount === 0)
17297
19165
  return totalThrust;
@@ -17300,9 +19168,6 @@ function computeHaulPenalty(totalThrust, haulCount, avgEfficiency) {
17300
19168
  HAULER_EFFICIENCY_DENOM);
17301
19169
  return Math.floor((totalThrust * 1000) / penaltyMilli);
17302
19170
  }
17303
- function computeHaulerDrain(distance, drain, haulCount) {
17304
- return Math.floor(distance / PRECISION) * drain * haulCount;
17305
- }
17306
19171
 
17307
19172
  const categoryColors = {
17308
19173
  ore: '#C26D3F',
@@ -17459,8 +19324,17 @@ const capabilityAttributes = [
17459
19324
  attribute: 'capacity',
17460
19325
  description: 'Cargo capacity added by hulls and installed Cargo Hold modules',
17461
19326
  },
19327
+ {
19328
+ capability: 'Storage',
19329
+ attribute: 'drain',
19330
+ description: 'Fixed normal-travel drain contributed by an installed Cargo Hold',
19331
+ },
17462
19332
  { capability: 'Movement', attribute: 'thrust', description: 'Propulsion force' },
17463
- { capability: 'Movement', attribute: 'drain', description: 'Energy consumed per movement' },
19333
+ {
19334
+ capability: 'Movement',
19335
+ attribute: 'drain',
19336
+ description: 'Total installed energy consumed per tile of normal travel',
19337
+ },
17464
19338
  {
17465
19339
  capability: 'Energy',
17466
19340
  attribute: 'capacity',
@@ -17501,7 +19375,7 @@ const capabilityAttributes = [
17501
19375
  {
17502
19376
  capability: 'Hauling',
17503
19377
  attribute: 'drain',
17504
- description: 'Energy consumed per target during haul-beam operation',
19378
+ description: 'Fixed normal-travel drain contributed by an installed Tractor Beam',
17505
19379
  },
17506
19380
  ];
17507
19381
  const invertedAttributes = new Set(['drain', 'mass']);
@@ -17867,6 +19741,20 @@ function rollupCrafter(lanes) {
17867
19741
  drain: UInt32.from(totalDrain),
17868
19742
  };
17869
19743
  }
19744
+ function rollupBuilder(lanes) {
19745
+ if (lanes.length === 0)
19746
+ return undefined;
19747
+ let totalSpeed = 0;
19748
+ let totalDrain = 0;
19749
+ for (const l of lanes) {
19750
+ totalSpeed += Number(l.speed);
19751
+ totalDrain += Number(l.drain);
19752
+ }
19753
+ return {
19754
+ speed: UInt16.from(Math.min(totalSpeed, 65535)),
19755
+ drain: UInt32.from(totalDrain),
19756
+ };
19757
+ }
17870
19758
  function rollupLoaders(lanes) {
17871
19759
  if (lanes.length === 0)
17872
19760
  return undefined;
@@ -17970,8 +19858,8 @@ function computeCapabilityGroup(moduleType, stats, tier, outputPct = 100) {
17970
19858
  return {
17971
19859
  capability: 'Generator',
17972
19860
  attributes: [
17973
- { label: 'Capacity', value: caps.capacity },
17974
- { label: 'Recharge', value: caps.recharge },
19861
+ { label: 'Capacity', value: toWholeEnergy$1(caps.capacity) },
19862
+ { label: 'Recharge', value: toWholeEnergy$1(caps.recharge) },
17975
19863
  ],
17976
19864
  };
17977
19865
  }
@@ -17981,7 +19869,7 @@ function computeCapabilityGroup(moduleType, stats, tier, outputPct = 100) {
17981
19869
  capability: 'Gatherer',
17982
19870
  attributes: [
17983
19871
  { label: 'Yield', value: caps.yield },
17984
- { label: 'Drain', value: caps.drain },
19872
+ { label: 'Drain', value: toWholeEnergy$1(caps.drain) },
17985
19873
  { label: 'Depth', value: caps.depth },
17986
19874
  ],
17987
19875
  };
@@ -18003,7 +19891,7 @@ function computeCapabilityGroup(moduleType, stats, tier, outputPct = 100) {
18003
19891
  capability: 'Crafting',
18004
19892
  attributes: [
18005
19893
  { label: 'Speed', value: caps.speed },
18006
- { label: 'Drain', value: caps.drain },
19894
+ { label: 'Drain', value: toWholeEnergy$1(caps.drain) },
18007
19895
  ],
18008
19896
  };
18009
19897
  }
@@ -18014,12 +19902,12 @@ function computeCapabilityGroup(moduleType, stats, tier, outputPct = 100) {
18014
19902
  attributes: [
18015
19903
  { label: 'Capacity', value: caps.capacity },
18016
19904
  { label: 'Efficiency', value: caps.efficiency },
18017
- { label: 'Drain', value: caps.drain },
19905
+ { label: 'Drain', value: toWholeEnergy$1(caps.drain) },
18018
19906
  ],
18019
19907
  };
18020
19908
  }
18021
19909
  case MODULE_STORAGE: {
18022
- const caps = computeStorageCapabilities(stats);
19910
+ const caps = computeStorageCapabilities(stats, tier);
18023
19911
  return {
18024
19912
  capability: 'Storage',
18025
19913
  attributes: [
@@ -18027,6 +19915,7 @@ function computeCapabilityGroup(moduleType, stats, tier, outputPct = 100) {
18027
19915
  label: 'Cargo Capacity',
18028
19916
  value: applySlotMultiplierUint32(caps.capacity, outputPct),
18029
19917
  },
19918
+ { label: 'Drain', value: toWholeEnergy$1(caps.drain) },
18030
19919
  ],
18031
19920
  };
18032
19921
  }
@@ -18037,7 +19926,7 @@ function computeCapabilityGroup(moduleType, stats, tier, outputPct = 100) {
18037
19926
  attributes: [
18038
19927
  {
18039
19928
  label: 'Energy Capacity',
18040
- value: applySlotMultiplierUint32(caps.capacity, outputPct),
19929
+ value: toWholeEnergy$1(applySlotMultiplierUint32(caps.capacity, outputPct)),
18041
19930
  },
18042
19931
  ],
18043
19932
  };
@@ -18079,10 +19968,19 @@ function resolveModule(id, stats) {
18079
19968
  attributes,
18080
19969
  };
18081
19970
  }
18082
- function hullCapsForEntity(itemId, decoded) {
19971
+ function hullCapsForEntity(itemId, decoded, packedStats) {
19972
+ const hullStats = getPackedEntityType(itemId)?.equals(ENTITY_SHIP)
19973
+ ? {
19974
+ strength: decodeStat(packedStats, 0),
19975
+ hardness: decodeStat(packedStats, 1),
19976
+ plasticity: decodeStat(packedStats, 2),
19977
+ volatility: decodeStat(packedStats, 3),
19978
+ conductivity: decodeStat(packedStats, 4),
19979
+ }
19980
+ : decoded;
18083
19981
  return {
18084
- hullmass: computeBaseHullmass(decoded),
18085
- capacity: computeBaseCapacity(itemId, decoded),
19982
+ hullmass: computeBaseHullmass(itemId, hullStats),
19983
+ capacity: computeBaseCapacity(itemId, hullStats),
18086
19984
  };
18087
19985
  }
18088
19986
  function resolveEntity(id, stats, modules) {
@@ -18099,7 +19997,7 @@ function resolveEntity(id, stats, modules) {
18099
19997
  decoded.density = decodeStat(bigStats, 1);
18100
19998
  if (decoded.hardness === undefined)
18101
19999
  decoded.hardness = decodeStat(bigStats, 2);
18102
- const hullCaps = hullCapsForEntity(id, decoded);
20000
+ const hullCaps = hullCapsForEntity(id, decoded, bigStats);
18103
20001
  attributes = [
18104
20002
  {
18105
20003
  capability: 'Hull',
@@ -18335,6 +20233,9 @@ function moduleSlotsForImmutable(modules) {
18335
20233
  }));
18336
20234
  }
18337
20235
  const IMAGE_HOST_URL = 'https://item.shiploadgame.com/item';
20236
+ function toWholeEnergy(milli) {
20237
+ return Math.floor((milli + 500) / 1000);
20238
+ }
18338
20239
  function bytesToBase64Url(bytes) {
18339
20240
  let binary = '';
18340
20241
  for (let i = 0; i < bytes.byteLength; i++)
@@ -18400,8 +20301,14 @@ function buildModuleImmutable(itemId, quantity, stats, originX, originY) {
18400
20301
  const thm = decodeStat(stats, 1);
18401
20302
  base.push({ first: 'volatility', second: ['uint16', vol] });
18402
20303
  base.push({ first: 'thermal', second: ['uint16', thm] });
18403
- base.push({ first: 'thrust', second: ['uint32', computeEngineThrust(vol)] });
18404
- base.push({ first: 'drain', second: ['uint16', computeEngineDrain(thm)] });
20304
+ base.push({
20305
+ first: 'thrust',
20306
+ second: ['uint32', computeEngineThrust(computeEffectiveModuleStat(vol))],
20307
+ });
20308
+ base.push({
20309
+ first: 'drain',
20310
+ second: ['uint16', computeEngineDrain(computeEffectiveModuleStat(thm))],
20311
+ });
18405
20312
  break;
18406
20313
  }
18407
20314
  case MODULE_GENERATOR: {
@@ -18409,8 +20316,20 @@ function buildModuleImmutable(itemId, quantity, stats, originX, originY) {
18409
20316
  const ref = decodeStat(stats, 1);
18410
20317
  base.push({ first: 'resonance', second: ['uint16', res] });
18411
20318
  base.push({ first: 'reflectivity', second: ['uint16', ref] });
18412
- base.push({ first: 'capacity', second: ['uint16', computeGeneratorCap(res)] });
18413
- base.push({ first: 'recharge', second: ['uint16', computeGeneratorRech(ref)] });
20319
+ base.push({
20320
+ first: 'capacity',
20321
+ second: [
20322
+ 'uint16',
20323
+ toWholeEnergy(computeGeneratorCap(computeEffectiveModuleStat(res))),
20324
+ ],
20325
+ });
20326
+ base.push({
20327
+ first: 'recharge',
20328
+ second: [
20329
+ 'uint16',
20330
+ toWholeEnergy(computeGeneratorRech(computeEffectiveModuleStat(ref))),
20331
+ ],
20332
+ });
18414
20333
  break;
18415
20334
  }
18416
20335
  case MODULE_GATHERER: {
@@ -18421,7 +20340,10 @@ function buildModuleImmutable(itemId, quantity, stats, originX, originY) {
18421
20340
  base.push({ first: 'hardness', second: ['uint16', hrd] });
18422
20341
  base.push({ first: 'saturation', second: ['uint16', sat] });
18423
20342
  base.push({ first: 'yield', second: ['uint16', computeGathererYield(str)] });
18424
- base.push({ first: 'drain', second: ['uint16', computeGathererDrain(sat)] });
20343
+ base.push({
20344
+ first: 'drain',
20345
+ second: ['uint16', toWholeEnergy(computeGathererDrain(sat))],
20346
+ });
18425
20347
  base.push({ first: 'depth', second: ['uint16', computeGathererDepth(hrd, item.tier)] });
18426
20348
  break;
18427
20349
  }
@@ -18446,7 +20368,16 @@ function buildModuleImmutable(itemId, quantity, stats, originX, originY) {
18446
20368
  base.push({ first: 'fineness', second: ['uint16', fin] });
18447
20369
  base.push({ first: 'conductivity', second: ['uint16', con] });
18448
20370
  base.push({ first: 'speed', second: ['uint16', computeCrafterSpeed(fin)] });
18449
- base.push({ first: 'drain', second: ['uint16', computeCrafterDrain(con)] });
20371
+ base.push({ first: 'drain', second: ['uint16', toWholeEnergy(computeCrafterDrain(con))] });
20372
+ break;
20373
+ }
20374
+ case MODULE_BUILDER: {
20375
+ const coh = decodeStat(stats, 0);
20376
+ const tol = decodeStat(stats, 1);
20377
+ base.push({ first: 'cohesion', second: ['uint16', coh] });
20378
+ base.push({ first: 'tolerance', second: ['uint16', tol] });
20379
+ base.push({ first: 'speed', second: ['uint16', computeBuilderSpeed(coh)] });
20380
+ base.push({ first: 'drain', second: ['uint16', toWholeEnergy(computeBuilderDrain(tol))] });
18450
20381
  break;
18451
20382
  }
18452
20383
  case MODULE_STORAGE: {
@@ -18460,7 +20391,11 @@ function buildModuleImmutable(itemId, quantity, stats, originX, originY) {
18460
20391
  base.push({ first: 'cohesion', second: ['uint16', com] });
18461
20392
  base.push({
18462
20393
  first: 'capacity',
18463
- second: ['uint32', computeCargoBayCapacity(str, den, hrd, com)],
20394
+ second: ['uint32', computeCargoBayCapacity(str, den, hrd)],
20395
+ });
20396
+ base.push({
20397
+ first: 'drain',
20398
+ second: ['uint16', toWholeEnergy(computeCargoBayDrain(com, item.tier))],
18464
20399
  });
18465
20400
  break;
18466
20401
  }
@@ -18475,7 +20410,7 @@ function buildModuleImmutable(itemId, quantity, stats, originX, originY) {
18475
20410
  base.push({ first: 'insulation', second: ['uint16', ins] });
18476
20411
  base.push({
18477
20412
  first: 'capacity',
18478
- second: ['uint32', computeBatteryBankCapacity(vol, thm, pla, ins)],
20413
+ second: ['uint32', toWholeEnergy(computeBatteryBankCapacity(vol, thm, pla, ins))],
18479
20414
  });
18480
20415
  break;
18481
20416
  }
@@ -18488,7 +20423,10 @@ function buildModuleImmutable(itemId, quantity, stats, originX, originY) {
18488
20423
  base.push({ first: 'conductivity', second: ['uint16', con] });
18489
20424
  base.push({ first: 'capacity', second: ['uint8', computeHaulerCapacity(res, item.tier)] });
18490
20425
  base.push({ first: 'efficiency', second: ['uint16', computeHaulerEfficiency(pla)] });
18491
- base.push({ first: 'drain', second: ['uint16', computeHaulerDrain$1(con)] });
20426
+ base.push({
20427
+ first: 'drain',
20428
+ second: ['uint16', toWholeEnergy(computeHaulerDrain(con, item.tier))],
20429
+ });
18492
20430
  break;
18493
20431
  }
18494
20432
  }
@@ -18541,6 +20479,7 @@ var index = /*#__PURE__*/Object.freeze({
18541
20479
  deserializeModule: deserializeModule,
18542
20480
  deserializeEntity: deserializeEntity,
18543
20481
  deserializeAsset: deserializeAsset,
20482
+ toWholeEnergy: toWholeEnergy$1,
18544
20483
  computeBaseHullmass: computeBaseHullmass$1,
18545
20484
  computeBaseCapacityShip: computeBaseCapacityShip,
18546
20485
  computeBaseCapacityContainer: computeBaseCapacityContainer,
@@ -18560,9 +20499,13 @@ var index = /*#__PURE__*/Object.freeze({
18560
20499
  computeLoaderThrust: computeLoaderThrust,
18561
20500
  computeCrafterSpeed: computeCrafterSpeed,
18562
20501
  computeCrafterDrain: computeCrafterDrain,
20502
+ computeBuilderSpeed: computeBuilderSpeed,
20503
+ computeBuilderDrain: computeBuilderDrain,
18563
20504
  computeHaulerCapacity: computeHaulerCapacity,
18564
20505
  computeHaulerEfficiency: computeHaulerEfficiency,
18565
- computeHaulerDrain: computeHaulerDrain$1,
20506
+ supportDrainTierPercent: supportDrainTierPercent,
20507
+ computeHaulerDrain: computeHaulerDrain,
20508
+ computeCargoBayDrain: computeCargoBayDrain,
18566
20509
  computeWarpRange: computeWarpRange,
18567
20510
  computeCargoBayCapacity: computeCargoBayCapacity,
18568
20511
  computeBatteryBankCapacity: computeBatteryBankCapacity,
@@ -18808,5 +20751,5 @@ function planParallelTransfer(entity, target) {
18808
20751
  return allocateProportional(laneWeights, requestedQty).filter((e) => e.quantity > 0);
18809
20752
  }
18810
20753
 
18811
- export { ALL_ENTITY_TYPES, ATOMICASSETS_ACCOUNT, ActionsManager, BASE_ORBITAL_MASS, BLEND_INPUTS_MUST_MATCH, BLEND_REQUIRES_MULTIPLE, BLEND_STAT_LESS_NOT_SUPPORTED, CANCEL_CONTAINS_GROUPED_TASK, CAPACITY_TIER_TABLE, CAP_DEMOLISH, CAP_MODULES, CAP_UNDEPLOY, CAP_WRAP, CATEGORY_LABELS, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, COMPONENT_TIER_PREFIXES, CONTAINER_NOT_FOUND, CONTAINER_Z, COORD_MAX, COORD_MIN, COORD_OFFSET, CRAFT_ENERGY_DIVISOR, CRAFT_EXCEEDS_ENERGY_CAPACITY, CRAFT_NOT_ENOUGH_ENERGY, CancelBlockReason, ClusterManager, ConstructionManager, Coordinates, DEPLOY_ENTITY_HAS_SCHEDULE, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, DESTINATION_CAPACITY_EXCEEDED, ENGINE_DRAIN_BASE, ENGINE_DRAIN_REF_THM, ENGINE_DRAIN_REF_THRUST, ENTITY_ALREADY_THERE, ENTITY_CAPACITY_EXCEEDED, ENTITY_CARGO_NOT_LOADED, ENTITY_CARGO_NOT_OWNED, ENTITY_CONTAINER, ENTITY_EXTRACTOR, ENTITY_FACTORY, ENTITY_HUB, ENTITY_INVALID_CARGO, ENTITY_INVALID_DESTINATION, ENTITY_INVALID_TRAVEL_DURATION, ENTITY_NEXUS, ENTITY_NOT_ENOUGH_ENERGY, ENTITY_NOT_ENOUGH_ENERGY_CAPACITY, ENTITY_NO_CRAFTER, ENTITY_SHIP, ENTITY_WAREHOUSE, EPOCH_NON_ZERO, EPOCH_NOT_READY, ERROR_SYSTEM_ALREADY_INITIALIZED, ERROR_SYSTEM_DISABLED, ERROR_SYSTEM_NOT_INITIALIZED, EntitiesManager, Entity, EntityClass, EntityInventory, EpochsManager, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GATHERER_DEPTH_MAX_TIER, GATHERER_DEPTH_TABLE, GATHER_EXCEEDS_ENERGY_CAPACITY, GATHER_MASS_DIVISOR, GATHER_NOT_ENOUGH_ENERGY, GROUP_DUPLICATE_ENTITY, GROUP_EMPTY, GROUP_ENTITY_NOT_MOVABLE, GROUP_HAUL_CAPACITY_EXCEEDED, GROUP_NOT_FOUND, GROUP_NOT_SAME_LOCATION, GROUP_NOT_SAME_OWNER, GROUP_NO_THRUST, GameState, HoldKind, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_BATTERY_T1, ITEM_BEAM, ITEM_BEAM_T2, ITEM_BIOMASS_T1, ITEM_BIOMASS_T10, ITEM_BIOMASS_T2, ITEM_BIOMASS_T3, ITEM_BIOMASS_T4, ITEM_BIOMASS_T5, ITEM_BIOMASS_T6, ITEM_BIOMASS_T7, ITEM_BIOMASS_T8, ITEM_BIOMASS_T9, ITEM_CERAMIC, ITEM_CERAMIC_T2, ITEM_CONTAINER_T1_PACKED, ITEM_CONTAINER_T2_PACKED, ITEM_CRAFTER_T1, ITEM_CRYSTAL_T1, ITEM_CRYSTAL_T10, ITEM_CRYSTAL_T2, ITEM_CRYSTAL_T3, ITEM_CRYSTAL_T4, ITEM_CRYSTAL_T5, ITEM_CRYSTAL_T6, ITEM_CRYSTAL_T7, ITEM_CRYSTAL_T8, ITEM_CRYSTAL_T9, ITEM_DOES_NOT_EXIST, ITEM_ENGINE_T1, ITEM_EXTRACTOR_T1_PACKED, ITEM_FACTORY_T1_PACKED, ITEM_FRAME, ITEM_FRAME_T2, ITEM_GAS_T1, ITEM_GAS_T10, ITEM_GAS_T2, ITEM_GAS_T3, ITEM_GAS_T4, ITEM_GAS_T5, ITEM_GAS_T6, ITEM_GAS_T7, ITEM_GAS_T8, ITEM_GAS_T9, ITEM_GATHERER_T1, ITEM_GATHERER_T2, ITEM_GENERATOR_T1, ITEM_HAULER_SHIP_T2_PACKED, ITEM_HAULER_T1, ITEM_HAULER_T2, ITEM_HUB_T1_PACKED, ITEM_LAUNCHER_T1, ITEM_LOADER_T1, ITEM_MASS_CATCHER_T1_PACKED, ITEM_MASS_DRIVER_T1_PACKED, ITEM_NOT_AVAILABLE_AT_LOCATION, ITEM_NOT_DEPLOYABLE, ITEM_NOT_PACKED_ENTITY, ITEM_ORE_T1, ITEM_ORE_T10, ITEM_ORE_T2, ITEM_ORE_T3, ITEM_ORE_T4, ITEM_ORE_T5, ITEM_ORE_T6, ITEM_ORE_T7, ITEM_ORE_T8, ITEM_ORE_T9, ITEM_PLASMA_CELL, ITEM_PLASMA_CELL_T2, ITEM_PLATE, ITEM_PLATE_T2, ITEM_POLYMER, ITEM_POLYMER_T2, ITEM_PROSPECTOR_T2_PACKED, ITEM_REACTOR, ITEM_REACTOR_T2, ITEM_REGOLITH_T1, ITEM_REGOLITH_T10, ITEM_REGOLITH_T2, ITEM_REGOLITH_T3, ITEM_REGOLITH_T4, ITEM_REGOLITH_T5, ITEM_REGOLITH_T6, ITEM_REGOLITH_T7, ITEM_REGOLITH_T8, ITEM_REGOLITH_T9, ITEM_RESIN, ITEM_RESIN_T2, ITEM_RESONATOR, ITEM_RESONATOR_T2, ITEM_SENSOR, ITEM_SENSOR_T2, ITEM_SHIP_T1_PACKED, ITEM_STORAGE_T1, ITEM_TYPE_COMPONENT, ITEM_TYPE_ENTITY, ITEM_TYPE_MODULE, ITEM_TYPE_RESOURCE, ITEM_WAREHOUSE_T1_PACKED, ITEM_WARP_T1, InventoryAccessor, LANE_BARRIER, LANE_MOBILITY, LOCAL_HALF, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_LEGS, MAX_ORBITAL_ALTITUDE, MAX_STARS_PER_STAT, MAX_STAR_RATING, MIN_ORBITAL_ALTITUDE, MIN_TRANSFER_DISTANCE_ORBITAL_VESSEL, MIN_TRANSFER_DISTANCE_PLANETARY_STRUCTURE, MODULE_ANY, MODULE_BATTERY, MODULE_CARGO_NOT_FOUND, MODULE_CRAFTER, MODULE_ENGINE, MODULE_ENTITY_BUSY, MODULE_GATHERER, MODULE_GENERATOR, MODULE_HAULER, MODULE_LAUNCHER, MODULE_LOADER, MODULE_NOT_MODULE, MODULE_SLOT_EMPTY, MODULE_SLOT_INVALID, MODULE_SLOT_OCCUPIED, MODULE_STORAGE, MODULE_TIER_PREFIXES, MODULE_TYPE_MISMATCH, MODULE_WARP, index as NFT, NO_SCHEDULE, NftManager, PLANETARY_STRUCTURE_Z, PLANET_SUBTYPE_GAS_GIANT, PLANET_SUBTYPE_ICY, PLANET_SUBTYPE_INDUSTRIAL, PLANET_SUBTYPE_OCEAN, PLANET_SUBTYPE_ROCKY, PLANET_SUBTYPE_TERRESTRIAL, PLAYER_ALREADY_JOINED, PLAYER_NOT_FOUND, PLAYER_NOT_JOINED, PRECISION$1 as PRECISION, platform as PlatformContract, Types$1 as PlatformTypes, Player, PlayersManager, RECIPE_INPUTS_EXCESS, RECIPE_INPUTS_INSUFFICIENT, RECIPE_INPUTS_INVALID, RECIPE_INPUTS_MIXED, RECIPE_NOT_FOUND, REGION_DIV, REGION_PER_AXIS, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, RESERVE_TIERS, RESOLVE_COUNT_EXCEEDS_COMPLETED, RESOURCE_TIER_ADJECTIVES, RESOURCE_TIER_MULT_TENTHS, SECTORS_PER_AXIS, SECTOR_DIV, SHIPLOAD_COLLECTION, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_NOT_ARRIVED, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, SLOT_FORMULAS, STAR_STEP, ScheduleAccessor, server as ServerContract, Types as ServerTypes, Shipload, SubscriptionsManager, TIER_ROLL_MAX, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_NOT_FOUND, WARP_HAS_CARGO, WARP_HAS_SCHEDULE, WARP_NOT_FULL_ENERGY, WARP_NO_CAPABILITY, WARP_OUT_OF_RANGE, WH, WOULD_OVERFILL, WOULD_STRAND, WebSocketConnection, YIELD_FRACTION_DEEP, YIELD_FRACTION_SHALLOW, addressFromCoordinates, allBuildableItems, allPlotBuildableItems, allocateProportional, applyCapacityTier, applyResourceTierMultiplier, availableBuildMethods, availableCapacity, availableCapacityFromMass, availableForItem, baseName, blendCargoStacks, blendComponentStacks, blendCrossGroup, blendStacks, buildComponentImmutable, buildEntityDescription, buildEntityImmutable, buildGatherPlan, buildImmutableData, buildMintAssetAction, buildModuleImmutable, buildResourceImmutable, calcCargoItemMass, calcCargoMass, calcEnergyUsage, calcStacksMass, calc_acceleration, calc_craft_duration, calc_craft_energy, calc_energyusage, calc_flighttime, calc_gather_duration, calc_gather_energy, calc_gather_rate, calc_loader_acceleration, calc_loader_flighttime, calc_onesided_duration, calc_orbital_altitude, calc_rechargetime, calc_ship_acceleration, calc_ship_flighttime, calc_ship_mass, calc_ship_rechargetime, calc_transfer_duration, calc_transit_duration, calculateFlightTime, calculateLoadTimeBreakdown, calculateRefuelingTime, calculateTransferTime, canMove, cancelEligibility, candidateLaneCompletesAt, capabilityAttributes, capabilityNames, capacityTierMultiplier, capsHasCrafter, capsHasGatherer, capsHasHauler, capsHasLauncher, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoItem, cargoItemToStack, cargoReadyAt, cargoRef, cargoUtils, categoryColors, categoryFromIndex, categoryLabel, categoryLabelFromIndex, compareByStars, componentIcon, composeIdleResolve, computeBaseCapacity, computeBaseCapacityShip, computeBaseCapacityWarehouse, computeBaseHullmass$1 as computeBaseHullmass, computeBatteryCapabilities, computeComponentStats, computeContainerCapabilities, computeCraftedOutputStats, computeCrafterCapabilities, computeCrafterDrain, computeCrafterSpeed, computeEngineCapabilities, computeEngineDrain, computeEngineThrust, computeEntityCapabilities, computeEntityStats, computeFreeCells, computeGathererCapabilities, computeGathererDepth, computeGathererDrain, computeGathererYield, computeGeneratorCap, computeGeneratorCapabilities, computeGeneratorRech, computeGroupPerLegReach, computeHaulPenalty, computeHaulerCapabilities, computeHaulerCapacity, computeHaulerDrain, computeHaulerEfficiency, computeInputMass, computeLauncherCapabilities, computeLoaderCapabilities, computeLoaderMass, computeLoaderThrust, computeNftImageUrl, computePerLegReach, computeShipHullCapabilities, computeStorageCapabilities, computeTravelDrain, computeWarehouseHullCapabilities, computeWarpCapabilities, computeWarpRange, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeAddress, decodeAtomicAsset, decodeCraftedItemStats, decodeRegion, decodeSector, decodeStat, decodeStats, Shipload as default, deriveLocation, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStatMappings, deriveStrata, deriveStratum, derivedLoaders, describeItem, describeModule, describeModuleForItem, describeModuleForSlot, deserializeAsset, deserializeAtomicData, deserializeComponent, deserializeEntity, deserializeModule, deserializeResource, displayName, distanceBetweenCoordinates, distanceBetweenPoints, easeFlightProgress, eligibleUpgrades, encodeAddress, encodeAddressMemo, encodeGatheredCargoStats, encodeRegion, encodeSector, encodeStats, energyAtTime, energyPercent, entityDisplayName, estimateDealTravelTime, estimateTravelTime, estimateUnwrapDuration, feistel, feistelInv, fetchAtomicAssetsForOwner, fetchAtomicSchemas, filterByBuildMethod, findNearbyPlanets, flightSpeedFactor, formatLocation, formatMass, formatMassDelta, formatMassScaled, formatModuleLine, formatTier, gatherEnergyCost, gathererDepthForTier, getAllRecipes, getCapabilityAttributeRows, getCapabilityAttributes, getCategoryInfo, getComponentDemand, getComponents, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEffectiveReserve, getEligibleResources, getEntityClass, getEntityItems, getEntityLayout, getEpochInfo, getFlightOrigin, getInterpolatedPosition, getItem, getItems, getKindMeta, getLocationCandidates, getLocationKind, getLocationProfile, getLocationType, getLocationTypeName, getModuleCapabilityType, getModules, getPackedEntityType, getPlanetSubtype, getPlanetSubtypes, getPositionAt, getProducersForAttribute, getRecipe, getRecipeConsumers, getResourceDemand, getResourceTier, getResourceWeight, getResources, getStatDefinitions, getStatMappings, getStatMappingsForCapability, getStatMappingsForStat, getStatName, getSystemName, getTemplateMeta, hasEnergy, hasEnergyForDistance, hasGatherer, hasLoaders, hasMass, hasSchedule, hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, incomingHoldMass, interpolateFlightPosition, isBuildable, isContainer, isCraftedItem, isExtractor, isFactory, isFull, isFullFromMass, isGatherableLocation, isHub, isInvertedAttribute, isLocationBuildable, isModuleItem, isNexus, isPlot, isPlotBuildable, isRelatedItem, isShip, isSubscriptionsDebugEnabled, isValidWormholePair, isWarehouse, itemAbbreviations, itemCategory, itemIds, itemOffset, itemTier, itemTypeCode, kindCan, laneKeyForModule, lerp$1 as lerp, makeEntity, mapEntity, maxCraftable, maxQtyForCharge, maxTravelDistance, mergeStacks, moduleAccepts, moduleDisplayName, moduleIcon, moduleSlotTypeToCode, nearbyWormholes, needsRecharge, normalizeDisplayName, parseWireEntity, partnerRegion, planParallelTransfer, planRoute, projectEntity, projectEntityAt, projectRemainingAt, projectedCargoAvailableAt, projectedPeakCargomass, rawScheduleEnd, readCommonBase, receiveFits, regionOf, removeFromStacks, renderDescription, resolveItem, resolveItemCategory, resolveLaneCrafter, resolveLaneGatherer, resolveLaneLoader, resolveLockedAmount, resolveStats, rollTier, rollWithinTier, rollupCrafter, rollupGatherer, rollupLoaders, rotation, schedule, sdkSystemGraph, selectGatherLane, setScanProvider, setSubscriptionsDebug, slotAcceptsModule, sourceLabelForOutput, splitCost, stackKey, stackToCargoItem, stacksEqual, starRating, starsForStat, statMagnitude, subtractFromStacks, taskCargoChanges, taskCargoEffect, tierAdjective, tierColors, tierOfReserve, toLocation, typeLabel, unwrapLoadDuration, unwrapTransitDuration, validateDisplayName, validateSchedule, workerLaneKey, wormholeAt, wormholeAtRegionEndpoint, yieldThresholdAt };
20754
+ export { ALL_ENTITY_TYPES, ATOMICASSETS_ACCOUNT, ActionsManager, BASE_HAUL_PENALTY_MILLI$1 as BASE_HAUL_PENALTY_MILLI, BASE_ORBITAL_MASS, BLEND_INPUTS_MUST_MATCH, BLEND_REQUIRES_MULTIPLE, BLEND_STAT_LESS_NOT_SUPPORTED, CANCEL_CONTAINS_GROUPED_TASK, CAPACITY_TIER_TABLE, CAP_DEMOLISH, CAP_MODULES, CAP_UNDEPLOY, CAP_WRAP, CATEGORY_LABELS, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, COMPONENT_TIER_PREFIXES, CONTAINER_NOT_FOUND, CONTAINER_Z, COORD_MAX, COORD_MIN, COORD_OFFSET, CRAFT_ENERGY_DIVISOR, CRAFT_EXCEEDS_ENERGY_CAPACITY, CRAFT_NOT_ENOUGH_ENERGY, CancelBlockReason, ClusterManager, ConstructionManager, Coordinates, DEFAULT_BASE_HULLMASS, DEPLOY_ENTITY_HAS_SCHEDULE, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, DESTINATION_CAPACITY_EXCEEDED, ENGINE_DRAIN_BASE, ENGINE_DRAIN_REF_THM, ENGINE_DRAIN_REF_THRUST, ENTITY_ALREADY_THERE, ENTITY_CAPACITY_EXCEEDED, ENTITY_CARGO_NOT_LOADED, ENTITY_CARGO_NOT_OWNED, ENTITY_CONTAINER, ENTITY_EXTRACTOR, ENTITY_FACTORY, ENTITY_HUB, ENTITY_INVALID_CARGO, ENTITY_INVALID_DESTINATION, ENTITY_INVALID_TRAVEL_DURATION, ENTITY_NEXUS, ENTITY_NOT_ENOUGH_ENERGY, ENTITY_NOT_ENOUGH_ENERGY_CAPACITY, ENTITY_NO_CRAFTER, ENTITY_SHIP, ENTITY_WAREHOUSE, ENTITY_WORKSHOP, EPOCH_NON_ZERO, EPOCH_NOT_READY, ERROR_SYSTEM_ALREADY_INITIALIZED, ERROR_SYSTEM_DISABLED, ERROR_SYSTEM_NOT_INITIALIZED, EntitiesManager, Entity, EntityClass, EntityInventory, EpochsManager, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GATHERER_DEPTH_MAX_TIER, GATHERER_DEPTH_TABLE, GATHER_EXCEEDS_ENERGY_CAPACITY, GATHER_MASS_DIVISOR, GATHER_NOT_ENOUGH_ENERGY, GROUP_DUPLICATE_ENTITY, GROUP_EMPTY, GROUP_ENTITY_NOT_MOVABLE, GROUP_HAUL_CAPACITY_EXCEEDED, GROUP_NOT_FOUND, GROUP_NOT_SAME_LOCATION, GROUP_NOT_SAME_OWNER, GROUP_NO_THRUST, GameState, HAULER_EFFICIENCY_DENOM$1 as HAULER_EFFICIENCY_DENOM, HoldKind, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_BATTERY_T1, ITEM_BEAM, ITEM_BEAM_T2, ITEM_BIOMASS_T1, ITEM_BIOMASS_T10, ITEM_BIOMASS_T2, ITEM_BIOMASS_T3, ITEM_BIOMASS_T4, ITEM_BIOMASS_T5, ITEM_BIOMASS_T6, ITEM_BIOMASS_T7, ITEM_BIOMASS_T8, ITEM_BIOMASS_T9, ITEM_BUILDER_T1, ITEM_CERAMIC, ITEM_CERAMIC_T2, ITEM_CONTAINER_T1_PACKED, ITEM_CONTAINER_T2_PACKED, ITEM_CRAFTER_T1, ITEM_CRYSTAL_T1, ITEM_CRYSTAL_T10, ITEM_CRYSTAL_T2, ITEM_CRYSTAL_T3, ITEM_CRYSTAL_T4, ITEM_CRYSTAL_T5, ITEM_CRYSTAL_T6, ITEM_CRYSTAL_T7, ITEM_CRYSTAL_T8, ITEM_CRYSTAL_T9, ITEM_DOES_NOT_EXIST, ITEM_DREDGER_T1_PACKED, ITEM_ENGINE_T1, ITEM_EXTRACTOR_T1_PACKED, ITEM_FACTORY_T1_PACKED, ITEM_FRAME, ITEM_FRAME_T2, ITEM_GAS_T1, ITEM_GAS_T10, ITEM_GAS_T2, ITEM_GAS_T3, ITEM_GAS_T4, ITEM_GAS_T5, ITEM_GAS_T6, ITEM_GAS_T7, ITEM_GAS_T8, ITEM_GAS_T9, ITEM_GATHERER_T1, ITEM_GATHERER_T2, ITEM_GENERATOR_T1, ITEM_HAULER_SHIP_T2_PACKED, ITEM_HAULER_T1, ITEM_HAULER_T2, ITEM_HUB_T1_PACKED, ITEM_LAUNCHER_T1, ITEM_LOADER_T1, ITEM_MASS_CATCHER_T1_PACKED, ITEM_MASS_DRIVER_T1_PACKED, ITEM_NOT_AVAILABLE_AT_LOCATION, ITEM_NOT_DEPLOYABLE, ITEM_NOT_PACKED_ENTITY, ITEM_ORE_T1, ITEM_ORE_T10, ITEM_ORE_T2, ITEM_ORE_T3, ITEM_ORE_T4, ITEM_ORE_T5, ITEM_ORE_T6, ITEM_ORE_T7, ITEM_ORE_T8, ITEM_ORE_T9, ITEM_PLASMA_CELL, ITEM_PLASMA_CELL_T2, ITEM_PLATE, ITEM_PLATE_T2, ITEM_POLYMER, ITEM_POLYMER_T2, ITEM_PORTER_T1_PACKED, ITEM_PROSPECTOR_T1_PACKED, ITEM_PROSPECTOR_T2_PACKED, ITEM_REACTOR, ITEM_REACTOR_T2, ITEM_REGOLITH_T1, ITEM_REGOLITH_T10, ITEM_REGOLITH_T2, ITEM_REGOLITH_T3, ITEM_REGOLITH_T4, ITEM_REGOLITH_T5, ITEM_REGOLITH_T6, ITEM_REGOLITH_T7, ITEM_REGOLITH_T8, ITEM_REGOLITH_T9, ITEM_RESIN, ITEM_RESIN_T2, ITEM_RESONATOR, ITEM_RESONATOR_T2, ITEM_ROUSTABOUT_T1_PACKED, ITEM_SENSOR, ITEM_SENSOR_T2, ITEM_SHIP_T1_PACKED, ITEM_STORAGE_T1, ITEM_TENDER_T1_PACKED, ITEM_TUG_T1_PACKED, ITEM_TYPE_COMPONENT, ITEM_TYPE_ENTITY, ITEM_TYPE_MODULE, ITEM_TYPE_RESOURCE, ITEM_WAREHOUSE_T1_PACKED, ITEM_WARP_T1, ITEM_WORKSHOP_T1_PACKED, ITEM_WRANGLER_T1_PACKED, ITEM_WRIGHT_T1_PACKED, InventoryAccessor, JOB_QUEUE_CAP, LANE_BARRIER, LANE_MOBILITY, LOCAL_HALF, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_LEGS, MAX_ORBITAL_ALTITUDE, MAX_STARS_PER_STAT, MAX_STAR_RATING, MIN_ORBITAL_ALTITUDE, MIN_TRANSFER_DISTANCE_ORBITAL_VESSEL, MIN_TRANSFER_DISTANCE_PLANETARY_STRUCTURE, MODULE_ANY, MODULE_BATTERY, MODULE_BUILDER, MODULE_CARGO_NOT_FOUND, MODULE_CRAFTER, MODULE_ENGINE, MODULE_ENTITY_BUSY, MODULE_GATHERER, MODULE_GENERATOR, MODULE_HAULER, MODULE_LAUNCHER, MODULE_LOADER, MODULE_NOT_MODULE, MODULE_SLOT_EMPTY, MODULE_SLOT_INVALID, MODULE_SLOT_OCCUPIED, MODULE_STAT_SCALING_ANCHOR, MODULE_STAT_SCALING_POST_ANCHOR_PERCENT, MODULE_STORAGE, MODULE_TIER_PREFIXES, MODULE_TYPE_MISMATCH, MODULE_WARP, index as NFT, NO_SCHEDULE, NftManager, PLANETARY_STRUCTURE_Z, PLANET_SUBTYPE_GAS_GIANT, PLANET_SUBTYPE_ICY, PLANET_SUBTYPE_INDUSTRIAL, PLANET_SUBTYPE_OCEAN, PLANET_SUBTYPE_ROCKY, PLANET_SUBTYPE_TERRESTRIAL, PLAYER_ALREADY_JOINED, PLAYER_NOT_FOUND, PLAYER_NOT_JOINED, PRECISION, platform as PlatformContract, Types$1 as PlatformTypes, Player, PlayersManager, RECIPE_INPUTS_EXCESS, RECIPE_INPUTS_INSUFFICIENT, RECIPE_INPUTS_INVALID, RECIPE_INPUTS_MIXED, RECIPE_NOT_FOUND, REGION_DIV, REGION_PER_AXIS, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, RESERVE_TIERS, RESOLVE_COUNT_EXCEEDS_COMPLETED, RESOURCE_TIER_ADJECTIVES, RESOURCE_TIER_MULT_TENTHS, SECTORS_PER_AXIS, SECTOR_DIV, SHIPLOAD_COLLECTION, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_NOT_ARRIVED, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, SLOT_FORMULAS, STAR_STEP, ScheduleAccessor, server as ServerContract, Types as ServerTypes, Shipload, SubscriptionsManager, TIER_ROLL_MAX, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_NOT_FOUND, WARP_HAS_CARGO, WARP_HAS_SCHEDULE, WARP_NOT_FULL_ENERGY, WARP_NO_CAPABILITY, WARP_OUT_OF_RANGE, WH, WOULD_OVERFILL, WOULD_STRAND, WebSocketConnection, YIELD_FRACTION_DEEP, YIELD_FRACTION_SHALLOW, addressFromCoordinates, allBuildableItems, allPlotBuildableItems, allocateProportional, applyCapacityTier, applyResourceTierMultiplier, availableBuildMethods, availableCapacity, availableCapacityFromMass, availableForItem, baseName, blendCargoStacks, blendComponentStacks, blendCrossGroup, blendStacks, buildComponentImmutable, buildEntityDescription, buildEntityImmutable, buildGatherPlan, buildImmutableData, buildMintAssetAction, buildModuleImmutable, buildResourceImmutable, calcCargoItemMass, calcCargoMass, calcEnergyUsage, calcStacksMass, calc_acceleration, calc_build_duration, calc_build_energy, calc_craft_duration, calc_craft_energy, calc_energyusage, calc_flighttime, calc_gather_duration, calc_gather_energy, calc_gather_rate, calc_group_flighttime, calc_loader_acceleration, calc_loader_flighttime, calc_onesided_duration, calc_orbital_altitude, calc_rechargetime, calc_ship_acceleration, calc_ship_flighttime, calc_ship_mass, calc_ship_rechargetime, calc_transfer_duration, calc_transit_duration, calc_travel_flighttime, calculateFlightTime, calculateLoadTimeBreakdown, calculateRefuelingTime, calculateTransferTime, canMove, cancelEligibility, candidateLaneCompletesAt, capabilityAttributes, capabilityNames, capacityTierMultiplier, capsHasCrafter, capsHasGatherer, capsHasHauler, capsHasLauncher, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoItem, cargoItemToStack, cargoReadyAt, cargoRef, cargoUtils, categoryColors, categoryFromIndex, categoryLabel, categoryLabelFromIndex, compareByStars, componentIcon, composeIdleResolve, computeBaseCapacity, computeBaseCapacityContainer, computeBaseCapacityShip, computeBaseCapacityWarehouse, computeBaseHullmass$1 as computeBaseHullmass, computeBatteryCapabilities, computeBuilderCapabilities, computeBuilderDrain, computeBuilderSpeed, computeComponentStats, computeContainerCapabilities, computeCraftedOutputStats, computeCrafterCapabilities, computeCrafterDrain, computeCrafterSpeed, computeEffectiveModuleStat, computeEngineCapabilities, computeEngineDrain, computeEngineThrust, computeEntityCapabilities, computeEntityStats, computeFreeCells, computeGathererCapabilities, computeGathererDepth, computeGathererDrain, computeGathererYield, computeGeneratorCap, computeGeneratorCapabilities, computeGeneratorRech, computeGroupPerLegReach, computeHaulPenalty, computeHaulerCapabilities, computeHaulerCapacity, computeHaulerEfficiency, computeInputMass, computeLauncherCapabilities, computeLoaderCapabilities, computeLoaderMass, computeLoaderThrust, computeNftImageUrl, computePerLegReach, computeShipHullCapabilities, computeStorageCapabilities, computeTravelDrain, computeWarehouseHullCapabilities, computeWarpCapabilities, computeWarpRange, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeAddress, decodeAtomicAsset, decodeCraftedItemStats, decodeRegion, decodeSector, decodeStat, decodeStats, Shipload as default, deriveLocation, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStatMappings, deriveStrata, deriveStratum, derivedLoaders, describeItem, describeModule, describeModuleForItem, describeModuleForSlot, deserializeAsset, deserializeAtomicData, deserializeComponent, deserializeEntity, deserializeModule, deserializeResource, displayName, distanceBetweenCoordinates, distanceBetweenPoints, easeFlightProgress, eligibleUpgrades, encodeAddress, encodeAddressMemo, encodeGatheredCargoStats, encodeRegion, encodeSector, encodeStats, energyAtTime, energyPercent, entityDisplayName, estimateDealTravelTime, estimateTravelTime, estimateUnwrapDuration, feistel, feistelInv, fetchAtomicAssetsForOwner, fetchAtomicSchemas, filterByBuildMethod, findNearbyPlanets, flightSpeedFactor, formatLocation, formatMass, formatMassDelta, formatMassScaled, formatModuleLine, formatTier, gatherEnergyCost, gathererDepthForTier, getAllRecipes, getBaseHullmassFor, getCapabilityAttributeRows, getCapabilityAttributes, getCategoryInfo, getComponentDemand, getComponents, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEffectiveReserve, getEligibleResources, getEntityClass, getEntityItems, getEntityLayout, getEpochInfo, getFlightOrigin, getInterpolatedPosition, getItem, getItems, getKindMeta, getLocationCandidates, getLocationKind, getLocationProfile, getLocationType, getLocationTypeName, getModuleCapabilityType, getModules, getPackedEntityType, getPlanetSubtype, getPlanetSubtypes, getPositionAt, getProducersForAttribute, getRecipe, getRecipeConsumers, getResourceDemand, getResourceTier, getResourceWeight, getResources, getStatDefinitions, getStatMappings, getStatMappingsForCapability, getStatMappingsForStat, getStatName, getSystemName, getTemplateMeta, hasEnergy, hasEnergyForDistance, hasGatherer, hasLoaders, hasMass, hasSchedule, hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, incomingHoldMass, interpolateFlightPosition, isBuildable, isContainer, isCraftedItem, isExtractor, isFactory, isFull, isFullFromMass, isGatherableLocation, isHub, isInvertedAttribute, isLocationBuildable, isModuleItem, isNexus, isPlot, isPlotBuildable, isRelatedItem, isShip, isSubscriptionsDebugEnabled, isValidWormholePair, isWarehouse, isWorkshop, itemAbbreviations, itemCategory, itemIds, itemOffset, itemTier, itemTypeCode, jobsToLanes, kindCan, laneKeyForModule, lerp$1 as lerp, makeEntity, mapEntity, maxCraftable, maxQtyForCharge, maxTravelDistance, mergeStacks, moduleAccepts, moduleDisplayName, moduleIcon, moduleSlotTypeToCode, nearbyWormholes, needsRecharge, normalizeDisplayName, parseWireEntity, partnerRegion, pickFabricator, planParallelTransfer, planRoute, projectEntity, projectEntityAt, projectRemainingAt, projectedCargoAvailableAt, projectedPeakCargomass, rawScheduleEnd, readCommonBase, receiveFits, regionOf, removeFromStacks, renderDescription, resolveItem, resolveItemCategory, resolveLaneBuilder, resolveLaneCrafter, resolveLaneGatherer, resolveLaneLoader, resolveLockedAmount, resolveStats, rollTier, rollWithinTier, rollupBuilder, rollupCrafter, rollupGatherer, rollupLoaders, rotation, schedule, sdkSystemGraph, selectGatherLane, setSubscriptionsDebug, simulateRoute, slotAcceptsModule, socketTail, sourceLabelForOutput, splitCost, stackKey, stackToCargoItem, stacksEqual, starRating, starsForStat, statMagnitude, subtractFromStacks, taskCargoChanges, taskCargoEffect, tierAdjective, tierColors, tierOfReserve, toLocation, typeLabel, unwrapLoadDuration, unwrapTransitDuration, validateDisplayName, validateSchedule, workerLaneKey, wormholeAt, wormholeAtRegionEndpoint, yieldThresholdAt };
18812
20755
  //# sourceMappingURL=shipload.m.js.map