@shipload/sdk 2.0.0-rc4 → 2.0.0-rc6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/shipload.d.ts +411 -1025
- package/lib/shipload.js +879 -2057
- package/lib/shipload.js.map +1 -1
- package/lib/shipload.m.js +852 -2028
- package/lib/shipload.m.js.map +1 -1
- package/package.json +1 -1
- package/src/capabilities/crafting.ts +10 -0
- package/src/capabilities/guards.ts +0 -5
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/storage.ts +0 -8
- package/src/contracts/server.ts +106 -225
- package/src/data/items.json +15 -14
- package/src/data/recipes.ts +129 -0
- package/src/derivation/crafting.ts +120 -0
- package/src/derivation/index.ts +9 -6
- package/src/derivation/resources.ts +54 -53
- package/src/derivation/stats.ts +146 -0
- package/src/derivation/stratum.ts +14 -14
- package/src/entities/cargo-utils.ts +6 -64
- package/src/entities/container.ts +18 -0
- package/src/entities/entity-inventory.ts +0 -4
- package/src/entities/inventory-accessor.ts +0 -4
- package/src/entities/location.ts +2 -197
- package/src/entities/player.ts +1 -274
- package/src/entities/ship.ts +0 -21
- package/src/entities/warehouse.ts +0 -4
- package/src/index-module.ts +43 -47
- package/src/managers/actions.ts +38 -90
- package/src/managers/context.ts +0 -9
- package/src/managers/index.ts +0 -1
- package/src/managers/locations.ts +2 -85
- package/src/market/items.ts +1 -2
- package/src/scheduling/projection.ts +0 -10
- package/src/shipload.ts +0 -5
- package/src/types/capabilities.ts +1 -9
- package/src/types/entity-traits.ts +3 -4
- package/src/types/entity.ts +0 -1
- package/src/types.ts +8 -28
- package/src/utils/system.ts +5 -4
- package/src/managers/trades.ts +0 -119
- package/src/market/market.ts +0 -208
- package/src/market/rolls.ts +0 -8
- package/src/trading/collect.ts +0 -938
- package/src/trading/deal.ts +0 -207
- package/src/trading/trade.ts +0 -203
package/lib/shipload.m.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __decorate } from 'tslib';
|
|
2
|
-
import { Blob, ABI, Struct, Name, UInt64, Checksum256, UInt32, TimePointSec,
|
|
2
|
+
import { Blob, ABI, Struct, Name, UInt64, Checksum256, UInt32, TimePointSec, UInt8, TimePoint, UInt16, Int64, Bytes, Checksum512, APIClient } from '@wharfkit/antelope';
|
|
3
3
|
import ContractKit, { Contract as Contract$2 } from '@wharfkit/contract';
|
|
4
4
|
|
|
5
5
|
const abiBlob$1 = Blob.from('DmVvc2lvOjphYmkvMS4yAA0KY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/C2NvbXBhbnlfcm93AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nBmVuYWJsZQABB2VuYWJsZWQEYm9vbAplbmFibGVnYW1lAAIIY29udHJhY3QEbmFtZQdlbmFibGVkBGJvb2wMZm91bmRjb21wYW55AAIHYWNjb3VudARuYW1lBG5hbWUGc3RyaW5nC2dhbWVfY29uZmlnAAQEc2VlZAtjaGVja3N1bTI1NgllcG9jaHRpbWUGdWludDMyBXN0YXJ0DnRpbWVfcG9pbnRfc2VjA2VuZA50aW1lX3BvaW50X3NlYwlnYW1lX21ldGEABARuYW1lBnN0cmluZwtkZXNjcmlwdGlvbgZzdHJpbmcDdXJsBnN0cmluZwd2ZXJzaW9uBnN0cmluZwhnYW1lX3JvdwAECGNvbnRyYWN0BG5hbWUGY29uZmlnC2dhbWVfY29uZmlnBG1ldGEJZ2FtZV9tZXRhBXN0YXRlCmdhbWVfc3RhdGUKZ2FtZV9zdGF0ZQABB2VuYWJsZWQEYm9vbAlzdGFydGdhbWUABAhjb250cmFjdARuYW1lBmNvbmZpZwtnYW1lX2NvbmZpZwRtZXRhCWdhbWVfbWV0YQVzdGF0ZQpnYW1lX3N0YXRlCXN0YXRlX3JvdwABB2VuYWJsZWQEYm9vbAp1cGRhdGVnYW1lAAIIY29udHJhY3QEbmFtZQRtZXRhCWdhbWVfbWV0YQR3aXBlAAAHAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAACoeMxUBmVuYWJsZfMBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnRW5hYmxlL2Rpc2FibGUgcGxhdGZvcm0nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpFbmFibGUgb3IgZGlzYWJsZSB0aGUgcGxhdGZvcm0gY29udHJhY3QuAICShql4zFQKZW5hYmxlZ2FtZfwBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZWdhbWUKc3VtbWFyeTogJ0VuYWJsZS9kaXNiYWJsZSBhIGdhbWUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpFbmFibGUgb3IgZGlzYWJsZSB0aGUgc3BlY2lmaWVkIGdhbWUgY29udHJhY3Qu4KepkqI0NV0MZm91bmRjb21wYW55gwItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZm91bmRjb21wYW55CnN1bW1hcnk6ICdGb3VuZCBhIG5ldyBjb21wYW55JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKRm91bmQgYSBuZXcgY29tcGFueSBpbiB0aGUgU2hpcGxvYWQgcGxhdGZvcm0gY29udHJhY3QuAABQ0rB8TcYJc3RhcnRnYW1l/wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc3RhcnRnYW1lCnN1bW1hcnk6ICdTdGFydCBhIG5ldyBnYW1lJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTU4MTEzNzgyI2QzYmYyOTBmZGRlZGRiYjdkMzJhYTg5N2U5ZjdlOWUxM2EyYWU0NDk1NjE0MmUyM2ViNDdiNzcwOTZhMmVhOGQKCi0tLQoKU3RhcnQgYSBuZXcgZ2FtZSBvZiBTaGlwbG9hZCBkZXBsb3llZCB0byBhIG5ldyBjb250cmFjdC4AgJKGqWxS1Qp1cGRhdGVnYW1ljQItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdXBkYXRlZ2FtZQpzdW1tYXJ5OiAnVXBkYXRlIGdhbWUgaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNTgxMTM3ODIjZDNiZjI5MGZkZGVkZGJiN2QzMmFhODk3ZTlmN2U5ZTEzYTJhZTQ0OTU2MTQyZTIzZWI0N2I3NzA5NmEyZWE4ZAoKLS0tCgpVcGRhdGUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgZ2FtZSBjb250cmFjdC4KCi0tLQAAAAAAoKrjBHdpcGWyAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlCnN1bW1hcnk6ICdERUJVRzogd2lwZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0DAAAAwE9TJUUDaTY0AAALY29tcGFueV9yb3cAAAAAAKykYQNpNjQAAAhnYW1lX3JvdwAAAAAAlU3GA2k2NAAACXN0YXRlX3JvdwETU2hpcGxvYWQgKFBsYXRmb3JtKRNTaGlwbG9hZCAoUGxhdGZvcm0pAAAAAA==');
|
|
@@ -205,7 +205,7 @@ var platform = /*#__PURE__*/Object.freeze({
|
|
|
205
205
|
Contract: Contract$1
|
|
206
206
|
});
|
|
207
207
|
|
|
208
|
-
const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDhaB2FkdmFuY2UAAgZyZXZlYWwGc3RyaW5nBmNvbW1pdAtjaGVja3N1bTI1NgxidXljb250YWluZXIAAwdhY2NvdW50BG5hbWUHc2hpcF9pZAZ1aW50NjQEbmFtZQZzdHJpbmcIYnV5aXRlbXMABAtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAdpdGVtX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIHYnV5c2hpcAACB2FjY291bnQEbmFtZQRuYW1lBnN0cmluZwxidXl3YXJlaG91c2UAAwdhY2NvdW50BG5hbWUHc2hpcF9pZAZ1aW50NjQEbmFtZQZzdHJpbmcGY2FuY2VsAAMLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQFY291bnQGdWludDY0DmNhbmNlbF9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lD2NhbmNlbGxlZF9jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/CmNhcmdvX2l0ZW0ABAdpdGVtX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIJdW5pdF9jb3N0BnVpbnQ2NARzZWVkB3VpbnQ2ND8JY2FyZ29fcm93AAYCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0CXVuaXRfY29zdAZ1aW50NjQEc2VlZAZ1aW50NjQJY2xlYW5yc3ZwAAIFZXBvY2gGdWludDY0CG1heF9yb3dzBnVpbnQ2NApjbGVhcnRhYmxlAAMKdGFibGVfbmFtZQRuYW1lBXNjb3BlBW5hbWU/CG1heF9yb3dzB3VpbnQ2ND8GY29tbWl0AAEGY29tbWl0C2NoZWNrc3VtMjU2CWNvbmZpZ2xvZwABBmNvbmZpZwtnYW1lX2NvbmZpZw1jb250YWluZXJfcm93AAgCaWQGdWludDY0BW93bmVyBG5hbWUEbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMIaHVsbG1hc3MGdWludDMyCGNhcGFjaXR5BnVpbnQzMgljYXJnb21hc3MGdWludDMyCHNjaGVkdWxlCXNjaGVkdWxlPwtjb29yZGluYXRlcwADAXgFaW50NjQBeQVpbnQ2NAF6B3VpbnQxNj8GZW5hYmxlAAEHZW5hYmxlZARib29sDGVuZXJneV9zdGF0cwACCGNhcGFjaXR5BnVpbnQxNghyZWNoYXJnZQZ1aW50MTYUZW50aXR5X2N1cnJlbnRfc3RhdGUAAgtjb29yZGluYXRlcwtjb29yZGluYXRlcwZlbmVyZ3kGdWludDE2D2VudGl0eV9kZWZhdWx0cwAQDXNoaXBfaHVsbG1hc3MGdWludDMyDXNoaXBfY2FwYWNpdHkGdWludDMyC3NoaXBfZW5lcmd5BnVpbnQxNgZzaGlwX3oGdWludDE2DHNoaXBfZW5naW5lcw5tb3ZlbWVudF9zdGF0cw5zaGlwX2dlbmVyYXRvcgxlbmVyZ3lfc3RhdHMMc2hpcF9sb2FkZXJzDGxvYWRlcl9zdGF0cwpzaGlwX3RyYWRlC3RyYWRlX3N0YXRzDnNoaXBfZXh0cmFjdG9yD2V4dHJhY3Rvcl9zdGF0cwlzaGlwX3dhcnAKd2FycF9zdGF0cxJ3YXJlaG91c2VfY2FwYWNpdHkGdWludDMyC3dhcmVob3VzZV96BnVpbnQxNhF3YXJlaG91c2VfbG9hZGVycwxsb2FkZXJfc3RhdHMSY29udGFpbmVyX2h1bGxtYXNzBnVpbnQzMhJjb250YWluZXJfY2FwYWNpdHkGdWludDMyC2NvbnRhaW5lcl96BnVpbnQxNgtlbnRpdHlfaW5mbwAWBHR5cGUEbmFtZQJpZAZ1aW50NjQFb3duZXIEbmFtZQtlbnRpdHlfbmFtZQZzdHJpbmcLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMJY2FyZ29tYXNzBnVpbnQzMgVjYXJnbwxjYXJnb19pdGVtW10HbG9hZGVycw1sb2FkZXJfc3RhdHM/BmVuZXJneQd1aW50MTY/CGh1bGxtYXNzB3VpbnQzMj8HZW5naW5lcw9tb3ZlbWVudF9zdGF0cz8JZ2VuZXJhdG9yDWVuZXJneV9zdGF0cz8IY2FwYWNpdHkHdWludDMyPwlleHRyYWN0b3IQZXh0cmFjdG9yX3N0YXRzPwR3YXJwC3dhcnBfc3RhdHM/B2lzX2lkbGUEYm9vbAxjdXJyZW50X3Rhc2sFdGFzaz8UY3VycmVudF90YXNrX2VsYXBzZWQGdWludDMyFmN1cnJlbnRfdGFza19yZW1haW5pbmcGdWludDMyDXBlbmRpbmdfdGFza3MGdGFza1tdB2lkbGVfYXQLdGltZV9wb2ludD8Ic2NoZWR1bGUJc2NoZWR1bGU/CmVudGl0eV9yZWYAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQOZW50aXR5X3N1bW1hcnkACAR0eXBlBG5hbWUCaWQGdWludDY0BW93bmVyBG5hbWULZW50aXR5X25hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzB2lzX2lkbGUEYm9vbA5yZXNvbHZlZF9jb3VudAZ1aW50MzINcGVuZGluZ19jb3VudAZ1aW50MzIQZW50aXR5X3Rhc2tfaW5mbwAECWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQp0YXNrX2NvdW50BXVpbnQ4EHNjaGVkdWxlX3N0YXJ0ZWQKdGltZV9wb2ludA9lbnRpdHlncm91cF9yb3cAAgJpZAZ1aW50NjQMcGFydGljaXBhbnRzDGVudGl0eV9yZWZbXQdleHRyYWN0AAQLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQHc3RyYXR1bQZ1aW50MTYIcXVhbnRpdHkGdWludDMyD2V4dHJhY3Rvcl9zdGF0cwAFBHJhdGUGdWludDE2BWRyYWluBnVpbnQxNgplZmZpY2llbmN5BnVpbnQxNgVkZXB0aAZ1aW50MTYFZHJpbGwGdWludDE2C2dhbWVfY29uZmlnAAMHdmVyc2lvbgZ1aW50MzIIZGVmYXVsdHMPZW50aXR5X2RlZmF1bHRzBWl0ZW1zCml0ZW1fZGVmW10JZ2V0Y29uZmlnAAALZ2V0ZW50aXRpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/CWdldGVudGl0eQACC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhnZXRpdGVtcwAAC2dldGxvY2F0aW9uAAIBeAVpbnQ2NAF5BWludDY0CmdldGxvY2RhdGEAAgF4BWludDY0AXkFaW50NjQJZ2V0bmVhcmJ5AAMLZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CHJlY2hhcmdlBGJvb2wJZ2V0cGxheWVyAAEHYWNjb3VudARuYW1lCmdldHN0YXJ0ZXIAAApnZXRzdHJhdHVtAAMBeAVpbnQ2NAF5BWludDY0B3N0cmF0dW0GdWludDE2DGdldHN1bW1hcmllcwACBW93bmVyBG5hbWULZW50aXR5X3R5cGUFbmFtZT8LZ3JvdXB0cmF2ZWwABAhlbnRpdGllcwxlbnRpdHlfcmVmW10BeAVpbnQ2NAF5BWludDY0CHJlY2hhcmdlBGJvb2wEaGFzaAABBXZhbHVlBnN0cmluZwdoYXNoNTEyAAEFdmFsdWUGc3RyaW5nBGluaXQAAQRzZWVkC2NoZWNrc3VtMjU2CGl0ZW1fZGVmAAMCaWQGdWludDE2CmJhc2VfcHJpY2UGdWludDMyBG1hc3MGdWludDMyCml0ZW1zX2luZm8AAQVpdGVtcwppdGVtX2RlZltdBGpvaW4AAQdhY2NvdW50BG5hbWUMbG9hZGVyX3N0YXRzAAMEbWFzcwZ1aW50MzIGdGhydXN0BnVpbnQxNghxdWFudGl0eQV1aW50OBBsb2NhdGlvbl9kZXJpdmVkAAMMc3RhdGljX3Byb3BzD2xvY2F0aW9uX3N0YXRpYwtlcG9jaF9wcm9wcw5sb2NhdGlvbl9lcG9jaARzaXplBnVpbnQxNg5sb2NhdGlvbl9lcG9jaAADBmFjdGl2ZQRib29sBXNlZWQwBXVpbnQ4BXNlZWQxBXVpbnQ4DWxvY2F0aW9uX2luZm8AAwZjb29yZHMLY29vcmRpbmF0ZXMJaXNfc3lzdGVtBGJvb2wFaXRlbXMPbG9jYXRpb25faXRlbVtdDWxvY2F0aW9uX2l0ZW0ABQJpZAZ1aW50MTYFcHJpY2UGdWludDMyBnN1cHBseQZ1aW50MTYRcmFyaXR5X211bHRpcGxpZXIGdWludDMyE2xvY2F0aW9uX211bHRpcGxpZXIGdWludDMyDGxvY2F0aW9uX3JvdwAGAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCWNhcmdvbWFzcwZ1aW50MzIFY2FyZ28MY2FyZ29faXRlbVtdCHNjaGVkdWxlCXNjaGVkdWxlPw9sb2NhdGlvbl9zdGF0aWMABQZjb29yZHMLY29vcmRpbmF0ZXMEdHlwZQ1sb2NhdGlvbl90eXBlB3N1YnR5cGUFdWludDgFc2VlZDAFdWludDgFc2VlZDEFdWludDgObW92ZW1lbnRfc3RhdHMAAgZ0aHJ1c3QGdWludDMyBWRyYWluBnVpbnQxNgtuZWFyYnlfaW5mbwAFCmNhbl90cmF2ZWwEYm9vbAdjdXJyZW50FGVudGl0eV9jdXJyZW50X3N0YXRlCXByb2plY3RlZBRlbnRpdHlfY3VycmVudF9zdGF0ZQptYXhfZW5lcmd5BnVpbnQxNgdzeXN0ZW1zD25lYXJieV9zeXN0ZW1bXQ1uZWFyYnlfc3lzdGVtAAQIZGlzdGFuY2UGdWludDY0C2VuZXJneV9jb3N0BnVpbnQ2NAtmbGlnaHRfdGltZQZ1aW50MzIIbG9jYXRpb24NbG9jYXRpb25faW5mbwZub3RpZnkAAQVldmVudAp0YXNrX2V2ZW50B3BheWxvYW4AAgdhY2NvdW50BG5hbWUGYW1vdW50BnVpbnQ2NAtwbGF5ZXJfaW5mbwANBW93bmVyBG5hbWUJaXNfcGxheWVyBGJvb2wMY29tcGFueV9uYW1lBnN0cmluZwdiYWxhbmNlBnVpbnQ2NARkZWJ0BnVpbnQzMghuZXR3b3J0aAVpbnQ2NA5hdmFpbGFibGVfbG9hbgZ1aW50NjQPbmV4dF9zaGlwX3ByaWNlBnVpbnQ2NBRuZXh0X3dhcmVob3VzZV9wcmljZQZ1aW50NjQUbmV4dF9jb250YWluZXJfcHJpY2UGdWludDY0CnNoaXBfY291bnQGdWludDY0D3dhcmVob3VzZV9jb3VudAZ1aW50NjQPY29udGFpbmVyX2NvdW50BnVpbnQ2NApwbGF5ZXJfcm93AAQFb3duZXIEbmFtZQdiYWxhbmNlBnVpbnQ2NARkZWJ0BnVpbnQzMghuZXR3b3J0aAVpbnQ2NAtwdXJnZXN1cHBseQABCG1heF9yb3dzB3VpbnQ2ND8IcmVjaGFyZ2UAAgtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAtyZXNlcnZlX3JvdwACAmlkBnVpbnQ2NAlyZW1haW5pbmcGdWludDMyB3Jlc29sdmUAAwtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAVjb3VudAd1aW50NjQ/D3Jlc29sdmVfcmVzdWx0cwAGCWVudGl0eV9pZAZ1aW50NjQLZW50aXR5X3R5cGUEbmFtZQ5yZXNvbHZlZF9jb3VudAV1aW50OBRuZXdfc2NoZWR1bGVfc3RhcnRlZAt0aW1lX3BvaW50PwtlbnRpdHlncm91cAd1aW50NjQ/DWdyb3VwX21lbWJlcnMWQl92ZWN0b3JfZW50aXR5X3JlZl9FPw5yZXNvdXJjZV9zdGF0cwAEBnB1cml0eQZ1aW50MTYHZGVuc2l0eQZ1aW50MTYKcmVhY3Rpdml0eQZ1aW50MTYJcmVzb25hbmNlBnVpbnQxNgRzYWx0AAEEc2FsdAZ1aW50NjQIc2NoZWR1bGUAAgdzdGFydGVkCnRpbWVfcG9pbnQFdGFza3MGdGFza1tdCXNlbGxpdGVtcwAEC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0B2l0ZW1faWQGdWludDE2CHF1YW50aXR5BnVpbnQzMgxzZXF1ZW5jZV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQZ1aW50NjQIc2hpcF9yb3cADwJpZAZ1aW50NjQFb3duZXIEbmFtZQRuYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwhodWxsbWFzcwZ1aW50MzIIY2FwYWNpdHkGdWludDMyBmVuZXJneQZ1aW50MTYJY2FyZ29tYXNzBnVpbnQzMgdlbmdpbmVzDm1vdmVtZW50X3N0YXRzCWdlbmVyYXRvcgxlbmVyZ3lfc3RhdHMHbG9hZGVycwxsb2FkZXJfc3RhdHMFdHJhZGUMdHJhZGVfc3RhdHM/CWV4dHJhY3RvchBleHRyYWN0b3Jfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8Ic2NoZWR1bGUJc2NoZWR1bGU/DHN0YXJ0ZXJfaW5mbwADB2JhbGFuY2UGdWludDY0BGRlYnQGdWludDY0BHNoaXALZW50aXR5X2luZm8Jc3RhdGVfcm93AAYHZW5hYmxlZARib29sBWVwb2NoBnVpbnQzMgRzYWx0BnVpbnQ2NAVzaGlwcwZ1aW50MzIEc2VlZAtjaGVja3N1bTI1NgZjb21taXQLY2hlY2tzdW0yNTYMc3RyYXR1bV9kYXRhAAIHc3RyYXR1bQxzdHJhdHVtX2luZm8Fc3RhdHMOcmVzb3VyY2Vfc3RhdHMMc3RyYXR1bV9pbmZvAAQHaXRlbV9pZAZ1aW50MTYEc2VlZAZ1aW50NjQIcmljaG5lc3MGdWludDE2B3Jlc2VydmUGdWludDMyCnN1cHBseV9yb3cABQJpZAZ1aW50NjQLY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMFZXBvY2gGdWludDY0B2l0ZW1faWQGdWludDE2BnN1cHBseQZ1aW50MTYIdGFrZWxvYW4AAgdhY2NvdW50BG5hbWUGYW1vdW50BnVpbnQ2NAR0YXNrAAkEdHlwZQV1aW50OAhkdXJhdGlvbgZ1aW50MzIKY2FuY2VsYWJsZQV1aW50OAtjb29yZGluYXRlcwxjb29yZGluYXRlcz8FY2FyZ28MY2FyZ29faXRlbVtdDGVudGl0eXRhcmdldAtlbnRpdHlfcmVmPwtlbnRpdHlncm91cAd1aW50NjQ/B2NyZWRpdHMGaW50NjQ/C2VuZXJneV9jb3N0B3VpbnQxNj8KdGFza19ldmVudAAJCmV2ZW50X3R5cGUFdWludDgFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQKdGFza19pbmRleAV1aW50OAR0YXNrBHRhc2sJc3RhcnRzX2F0CnRpbWVfcG9pbnQMY29tcGxldGVzX2F0CnRpbWVfcG9pbnQKbmV3X2VuZXJneQd1aW50MTY/DHRhc2tfcmVzdWx0cwABCGVudGl0aWVzEmVudGl0eV90YXNrX2luZm9bXQt0cmFkZV9zdGF0cwABBm1hcmdpbgZ1aW50MTYIdHJhbnNmZXIABgtzb3VyY2VfdHlwZQRuYW1lCXNvdXJjZV9pZAZ1aW50NjQJZGVzdF90eXBlBG5hbWUHZGVzdF9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYIcXVhbnRpdHkGdWludDMyBnRyYXZlbAAFC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sCXR5cGVzX3JvdwAEAmlkBnVpbnQ2NBNlbnRpdHlfc3VtbWFyeV90eXBlDmVudGl0eV9zdW1tYXJ5EXN0YXJ0ZXJfaW5mb190eXBlDHN0YXJ0ZXJfaW5mbxBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnDHVwZGF0ZWNyZWRpdAACB2FjY291bnQEbmFtZQZhbW91bnQFaW50NjQKdXBkYXRlZGVidAACB2FjY291bnQEbmFtZQZhbW91bnQFaW50NjQNd2FyZWhvdXNlX3JvdwAIAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGNhcGFjaXR5BnVpbnQzMgljYXJnb21hc3MGdWludDMyB2xvYWRlcnMMbG9hZGVyX3N0YXRzCHNjaGVkdWxlCXNjaGVkdWxlPwR3YXJwAAQLZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQBeAVpbnQ2NAF5BWludDY0CndhcnBfc3RhdHMAAQVyYW5nZQZ1aW50MzIEd2lwZQAADHdpcGVzZXF1ZW5jZQAAKwAAAEChaXYyB2FkdmFuY2XTAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBhZHZhbmNlCnN1bW1hcnk6ICdBZHZhbmNlIHR1cm4nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkFkdmFuY2UgdGhlIGdhbWUgdG8gdGhlIG5leHQgdHVybi5w1XQmT4q8PgxidXljb250YWluZXLKAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBidXljb250YWluZXIKc3VtbWFyeTogJ0J1eSBhIG5ldyBjb250YWluZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClB1cmNoYXNlIGEgbmV3IGNvbnRhaW5lciBhdCB0aGUgbG9jYXRpb24gb2YgYW4gaWRsZSBzaGlwLiBDb250YWluZXJzIHByb3ZpZGUgY2FyZ28gc3RvcmFnZSBidXQgaGF2ZSBubyBsb2FkZXJzIGFuZCBjYW5ub3QgbW92ZSBpbmRlcGVuZGVudGx5LgAAAFiq7Lw+CGJ1eWl0ZW1z3QEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYnV5aXRlbXMKc3VtbWFyeTogJ0J1eSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUHVyY2hhc2UgaXRlbXMgYW5kIGFkZCB0aGVtIHRvIGEgc2hpcCdzIGNhcmdvLgAAAKC6hr0+B2J1eXNoaXDGAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBidXlzaGlwCnN1bW1hcnk6ICdCdXkgYSBuZXcgc2hpcCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUHVyY2hhc2UgYSBuZXcgc2hpcKCwpk1dw70+DGJ1eXdhcmVob3VzZcwCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGJ1eXdhcmVob3VzZQpzdW1tYXJ5OiAnQnV5IGEgbmV3IHdhcmVob3VzZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUHVyY2hhc2UgYSBuZXcgd2FyZWhvdXNlIGF0IHRoZSBsb2NhdGlvbiBvZiBhbiBpZGxlIHNoaXAuIFdhcmVob3VzZXMgcHJvdmlkZSBjYXJnbyBzdG9yYWdlIHdpdGggbG9hZGluZy91bmxvYWRpbmcgY2FwYWJpbGl0aWVzIGJ1dCBjYW5ub3QgbW92ZS4AAAAARIWmQQZjYW5jZWzHAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBjYW5jZWwKc3VtbWFyeTogJ0NhbmNlbCBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbmNlbCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0YXNrcyBmcm9tIHRoZSBlbmQgb2YgYW4gZW50aXR5J3Mgc2NoZWR1bGUuIFRhc2tzIHRoYXQgYXJlIGltbXV0YWJsZSBhbmQgaW4gcHJvZ3Jlc3MgY2Fubm90IGJlIGNhbmNlbGxlZC4KCi0tLQAAqBvfaVRECWNsZWFucnN2cAAAgIrH5GtURApjbGVhcnRhYmxlvgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2xlYXJ0YWJsZQpzdW1tYXJ5OiAnREVCVUc6IGNsZWFydGFibGUgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tAAAAAGQnJUUGY29tbWl08QEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY29tbWl0CnN1bW1hcnk6ICdTZXQgY29tbWl0IHZhbHVlJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTZXQgdGhlIGluaXRpYWwgY29tbWl0IHZhbHVlIGR1cmluZyBnYW1lIGluaXRpYWxpemF0aW9uLgoKLS0tAABgNDK3JkUJY29uZmlnbG9nAAAAAACoeMxUBmVuYWJsZeIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC4KCi0tLQAAACAjc3NXB2V4dHJhY3ShAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBleHRyYWN0CnN1bW1hcnk6ICdFeHRyYWN0IHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRXh0cmFjdCByZXNvdXJjZXMgYXQgdGhlIHNoaXAncyBjdXJyZW50IGxvY2F0aW9uLiBPbmx5IHdvcmtzIGF0IGV4dHJhY3RhYmxlIGxvY2F0aW9uIHR5cGVzLiBTY2hlZHVsZXMgYW4gZXh0cmFjdGlvbiB0YXNrIHRoYXQgY29uc3VtZXMgZW5lcmd5IGFuZCB5aWVsZHMgY2FyZ28gYmFzZWQgb24gdGhlIHNoaXAncyBleHRyYWN0b3Igc3RhdHMgYW5kIHRoZSBsb2NhdGlvbidzIHJlc291cmNlIGNvbXBvc2l0aW9uLgAAYG5NirJiCWdldGNvbmZpZwAAsHLZ5amyYgtnZXRlbnRpdGllc6QCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0aWVzCnN1bW1hcnk6ICdHZXQgYWxsIGVudGl0aWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBmdWxsIGVudGl0eSBpbmZvIGZvciBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgAA8NnlqbJiCWdldGVudGl0eaICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0eQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBlbnRpdHkgaW5jbHVkaW5nIGlkZW50aXR5LCBjYXJnbywgc2NoZWR1bGUgc3RhdGUsIGFuZCB0eXBlLXNwZWNpZmljIGZpZWxkcy4AAABYquyyYghnZXRpdGVtc5oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1zCnN1bW1hcnk6ICdHZXQgYWxsIGF2YWlsYWJsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGl0ZW1zIGluIHRoZSBnYW1lIGluY2x1ZGluZyB0aGVpciBpZCwgYmFzZSBwcmljZSwgYW5kIG1hc3MuACZ12SAas2ILZ2V0bG9jYXRpb27iAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NhdGlvbgpzdW1tYXJ5OiAnR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jYXRpb24gaW5jbHVkaW5nIHdoZXRoZXIgYSBzeXN0ZW0gZXhpc3RzLCBhbmQgZm9yIGVhY2ggaXRlbTogcHJpY2UsIHN1cHBseSwgcmFyaXR5IG11bHRpcGxpZXIsIGFuZCBsb2NhdGlvbiBtdWx0aXBsaWVyLgCAySYhGrNiCmdldGxvY2RhdGH+Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NkYXRhCnN1bW1hcnk6ICdHZXQgZGVyaXZlZCBsb2NhdGlvbiBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGRlcml2ZWQgbG9jYXRpb24gZGF0YSBpbmNsdWRpbmcgc3RhdGljIHByb3BlcnRpZXMgKHR5cGUsIGRpZmZpY3VsdHksIHNlZWRzKSBmcm9tIHRoZSBnYW1lIHNlZWQgYW5kIGVwb2NoLXNwZWNpZmljIHByb3BlcnRpZXMgKGFjdGl2ZSwgc2VlZHMpIGZyb20gdGhlIGN1cnJlbnQgZXBvY2ggc2VlZC4AAPDnGjWzYglnZXRuZWFyYnneAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRuZWFyYnkKc3VtbWFyeTogJ0dldCBuZWFyYnkgcmVhY2hhYmxlIHN5c3RlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgbmVhcmJ5IHN5c3RlbXMgcmVhY2hhYmxlIGJ5IGFuIGVudGl0eSBmcm9tIGl0cyBwcm9qZWN0ZWQgbG9jYXRpb24uIFJldHVybnMgY3VycmVudCBzdGF0ZSAod2l0aCBjb21wbGV0ZWQgdGFza3MgcmVzb2x2ZWQpLCBwcm9qZWN0ZWQgc3RhdGUgKGFmdGVyIGFsbCBzY2hlZHVsZWQgdGFza3MpLCBhbmQgYSBsaXN0IG9mIHJlYWNoYWJsZSBzeXN0ZW1zIHdpdGggZGlzdGFuY2UsIGVuZXJneSBjb3N0LCBmbGlnaHQgdGltZSwgYW5kIG1hcmtldCBpbmZvcm1hdGlvbi4AALjKm1izYglnZXRwbGF5ZXL9Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRwbGF5ZXIKc3VtbWFyeTogJ0dldCBwbGF5ZXIgaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwbGF5ZXIgaW5jbHVkaW5nIGJhbGFuY2UsIGRlYnQsIG5ldHdvcnRoLCBlbnRpdHkgY291bnRzLCBhbmQgcHJpY2luZyBmb3IgbmV4dCBwdXJjaGFzZXMuIFJldHVybnMgaXNfcGxheWVyPWZhbHNlIGlmIHRoZSBhY2NvdW50IGhhcyBub3Qgam9pbmVkIHRoZSBnYW1lLgDAVfmajLNiCmdldHN0YXJ0ZXKFAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdGFydGVyCnN1bW1hcnk6ICdHZXQgc3RhcnRlciBzaGlwIGFuZCBiYWxhbmNlIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSBzdGFydGVyIHNoaXAgc3RhdHMgYW5kIGluaXRpYWwgYmFsYW5jZSBhIG5ldyBwbGF5ZXIgd291bGQgcmVjZWl2ZSB1cG9uIGpvaW5pbmcuIFVzZWQgZm9yIG9uYm9hcmRpbmcgVUkgdG8gZGlzcGxheSB3aGF0IHBsYXllcnMgd2lsbCBnZXQgYmVmb3JlIHRoZXkgcmVnaXN0ZXIuAIDU2dyMs2IKZ2V0c3RyYXR1bQCAlbtGSo2zYgxnZXRzdW1tYXJpZXPoAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdW1tYXJpZXMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc3VtbWFyaWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBsaWdodHdlaWdodCBzdW1tYXJpZXMgb2YgYWxsIGVudGl0aWVzIG93bmVkIGJ5IGEgcGxheWVyIGluY2x1ZGluZyB0eXBlLCBpZCwgb3duZXIsIG5hbWUsIGxvY2F0aW9uLCBhbmQgaWRsZSBzdGF0dXMuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgCi2ubmqullC2dyb3VwdHJhdmVsmgQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ3JvdXB0cmF2ZWwKc3VtbWFyeTogJ01vdmUgbXVsdGlwbGUgZW50aXRpZXMgdG9nZXRoZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIGdyb3VwIHRyYXZlbCBmb3IgbXVsdGlwbGUgZW50aXRpZXMgdG8gYSBkZXN0aW5hdGlvbi4gQWxsIGVudGl0aWVzIG11c3QgYmUgYXQgdGhlIHNhbWUgbG9jYXRpb24gYW5kIG93bmVkIGJ5IHRoZSBjYWxsZXIuIEF0IGxlYXN0IG9uZSBlbnRpdHkgd2l0aCBlbmdpbmVzIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhydXN0LiBGbGlnaHQgZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBmcm9tIGNvbWJpbmVkIHRocnVzdCBhbmQgdG90YWwgbWFzcyBvZiBhbGwgZW50aXRpZXMuIENyZWF0ZXMgYW4gZW50aXR5Z3JvdXAgZm9yIGF0b21pYyByZXNvbHV0aW9uIGFuZCBjYW5jZWxsYXRpb24uAAAAAADQsGkEaGFzaP0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2gKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGEyNTYgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhMjU2IGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4KCi0tLQAAAECE0rBpB2hhc2g1MTL7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoNTEyCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhNTEyIGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTUxMiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAAACQ3XQEaW5pdPoBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGluaXQKc3VtbWFyeTogJ0luaXRpYWxpemUgZ2FtZSBzZWVkJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWFsaXplIGEgdGhlIGdhbWVzIHNlZWQgYW5kIHNlZWQgdmFsdWVzIHRvIGJvb3RzdHJhcCBnYW1lIHN0YXRlLgAAAAAAMB19BGpvaW7JAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBqb2luCnN1bW1hcnk6ICdKb2luIGEgZ2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSm9pbiBhIGdhbWUgb2YgU2hpcGxvYWQKCi0tLQAAAAD45TKdBm5vdGlmeYoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5vdGlmeQpzdW1tYXJ5OiAnVGFzayBsaWZlY3ljbGUgbm90aWZpY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gdGhhdCBub3RpZmllcyBlbnRpdHkgb3duZXJzIG9mIHRhc2sgbGlmZWN5Y2xlIGV2ZW50cyAocmVzb2x2ZWQsIGNhbmNlbGxlZCkuIENhbGxlZCBpbmxpbmUgd2hlbiB0YXNrcyBjaGFuZ2Ugc3RhdGUuIFVzZXMgcmVxdWlyZV9yZWNpcGllbnQgdG8gZW5hYmxlIG9mZi1jaGFpbiBtb25pdG9yaW5nIHZpYSBhY3Rpb24gdHJhY2VzLgAAAGAaGr2pB3BheWxvYW6vAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBwYXlsb2FuCnN1bW1hcnk6ICdMb2FuIFBheW1lbnQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AfKxVY8WurgtwdXJnZXN1cHBseekBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHB1cmdlc3VwcGx5CnN1bW1hcnk6ICdVcGRhdGUgR2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUHVyZ2Ugb2xkIHN1cHBseSByZWNvcmRzIGFuZCBoZWxwIGNsZWFudXAgZ2FtZSBzdGF0ZS4AAACKXdOQughyZWNoYXJnZdICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHJlY2hhcmdlCnN1bW1hcnk6ICdSZWNoYXJnZSBzaGlwIGVuZXJneScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2NoZWR1bGUgYSByZWNoYXJnZSB0YXNrIGZvciBhbiBlbnRpdHkgdG8gcmVzdG9yZSBlbmVyZ3kgdG8gZnVsbCBjYXBhY2l0eS4gVGhlIHJlY2hhcmdlIGR1cmF0aW9uIGRlcGVuZHMgb24gY3VycmVudCBlbmVyZ3kgbGV2ZWwgYW5kIHJlY2hhcmdlIHJhdGUuCgotLS0AAABA7UixugdyZXNvbHZl1QMtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVzb2x2ZQpzdW1tYXJ5OiAnQ29tcGxldGUgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpSZXNvbHZlIGNvbXBsZXRlZCB0YXNrcyBpbiBhbiBlbnRpdHkncyBzY2hlZHVsZSwgYXBwbHlpbmcgdGhlaXIgZWZmZWN0cyAocmVjaGFyZ2UgZW5lcmd5LCB1cGRhdGUgbG9jYXRpb24sIGxvYWQvdW5sb2FkIGNhcmdvKS4gSWYgY291bnQgaXMgc3BlY2lmaWVkLCByZXNvbHZlIGV4YWN0bHkgdGhhdCBtYW55IHRhc2tzOyBvdGhlcndpc2UgcmVzb2x2ZSBhbGwgY29tcGxldGVkIHRhc2tzLiBGYWlscyBpZiBjb3VudCBleGNlZWRzIHRoZSBudW1iZXIgb2YgY29tcGxldGVkIHRhc2tzLgoKLS0tAAAAAACQo8EEc2FsdN0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHNhbHQKc3VtbWFyeTogJ0FwcGVuZCBTYWx0JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpBZGQgYWRkaXRpb25hbCBzYWx0IHRvIHRoZSBuZXh0IGVwb2NoIHNlZWQuCgotLS0AAMBSZRejwglzZWxsaXRlbXPVAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBzZWxsaXRlbXMKc3VtbWFyeTogJ1NlbGwgaXRlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClNlbGwgaXRlbXMgZnJvbSBhIHNoaXAncyBjYXJnby4KCi0tLQAAANPQqKDJCHRha2Vsb2Fu6gEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdGFrZWxvYW4Kc3VtbWFyeTogJ0NyZWRpdCBMb2FuJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpCb3Jyb3cgY3JlZGl0cyBmcm9tIHRoZSBiYW5rIHRoYXQgd2lsbCBuZWVkIHRvIGJlIHJlcGFpZC4AAABXLTzNzQh0cmFuc2ZlcsgDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYW5zZmVyCnN1bW1hcnk6ICdUcmFuc2ZlciBjYXJnbyBiZXR3ZWVuIGVudGl0aWVzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUcmFuc2ZlciBjYXJnbyBiZXR3ZWVuIHR3byBlbnRpdGllcyBhdCB0aGUgc2FtZSBsb2NhdGlvbi4gQm90aCBlbnRpdGllcyBtdXN0IGJlIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIGF0IGxlYXN0IG9uZSBtdXN0IGhhdmUgbG9hZGVycy4gQ3JlYXRlcyBsb2FkIGFuZCB1bmxvYWQgdGFza3Mgb24gYm90aCBlbnRpdGllcyB3aXRoIGR1cmF0aW9uIGJhc2VkIG9uIGNvbWJpbmVkIGxvYWRlciBjYXBhY2l0eSBhbmQgWi1kaXN0YW5jZSBiZXR3ZWVuIHRoZW0uAAAAAES1zc0GdHJhdmVsywItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdHJhdmVsCnN1bW1hcnk6ICdNb3ZlIGEgc2hpcCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSW5pdGlhdGUgdHJhdmVsIG9mIGFuIGVudGl0eSBmcm9tIGl0cyBjdXJyZW50IGxvY2F0aW9uIHRvIGEgbmV3IGRlc3RpbmF0aW9uLgoKLS0tCgpUaGlzIGFjdGlvbiBkZXRlcm1pbmVzIHRoZSBtYXJrZXQgcHJpY2Ugb2YgYWxsIGl0ZW1zIGF0IGEgZ2l2ZW4gbG9jYXRpb24ukF1SF6lsUtUMdXBkYXRlY3JlZGl0wgEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogdXBkYXRlY3JlZGl0CnN1bW1hcnk6ICdERUJVRzogdXBkYXRlY3JlZGl0IGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQBAPiqpbFLVCnVwZGF0ZWRlYnS+AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB1cGRhdGVkZWJ0CnN1bW1hcnk6ICdERUJVRzogdXBkYXRlZGVidCBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0AAAAAAFCv4QR3YXJwAAAAAAAAoKrjBHdpcGWyAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlCnN1bW1hcnk6ICdERUJVRzogd2lwZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS2g0FTaKqyq4wx3aXBlc2VxdWVuY2XCAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB3aXBlc2VxdWVuY2UKc3VtbWFyeTogJ0RFQlVHOiB3aXBlc2VxdWVuY2UgYWN0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tDAAAAAAAyq5BA2k2NAAACWNhcmdvX3JvdwAAuGo6kydFA2k2NAAADWNvbnRhaW5lcl9yb3cAqqaX+ezyVANpNjQAAA9lbnRpdHlncm91cF9yb3cAAACTumwQjQNpNjQAAAxsb2NhdGlvbl9yb3cAAAAAXOVNrANpNjQAAApwbGF5ZXJfcm93AAAAQO2rsLoDaTY0AAALcmVzZXJ2ZV9yb3cAAAAKTaWtwgNpNjQAAAxzZXF1ZW5jZV9yb3cAAAAAAFBdwwNpNjQAAAhzaGlwX3JvdwAAAAAAlU3GA2k2NAAACXN0YXRlX3JvdwAAAAD4WKvGA2k2NAAACnN1cHBseV9yb3cAAAAAAKyqzwNpNjQAAAl0eXBlc19yb3cAAFBY06au4QNpNjQAAA13YXJlaG91c2Vfcm93ARFTaGlwbG9hZCAoU2VydmVyKRFTaGlwbG9hZCAoU2VydmVyKQAAABcAAABYquy8Pgx0YXNrX3Jlc3VsdHMAAAAARIWmQQ5jYW5jZWxfcmVzdWx0cwAAACAjc3NXDHRhc2tfcmVzdWx0cwAAYG5NirJiC2dhbWVfY29uZmlnALBy2eWpsmINZW50aXR5X2luZm9bXQAA8NnlqbJiC2VudGl0eV9pbmZvAAAAWKrssmIKaXRlbXNfaW5mbwAmddkgGrNiDWxvY2F0aW9uX2luZm8AgMkmIRqzYhBsb2NhdGlvbl9kZXJpdmVkAADw5xo1s2ILbmVhcmJ5X2luZm8AALjKm1izYgtwbGF5ZXJfaW5mbwDAVfmajLNiDHN0YXJ0ZXJfaW5mbwCA1NncjLNiDHN0cmF0dW1fZGF0YYCVu0ZKjbNiEGVudGl0eV9zdW1tYXJ5W10Aotrm5qrpZQx0YXNrX3Jlc3VsdHMAAAAAANCwaQtjaGVja3N1bTI1NgAAAECE0rBpC2NoZWNrc3VtNTEyAAAAil3TkLoMdGFza19yZXN1bHRzAAAAQO1IsboPcmVzb2x2ZV9yZXN1bHRzAADAUmUXo8IMdGFza19yZXN1bHRzAAAAVy08zc0MdGFza19yZXN1bHRzAAAAAES1zc0MdGFza19yZXN1bHRzAAAAAABQr+EMdGFza19yZXN1bHRz');
|
|
208
|
+
const abiBlob = Blob.from('DmVvc2lvOjphYmkvMS4yAhVCX3ZlY3Rvcl9lbnRpdHlfcmVmX0UMZW50aXR5X3JlZltdDWxvY2F0aW9uX3R5cGUFdWludDhSB2FkdmFuY2UAAgZyZXZlYWwGc3RyaW5nBmNvbW1pdAtjaGVja3N1bTI1NgZjYW5jZWwAAwtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NAVjb3VudAZ1aW50NjQOY2FuY2VsX3Jlc3VsdHMABgllbnRpdHlfaWQGdWludDY0C2VudGl0eV90eXBlBG5hbWUPY2FuY2VsbGVkX2NvdW50BXVpbnQ4EHNjaGVkdWxlX3N0YXJ0ZWQLdGltZV9wb2ludD8LZW50aXR5Z3JvdXAHdWludDY0Pw1ncm91cF9tZW1iZXJzFkJfdmVjdG9yX2VudGl0eV9yZWZfRT8KY2FyZ29faXRlbQADB2l0ZW1faWQGdWludDE2CHF1YW50aXR5BnVpbnQzMgRzZWVkB3VpbnQ2ND8JY2FyZ29fcm93AAUCaWQGdWludDY0CWVudGl0eV9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50NjQIcXVhbnRpdHkGdWludDY0BHNlZWQGdWludDY0CWNsZWFucnN2cAACBWVwb2NoBnVpbnQ2NAhtYXhfcm93cwZ1aW50NjQKY2xlYXJ0YWJsZQADCnRhYmxlX25hbWUEbmFtZQVzY29wZQVuYW1lPwhtYXhfcm93cwd1aW50NjQ/BmNvbW1pdAABBmNvbW1pdAtjaGVja3N1bTI1Ngljb25maWdsb2cAAQZjb25maWcLZ2FtZV9jb25maWcNY29udGFpbmVyX3JvdwAIAmlkBnVpbnQ2NAVvd25lcgRuYW1lBG5hbWUGc3RyaW5nC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCGh1bGxtYXNzBnVpbnQzMghjYXBhY2l0eQZ1aW50MzIJY2FyZ29tYXNzBnVpbnQzMghzY2hlZHVsZQlzY2hlZHVsZT8LY29vcmRpbmF0ZXMAAwF4BWludDY0AXkFaW50NjQBegd1aW50MTY/BWNyYWZ0AAULZW50aXR5X3R5cGUEbmFtZQJpZAZ1aW50NjQJcmVjaXBlX2lkBnVpbnQxNghxdWFudGl0eQZ1aW50MzIGaW5wdXRzDGNhcmdvX2l0ZW1bXQ1jcmFmdGVyX3N0YXRzAAIFc3BlZWQGdWludDE2BWRyYWluBnVpbnQxNgxjcmVhdGVlbnRpdHkABQVvd25lcgRuYW1lC2VudGl0eV90eXBlBG5hbWULZW50aXR5X25hbWUGc3RyaW5nAXgFaW50NjQBeQVpbnQ2NAZkZXBsb3kABQtlbnRpdHlfdHlwZQRuYW1lAmlkBnVpbnQ2NA5wYWNrZWRfaXRlbV9pZAZ1aW50MTYEc2VlZAZ1aW50NjQLZW50aXR5X25hbWUGc3RyaW5nBmVuYWJsZQABB2VuYWJsZWQEYm9vbAxlbmVyZ3lfc3RhdHMAAghjYXBhY2l0eQZ1aW50MTYIcmVjaGFyZ2UGdWludDE2FGVudGl0eV9jdXJyZW50X3N0YXRlAAILY29vcmRpbmF0ZXMLY29vcmRpbmF0ZXMGZW5lcmd5BnVpbnQxNg9lbnRpdHlfZGVmYXVsdHMAEA1zaGlwX2h1bGxtYXNzBnVpbnQzMg1zaGlwX2NhcGFjaXR5BnVpbnQzMgtzaGlwX2VuZXJneQZ1aW50MTYGc2hpcF96BnVpbnQxNgxzaGlwX2VuZ2luZXMObW92ZW1lbnRfc3RhdHMOc2hpcF9nZW5lcmF0b3IMZW5lcmd5X3N0YXRzDHNoaXBfbG9hZGVycwxsb2FkZXJfc3RhdHMOc2hpcF9leHRyYWN0b3IPZXh0cmFjdG9yX3N0YXRzCXNoaXBfd2FycAp3YXJwX3N0YXRzDHNoaXBfY3JhZnRlcg1jcmFmdGVyX3N0YXRzEndhcmVob3VzZV9jYXBhY2l0eQZ1aW50MzILd2FyZWhvdXNlX3oGdWludDE2EXdhcmVob3VzZV9sb2FkZXJzDGxvYWRlcl9zdGF0cxJjb250YWluZXJfaHVsbG1hc3MGdWludDMyEmNvbnRhaW5lcl9jYXBhY2l0eQZ1aW50MzILY29udGFpbmVyX3oGdWludDE2C2VudGl0eV9pbmZvABcEdHlwZQRuYW1lAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwljYXJnb21hc3MGdWludDMyBWNhcmdvDGNhcmdvX2l0ZW1bXQdsb2FkZXJzDWxvYWRlcl9zdGF0cz8GZW5lcmd5B3VpbnQxNj8IaHVsbG1hc3MHdWludDMyPwdlbmdpbmVzD21vdmVtZW50X3N0YXRzPwlnZW5lcmF0b3INZW5lcmd5X3N0YXRzPwhjYXBhY2l0eQd1aW50MzI/CWV4dHJhY3RvchBleHRyYWN0b3Jfc3RhdHM/BHdhcnALd2FycF9zdGF0cz8HY3JhZnRlcg5jcmFmdGVyX3N0YXRzPwdpc19pZGxlBGJvb2wMY3VycmVudF90YXNrBXRhc2s/FGN1cnJlbnRfdGFza19lbGFwc2VkBnVpbnQzMhZjdXJyZW50X3Rhc2tfcmVtYWluaW5nBnVpbnQzMg1wZW5kaW5nX3Rhc2tzBnRhc2tbXQdpZGxlX2F0C3RpbWVfcG9pbnQ/CHNjaGVkdWxlCXNjaGVkdWxlPwplbnRpdHlfcmVmAAILZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0DmVudGl0eV9zdW1tYXJ5AAgEdHlwZQRuYW1lAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2VudGl0eV9uYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwdpc19pZGxlBGJvb2wOcmVzb2x2ZWRfY291bnQGdWludDMyDXBlbmRpbmdfY291bnQGdWludDMyEGVudGl0eV90YXNrX2luZm8ABAllbnRpdHlfaWQGdWludDY0C2VudGl0eV90eXBlBG5hbWUKdGFza19jb3VudAV1aW50OBBzY2hlZHVsZV9zdGFydGVkCnRpbWVfcG9pbnQPZW50aXR5Z3JvdXBfcm93AAICaWQGdWludDY0DHBhcnRpY2lwYW50cwxlbnRpdHlfcmVmW10HZXh0cmFjdAAEC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0B3N0cmF0dW0GdWludDE2CHF1YW50aXR5BnVpbnQzMg9leHRyYWN0b3Jfc3RhdHMABQRyYXRlBnVpbnQxNgVkcmFpbgZ1aW50MTYKZWZmaWNpZW5jeQZ1aW50MTYFZGVwdGgGdWludDE2BWRyaWxsBnVpbnQxNgtnYW1lX2NvbmZpZwADB3ZlcnNpb24GdWludDMyCGRlZmF1bHRzD2VudGl0eV9kZWZhdWx0cwVpdGVtcwppdGVtX2RlZltdCWdldGNvbmZpZwAAC2dldGVudGl0aWVzAAIFb3duZXIEbmFtZQtlbnRpdHlfdHlwZQVuYW1lPwlnZXRlbnRpdHkAAgtlbnRpdHlfdHlwZQRuYW1lCWVudGl0eV9pZAZ1aW50NjQIZ2V0aXRlbXMAAAtnZXRsb2NhdGlvbgACAXgFaW50NjQBeQVpbnQ2NApnZXRsb2NkYXRhAAIBeAVpbnQ2NAF5BWludDY0CWdldG5lYXJieQADC2VudGl0eV90eXBlBG5hbWUJZW50aXR5X2lkBnVpbnQ2NAhyZWNoYXJnZQRib29sCWdldHBsYXllcgABB2FjY291bnQEbmFtZQpnZXRzdGFydGVyAAAKZ2V0c3RyYXR1bQADAXgFaW50NjQBeQVpbnQ2NAdzdHJhdHVtBnVpbnQxNgxnZXRzdW1tYXJpZXMAAgVvd25lcgRuYW1lC2VudGl0eV90eXBlBW5hbWU/C2dyb3VwdHJhdmVsAAQIZW50aXRpZXMMZW50aXR5X3JlZltdAXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sBGhhc2gAAQV2YWx1ZQZzdHJpbmcHaGFzaDUxMgABBXZhbHVlBnN0cmluZwRpbml0AAEEc2VlZAtjaGVja3N1bTI1NghpdGVtX2RlZgACAmlkBnVpbnQxNgRtYXNzBnVpbnQzMgppdGVtc19pbmZvAAEFaXRlbXMKaXRlbV9kZWZbXQRqb2luAAEHYWNjb3VudARuYW1lDGxvYWRlcl9zdGF0cwADBG1hc3MGdWludDMyBnRocnVzdAZ1aW50MTYIcXVhbnRpdHkFdWludDgQbG9jYXRpb25fZGVyaXZlZAADDHN0YXRpY19wcm9wcw9sb2NhdGlvbl9zdGF0aWMLZXBvY2hfcHJvcHMObG9jYXRpb25fZXBvY2gEc2l6ZQZ1aW50MTYObG9jYXRpb25fZXBvY2gAAwZhY3RpdmUEYm9vbAVzZWVkMAV1aW50OAVzZWVkMQV1aW50OA1sb2NhdGlvbl9pbmZvAAIGY29vcmRzC2Nvb3JkaW5hdGVzCWlzX3N5c3RlbQRib29sDGxvY2F0aW9uX3JvdwAGAmlkBnVpbnQ2NAVvd25lcgRuYW1lC2Nvb3JkaW5hdGVzC2Nvb3JkaW5hdGVzCWNhcmdvbWFzcwZ1aW50MzIFY2FyZ28MY2FyZ29faXRlbVtdCHNjaGVkdWxlCXNjaGVkdWxlPw9sb2NhdGlvbl9zdGF0aWMABQZjb29yZHMLY29vcmRpbmF0ZXMEdHlwZQ1sb2NhdGlvbl90eXBlB3N1YnR5cGUFdWludDgFc2VlZDAFdWludDgFc2VlZDEFdWludDgObW92ZW1lbnRfc3RhdHMAAgZ0aHJ1c3QGdWludDMyBWRyYWluBnVpbnQxNgtuZWFyYnlfaW5mbwAFCmNhbl90cmF2ZWwEYm9vbAdjdXJyZW50FGVudGl0eV9jdXJyZW50X3N0YXRlCXByb2plY3RlZBRlbnRpdHlfY3VycmVudF9zdGF0ZQptYXhfZW5lcmd5BnVpbnQxNgdzeXN0ZW1zD25lYXJieV9zeXN0ZW1bXQ1uZWFyYnlfc3lzdGVtAAQIZGlzdGFuY2UGdWludDY0C2VuZXJneV9jb3N0BnVpbnQ2NAtmbGlnaHRfdGltZQZ1aW50MzIIbG9jYXRpb24NbG9jYXRpb25faW5mbwZub3RpZnkAAQVldmVudAp0YXNrX2V2ZW50C3BsYXllcl9pbmZvAAYFb3duZXIEbmFtZQlpc19wbGF5ZXIEYm9vbAxjb21wYW55X25hbWUGc3RyaW5nCnNoaXBfY291bnQGdWludDY0D3dhcmVob3VzZV9jb3VudAZ1aW50NjQPY29udGFpbmVyX2NvdW50BnVpbnQ2NApwbGF5ZXJfcm93AAEFb3duZXIEbmFtZQhyZWNoYXJnZQACC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0C3Jlc2VydmVfcm93AAICaWQGdWludDY0CXJlbWFpbmluZwZ1aW50MzIHcmVzb2x2ZQADC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0BWNvdW50B3VpbnQ2ND8PcmVzb2x2ZV9yZXN1bHRzAAYJZW50aXR5X2lkBnVpbnQ2NAtlbnRpdHlfdHlwZQRuYW1lDnJlc29sdmVkX2NvdW50BXVpbnQ4FG5ld19zY2hlZHVsZV9zdGFydGVkC3RpbWVfcG9pbnQ/C2VudGl0eWdyb3VwB3VpbnQ2ND8NZ3JvdXBfbWVtYmVycxZCX3ZlY3Rvcl9lbnRpdHlfcmVmX0U/DnJlc291cmNlX3N0YXRzAAMFc3RhdDEGdWludDE2BXN0YXQyBnVpbnQxNgVzdGF0MwZ1aW50MTYEc2FsdAABBHNhbHQGdWludDY0CHNjaGVkdWxlAAIHc3RhcnRlZAp0aW1lX3BvaW50BXRhc2tzBnRhc2tbXQxzZXF1ZW5jZV9yb3cAAgNrZXkEbmFtZQV2YWx1ZQZ1aW50NjQIc2hpcF9yb3cADwJpZAZ1aW50NjQFb3duZXIEbmFtZQRuYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwhodWxsbWFzcwZ1aW50MzIIY2FwYWNpdHkGdWludDMyBmVuZXJneQZ1aW50MTYJY2FyZ29tYXNzBnVpbnQzMgdlbmdpbmVzDm1vdmVtZW50X3N0YXRzCWdlbmVyYXRvcgxlbmVyZ3lfc3RhdHMHbG9hZGVycwxsb2FkZXJfc3RhdHMJZXh0cmFjdG9yEGV4dHJhY3Rvcl9zdGF0cz8Ed2FycAt3YXJwX3N0YXRzPwdjcmFmdGVyDmNyYWZ0ZXJfc3RhdHM/CHNjaGVkdWxlCXNjaGVkdWxlPwpzcGF3bmNhcmdvAAMJZW50aXR5X2lkBnVpbnQ2NAdpdGVtX2lkBnVpbnQ2NAhxdWFudGl0eQZ1aW50NjQMc3RhcnRlcl9pbmZvAAEEc2hpcAtlbnRpdHlfaW5mbwlzdGF0ZV9yb3cABgdlbmFibGVkBGJvb2wFZXBvY2gGdWludDMyBHNhbHQGdWludDY0BXNoaXBzBnVpbnQzMgRzZWVkC2NoZWNrc3VtMjU2BmNvbW1pdAtjaGVja3N1bTI1NgxzdHJhdHVtX2RhdGEAAgdzdHJhdHVtDHN0cmF0dW1faW5mbwVzdGF0cw5yZXNvdXJjZV9zdGF0cwxzdHJhdHVtX2luZm8ABAdpdGVtX2lkBnVpbnQxNgRzZWVkBnVpbnQ2NAhyaWNobmVzcwZ1aW50MTYHcmVzZXJ2ZQZ1aW50MzIEdGFzawAIBHR5cGUFdWludDgIZHVyYXRpb24GdWludDMyCmNhbmNlbGFibGUFdWludDgLY29vcmRpbmF0ZXMMY29vcmRpbmF0ZXM/BWNhcmdvDGNhcmdvX2l0ZW1bXQxlbnRpdHl0YXJnZXQLZW50aXR5X3JlZj8LZW50aXR5Z3JvdXAHdWludDY0PwtlbmVyZ3lfY29zdAd1aW50MTY/CnRhc2tfZXZlbnQACQpldmVudF90eXBlBXVpbnQ4BW93bmVyBG5hbWULZW50aXR5X3R5cGUEbmFtZQllbnRpdHlfaWQGdWludDY0CnRhc2tfaW5kZXgFdWludDgEdGFzawR0YXNrCXN0YXJ0c19hdAp0aW1lX3BvaW50DGNvbXBsZXRlc19hdAp0aW1lX3BvaW50Cm5ld19lbmVyZ3kHdWludDE2Pwx0YXNrX3Jlc3VsdHMAAQhlbnRpdGllcxJlbnRpdHlfdGFza19pbmZvW10IdHJhbnNmZXIABgtzb3VyY2VfdHlwZQRuYW1lCXNvdXJjZV9pZAZ1aW50NjQJZGVzdF90eXBlBG5hbWUHZGVzdF9pZAZ1aW50NjQHaXRlbV9pZAZ1aW50MTYIcXVhbnRpdHkGdWludDMyBnRyYXZlbAAFC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAhyZWNoYXJnZQRib29sCXR5cGVzX3JvdwAEAmlkBnVpbnQ2NBNlbnRpdHlfc3VtbWFyeV90eXBlDmVudGl0eV9zdW1tYXJ5EXN0YXJ0ZXJfaW5mb190eXBlDHN0YXJ0ZXJfaW5mbxBnYW1lX2NvbmZpZ190eXBlC2dhbWVfY29uZmlnDXdhcmVob3VzZV9yb3cACAJpZAZ1aW50NjQFb3duZXIEbmFtZQRuYW1lBnN0cmluZwtjb29yZGluYXRlcwtjb29yZGluYXRlcwhjYXBhY2l0eQZ1aW50MzIJY2FyZ29tYXNzBnVpbnQzMgdsb2FkZXJzDGxvYWRlcl9zdGF0cwhzY2hlZHVsZQlzY2hlZHVsZT8Ed2FycAAEC2VudGl0eV90eXBlBG5hbWUCaWQGdWludDY0AXgFaW50NjQBeQVpbnQ2NAp3YXJwX3N0YXRzAAEFcmFuZ2UGdWludDMyBHdpcGUAAAx3aXBlc2VxdWVuY2UAACUAAABAoWl2MgdhZHZhbmNl0wEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogYWR2YW5jZQpzdW1tYXJ5OiAnQWR2YW5jZSB0dXJuJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpBZHZhbmNlIHRoZSBnYW1lIHRvIHRoZSBuZXh0IHR1cm4uAAAAAESFpkEGY2FuY2VsxwItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogY2FuY2VsCnN1bW1hcnk6ICdDYW5jZWwgc2NoZWR1bGVkIHRhc2tzJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpDYW5jZWwgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGFza3MgZnJvbSB0aGUgZW5kIG9mIGFuIGVudGl0eSdzIHNjaGVkdWxlLiBUYXNrcyB0aGF0IGFyZSBpbW11dGFibGUgYW5kIGluIHByb2dyZXNzIGNhbm5vdCBiZSBjYW5jZWxsZWQuCgotLS0AAKgb32lURAljbGVhbnJzdnAAAICKx+RrVEQKY2xlYXJ0YWJsZb4BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNsZWFydGFibGUKc3VtbWFyeTogJ0RFQlVHOiBjbGVhcnRhYmxlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQAAAABkJyVFBmNvbW1pdPEBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGNvbW1pdApzdW1tYXJ5OiAnU2V0IGNvbW1pdCB2YWx1ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKU2V0IHRoZSBpbml0aWFsIGNvbW1pdCB2YWx1ZSBkdXJpbmcgZ2FtZSBpbml0aWFsaXphdGlvbi4KCi0tLQAAYDQytyZFCWNvbmZpZ2xvZwAAAAAAgLzMRQVjcmFmdADgs8tTqWzURQxjcmVhdGVlbnRpdHkAAAAAAHgaq0oGZGVwbG95AAAAAACoeMxUBmVuYWJsZeIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGVuYWJsZQpzdW1tYXJ5OiAnU2V0IGVuYWJsZWQgc3RhdGUnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkVuYWJsZSBvciBkaXNhYmxlIHRoaXMgZ2FtZSBvZiBTaGlwbG9hZC4KCi0tLQAAACAjc3NXB2V4dHJhY3ShAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBleHRyYWN0CnN1bW1hcnk6ICdFeHRyYWN0IHJlc291cmNlcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKRXh0cmFjdCByZXNvdXJjZXMgYXQgdGhlIHNoaXAncyBjdXJyZW50IGxvY2F0aW9uLiBPbmx5IHdvcmtzIGF0IGV4dHJhY3RhYmxlIGxvY2F0aW9uIHR5cGVzLiBTY2hlZHVsZXMgYW4gZXh0cmFjdGlvbiB0YXNrIHRoYXQgY29uc3VtZXMgZW5lcmd5IGFuZCB5aWVsZHMgY2FyZ28gYmFzZWQgb24gdGhlIHNoaXAncyBleHRyYWN0b3Igc3RhdHMgYW5kIHRoZSBsb2NhdGlvbidzIHJlc291cmNlIGNvbXBvc2l0aW9uLgAAYG5NirJiCWdldGNvbmZpZwAAsHLZ5amyYgtnZXRlbnRpdGllc6QCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0aWVzCnN1bW1hcnk6ICdHZXQgYWxsIGVudGl0aWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBmdWxsIGVudGl0eSBpbmZvIGZvciBhbGwgZW50aXRpZXMgb3duZWQgYnkgYSBwbGF5ZXIuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgAA8NnlqbJiCWdldGVudGl0eaICLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGVudGl0eQpzdW1tYXJ5OiAnR2V0IGVudGl0eSBzdGF0ZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhbiBlbnRpdHkgaW5jbHVkaW5nIGlkZW50aXR5LCBjYXJnbywgc2NoZWR1bGUgc3RhdGUsIGFuZCB0eXBlLXNwZWNpZmljIGZpZWxkcy4AAABYquyyYghnZXRpdGVtc5oCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGdldGl0ZW1zCnN1bW1hcnk6ICdHZXQgYWxsIGF2YWlsYWJsZSBpdGVtcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVGhpcyBhY3Rpb24gcmV0dXJucyBhIGxpc3Qgb2YgYWxsIGl0ZW1zIGluIHRoZSBnYW1lIGluY2x1ZGluZyB0aGVpciBpZCwgYmFzZSBwcmljZSwgYW5kIG1hc3MuACZ12SAas2ILZ2V0bG9jYXRpb27iAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NhdGlvbgpzdW1tYXJ5OiAnR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IGEgbG9jYXRpb24gaW5jbHVkaW5nIHdoZXRoZXIgYSBzeXN0ZW0gZXhpc3RzLCBhbmQgZm9yIGVhY2ggaXRlbTogcHJpY2UsIHN1cHBseSwgcmFyaXR5IG11bHRpcGxpZXIsIGFuZCBsb2NhdGlvbiBtdWx0aXBsaWVyLgCAySYhGrNiCmdldGxvY2RhdGH+Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRsb2NkYXRhCnN1bW1hcnk6ICdHZXQgZGVyaXZlZCBsb2NhdGlvbiBkYXRhJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIGRlcml2ZWQgbG9jYXRpb24gZGF0YSBpbmNsdWRpbmcgc3RhdGljIHByb3BlcnRpZXMgKHR5cGUsIGRpZmZpY3VsdHksIHNlZWRzKSBmcm9tIHRoZSBnYW1lIHNlZWQgYW5kIGVwb2NoLXNwZWNpZmljIHByb3BlcnRpZXMgKGFjdGl2ZSwgc2VlZHMpIGZyb20gdGhlIGN1cnJlbnQgZXBvY2ggc2VlZC4AAPDnGjWzYglnZXRuZWFyYnneAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRuZWFyYnkKc3VtbWFyeTogJ0dldCBuZWFyYnkgcmVhY2hhYmxlIHN5c3RlbXMnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgbmVhcmJ5IHN5c3RlbXMgcmVhY2hhYmxlIGJ5IGFuIGVudGl0eSBmcm9tIGl0cyBwcm9qZWN0ZWQgbG9jYXRpb24uIFJldHVybnMgY3VycmVudCBzdGF0ZSAod2l0aCBjb21wbGV0ZWQgdGFza3MgcmVzb2x2ZWQpLCBwcm9qZWN0ZWQgc3RhdGUgKGFmdGVyIGFsbCBzY2hlZHVsZWQgdGFza3MpLCBhbmQgYSBsaXN0IG9mIHJlYWNoYWJsZSBzeXN0ZW1zIHdpdGggZGlzdGFuY2UsIGVuZXJneSBjb3N0LCBmbGlnaHQgdGltZSwgYW5kIG1hcmtldCBpbmZvcm1hdGlvbi4AALjKm1izYglnZXRwbGF5ZXL9Ai0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRwbGF5ZXIKc3VtbWFyeTogJ0dldCBwbGF5ZXIgaW5mb3JtYXRpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClRoaXMgYWN0aW9uIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwbGF5ZXIgaW5jbHVkaW5nIGJhbGFuY2UsIGRlYnQsIG5ldHdvcnRoLCBlbnRpdHkgY291bnRzLCBhbmQgcHJpY2luZyBmb3IgbmV4dCBwdXJjaGFzZXMuIFJldHVybnMgaXNfcGxheWVyPWZhbHNlIGlmIHRoZSBhY2NvdW50IGhhcyBub3Qgam9pbmVkIHRoZSBnYW1lLgDAVfmajLNiCmdldHN0YXJ0ZXKFAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdGFydGVyCnN1bW1hcnk6ICdHZXQgc3RhcnRlciBzaGlwIGFuZCBiYWxhbmNlIGluZm9ybWF0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpUaGlzIGFjdGlvbiByZXR1cm5zIHRoZSBzdGFydGVyIHNoaXAgc3RhdHMgYW5kIGluaXRpYWwgYmFsYW5jZSBhIG5ldyBwbGF5ZXIgd291bGQgcmVjZWl2ZSB1cG9uIGpvaW5pbmcuIFVzZWQgZm9yIG9uYm9hcmRpbmcgVUkgdG8gZGlzcGxheSB3aGF0IHBsYXllcnMgd2lsbCBnZXQgYmVmb3JlIHRoZXkgcmVnaXN0ZXIuAIDU2dyMs2IKZ2V0c3RyYXR1bQCAlbtGSo2zYgxnZXRzdW1tYXJpZXPoAi0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBnZXRzdW1tYXJpZXMKc3VtbWFyeTogJ0dldCBlbnRpdHkgc3VtbWFyaWVzIGZvciBhIHBsYXllcicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKUmV0dXJucyBsaWdodHdlaWdodCBzdW1tYXJpZXMgb2YgYWxsIGVudGl0aWVzIG93bmVkIGJ5IGEgcGxheWVyIGluY2x1ZGluZyB0eXBlLCBpZCwgb3duZXIsIG5hbWUsIGxvY2F0aW9uLCBhbmQgaWRsZSBzdGF0dXMuIE9wdGlvbmFsbHkgZmlsdGVyIGJ5IGVudGl0eSB0eXBlLgCi2ubmqullC2dyb3VwdHJhdmVsmgQtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogZ3JvdXB0cmF2ZWwKc3VtbWFyeTogJ01vdmUgbXVsdGlwbGUgZW50aXRpZXMgdG9nZXRoZXInCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIGdyb3VwIHRyYXZlbCBmb3IgbXVsdGlwbGUgZW50aXRpZXMgdG8gYSBkZXN0aW5hdGlvbi4gQWxsIGVudGl0aWVzIG11c3QgYmUgYXQgdGhlIHNhbWUgbG9jYXRpb24gYW5kIG93bmVkIGJ5IHRoZSBjYWxsZXIuIEF0IGxlYXN0IG9uZSBlbnRpdHkgd2l0aCBlbmdpbmVzIGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhydXN0LiBGbGlnaHQgZHVyYXRpb24gaXMgY2FsY3VsYXRlZCBmcm9tIGNvbWJpbmVkIHRocnVzdCBhbmQgdG90YWwgbWFzcyBvZiBhbGwgZW50aXRpZXMuIENyZWF0ZXMgYW4gZW50aXR5Z3JvdXAgZm9yIGF0b21pYyByZXNvbHV0aW9uIGFuZCBjYW5jZWxsYXRpb24uAAAAAADQsGkEaGFzaP0BLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGhhc2gKc3VtbWFyeTogJ0NhbGN1bGF0ZSBzaGEyNTYgaGFzaCcKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKQ2FsY3VsYXRlcyB0aGUgc2hhMjU2IGhhc2ggb2YgYSBzdHJpbmcgYmFzZWQgdXNpbmcgdGhlIGdhbWUgc2VlZC4KCi0tLQAAAECE0rBpB2hhc2g1MTL7AS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBoYXNoNTEyCnN1bW1hcnk6ICdDYWxjdWxhdGUgc2hhNTEyIGhhc2gnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkNhbGN1bGF0ZXMgdGhlIHNoYTUxMiBoYXNoIG9mIGEgc3RyaW5nIGJhc2VkIHVzaW5nIHRoZSBnYW1lIHNlZWQuAAAAAACQ3XQEaW5pdPoBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IGluaXQKc3VtbWFyeTogJ0luaXRpYWxpemUgZ2FtZSBzZWVkJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbml0aWFsaXplIGEgdGhlIGdhbWVzIHNlZWQgYW5kIHNlZWQgdmFsdWVzIHRvIGJvb3RzdHJhcCBnYW1lIHN0YXRlLgAAAAAAMB19BGpvaW7JAS0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBqb2luCnN1bW1hcnk6ICdKb2luIGEgZ2FtZScKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKSm9pbiBhIGdhbWUgb2YgU2hpcGxvYWQKCi0tLQAAAAD45TKdBm5vdGlmeYoDLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IG5vdGlmeQpzdW1tYXJ5OiAnVGFzayBsaWZlY3ljbGUgbm90aWZpY2F0aW9uJwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpJbnRlcm5hbCBhY3Rpb24gdGhhdCBub3RpZmllcyBlbnRpdHkgb3duZXJzIG9mIHRhc2sgbGlmZWN5Y2xlIGV2ZW50cyAocmVzb2x2ZWQsIGNhbmNlbGxlZCkuIENhbGxlZCBpbmxpbmUgd2hlbiB0YXNrcyBjaGFuZ2Ugc3RhdGUuIFVzZXMgcmVxdWlyZV9yZWNpcGllbnQgdG8gZW5hYmxlIG9mZi1jaGFpbiBtb25pdG9yaW5nIHZpYSBhY3Rpb24gdHJhY2VzLgAAAIpd05C6CHJlY2hhcmdl0gItLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogcmVjaGFyZ2UKc3VtbWFyeTogJ1JlY2hhcmdlIHNoaXAgZW5lcmd5JwppY29uOiBodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTQ3MjkyODYxP3M9NDAwJnU9M2IxYWY2NmU5MGRkODUxZjRkN2MwOTZlZDZhMmZiYjRiOWUxOTBkYQoKLS0tCgpTY2hlZHVsZSBhIHJlY2hhcmdlIHRhc2sgZm9yIGFuIGVudGl0eSB0byByZXN0b3JlIGVuZXJneSB0byBmdWxsIGNhcGFjaXR5LiBUaGUgcmVjaGFyZ2UgZHVyYXRpb24gZGVwZW5kcyBvbiBjdXJyZW50IGVuZXJneSBsZXZlbCBhbmQgcmVjaGFyZ2UgcmF0ZS4KCi0tLQAAAEDtSLG6B3Jlc29sdmXVAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiByZXNvbHZlCnN1bW1hcnk6ICdDb21wbGV0ZSBzY2hlZHVsZWQgdGFza3MnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KClJlc29sdmUgY29tcGxldGVkIHRhc2tzIGluIGFuIGVudGl0eSdzIHNjaGVkdWxlLCBhcHBseWluZyB0aGVpciBlZmZlY3RzIChyZWNoYXJnZSBlbmVyZ3ksIHVwZGF0ZSBsb2NhdGlvbiwgbG9hZC91bmxvYWQgY2FyZ28pLiBJZiBjb3VudCBpcyBzcGVjaWZpZWQsIHJlc29sdmUgZXhhY3RseSB0aGF0IG1hbnkgdGFza3M7IG90aGVyd2lzZSByZXNvbHZlIGFsbCBjb21wbGV0ZWQgdGFza3MuIEZhaWxzIGlmIGNvdW50IGV4Y2VlZHMgdGhlIG51bWJlciBvZiBjb21wbGV0ZWQgdGFza3MuCgotLS0AAAAAAJCjwQRzYWx03QEtLS0KCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogc2FsdApzdW1tYXJ5OiAnQXBwZW5kIFNhbHQnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkFkZCBhZGRpdGlvbmFsIHNhbHQgdG8gdGhlIG5leHQgZXBvY2ggc2VlZC4KCi0tLQAAZdegyU3FCnNwYXduY2FyZ28AAAAAVy08zc0IdHJhbnNmZXLIAy0tLQoKc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiB0cmFuc2ZlcgpzdW1tYXJ5OiAnVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiBlbnRpdGllcycKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLQoKVHJhbnNmZXIgY2FyZ28gYmV0d2VlbiB0d28gZW50aXRpZXMgYXQgdGhlIHNhbWUgbG9jYXRpb24uIEJvdGggZW50aXRpZXMgbXVzdCBiZSBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBhdCBsZWFzdCBvbmUgbXVzdCBoYXZlIGxvYWRlcnMuIENyZWF0ZXMgbG9hZCBhbmQgdW5sb2FkIHRhc2tzIG9uIGJvdGggZW50aXRpZXMgd2l0aCBkdXJhdGlvbiBiYXNlZCBvbiBjb21iaW5lZCBsb2FkZXIgY2FwYWNpdHkgYW5kIFotZGlzdGFuY2UgYmV0d2VlbiB0aGVtLgAAAABEtc3NBnRyYXZlbMsCLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHRyYXZlbApzdW1tYXJ5OiAnTW92ZSBhIHNoaXAnCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0KCkluaXRpYXRlIHRyYXZlbCBvZiBhbiBlbnRpdHkgZnJvbSBpdHMgY3VycmVudCBsb2NhdGlvbiB0byBhIG5ldyBkZXN0aW5hdGlvbi4KCi0tLQoKVGhpcyBhY3Rpb24gZGV0ZXJtaW5lcyB0aGUgbWFya2V0IHByaWNlIG9mIGFsbCBpdGVtcyBhdCBhIGdpdmVuIGxvY2F0aW9uLgAAAAAAUK/hBHdhcnAAAAAAAACgquMEd2lwZbIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGUKc3VtbWFyeTogJ0RFQlVHOiB3aXBlIGFjdGlvbicKaWNvbjogaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE0NzI5Mjg2MT9zPTQwMCZ1PTNiMWFmNjZlOTBkZDg1MWY0ZDdjMDk2ZWQ2YTJmYmI0YjllMTkwZGEKCi0tLaDQVNoqrKrjDHdpcGVzZXF1ZW5jZcIBLS0tCgpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IHdpcGVzZXF1ZW5jZQpzdW1tYXJ5OiAnREVCVUc6IHdpcGVzZXF1ZW5jZSBhY3Rpb24nCmljb246IGh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xNDcyOTI4NjE/cz00MDAmdT0zYjFhZjY2ZTkwZGQ4NTFmNGQ3YzA5NmVkNmEyZmJiNGI5ZTE5MGRhCgotLS0LAAAAAADKrkEDaTY0AAAJY2FyZ29fcm93AAC4ajqTJ0UDaTY0AAANY29udGFpbmVyX3JvdwCqppf57PJUA2k2NAAAD2VudGl0eWdyb3VwX3JvdwAAAJO6bBCNA2k2NAAADGxvY2F0aW9uX3JvdwAAAABc5U2sA2k2NAAACnBsYXllcl9yb3cAAABA7auwugNpNjQAAAtyZXNlcnZlX3JvdwAAAApNpa3CA2k2NAAADHNlcXVlbmNlX3JvdwAAAAAAUF3DA2k2NAAACHNoaXBfcm93AAAAAACVTcYDaTY0AAAJc3RhdGVfcm93AAAAAACsqs8DaTY0AAAJdHlwZXNfcm93AABQWNOmruEDaTY0AAANd2FyZWhvdXNlX3JvdwERU2hpcGxvYWQgKFNlcnZlcikRU2hpcGxvYWQgKFNlcnZlcikAAAAXAAAAAESFpkEOY2FuY2VsX3Jlc3VsdHMAAAAAgLzMRQx0YXNrX3Jlc3VsdHMAAAAAeBqrSgx0YXNrX3Jlc3VsdHMAAAAgI3NzVwx0YXNrX3Jlc3VsdHMAAGBuTYqyYgtnYW1lX2NvbmZpZwCwctnlqbJiDWVudGl0eV9pbmZvW10AAPDZ5amyYgtlbnRpdHlfaW5mbwAAAFiq7LJiCml0ZW1zX2luZm8AJnXZIBqzYg1sb2NhdGlvbl9pbmZvAIDJJiEas2IQbG9jYXRpb25fZGVyaXZlZAAA8OcaNbNiC25lYXJieV9pbmZvAAC4yptYs2ILcGxheWVyX2luZm8AwFX5moyzYgxzdGFydGVyX2luZm8AgNTZ3IyzYgxzdHJhdHVtX2RhdGGAlbtGSo2zYhBlbnRpdHlfc3VtbWFyeVtdAKLa5uaq6WUMdGFza19yZXN1bHRzAAAAAADQsGkLY2hlY2tzdW0yNTYAAABAhNKwaQtjaGVja3N1bTUxMgAAAIpd05C6DHRhc2tfcmVzdWx0cwAAAEDtSLG6D3Jlc29sdmVfcmVzdWx0cwAAAFctPM3NDHRhc2tfcmVzdWx0cwAAAABEtc3NDHRhc2tfcmVzdWx0cwAAAAAAUK/hDHRhc2tfcmVzdWx0cw==');
|
|
209
209
|
const abi = ABI.from(abiBlob);
|
|
210
210
|
var Types;
|
|
211
211
|
(function (Types) {
|
|
@@ -221,66 +221,6 @@ var Types;
|
|
|
221
221
|
Struct.type('advance')
|
|
222
222
|
], advance);
|
|
223
223
|
Types.advance = advance;
|
|
224
|
-
let buycontainer = class buycontainer extends Struct {
|
|
225
|
-
};
|
|
226
|
-
__decorate([
|
|
227
|
-
Struct.field(Name)
|
|
228
|
-
], buycontainer.prototype, "account", void 0);
|
|
229
|
-
__decorate([
|
|
230
|
-
Struct.field(UInt64)
|
|
231
|
-
], buycontainer.prototype, "ship_id", void 0);
|
|
232
|
-
__decorate([
|
|
233
|
-
Struct.field('string')
|
|
234
|
-
], buycontainer.prototype, "name", void 0);
|
|
235
|
-
buycontainer = __decorate([
|
|
236
|
-
Struct.type('buycontainer')
|
|
237
|
-
], buycontainer);
|
|
238
|
-
Types.buycontainer = buycontainer;
|
|
239
|
-
let buyitems = class buyitems extends Struct {
|
|
240
|
-
};
|
|
241
|
-
__decorate([
|
|
242
|
-
Struct.field(Name)
|
|
243
|
-
], buyitems.prototype, "entity_type", void 0);
|
|
244
|
-
__decorate([
|
|
245
|
-
Struct.field(UInt64)
|
|
246
|
-
], buyitems.prototype, "id", void 0);
|
|
247
|
-
__decorate([
|
|
248
|
-
Struct.field(UInt16)
|
|
249
|
-
], buyitems.prototype, "item_id", void 0);
|
|
250
|
-
__decorate([
|
|
251
|
-
Struct.field(UInt32)
|
|
252
|
-
], buyitems.prototype, "quantity", void 0);
|
|
253
|
-
buyitems = __decorate([
|
|
254
|
-
Struct.type('buyitems')
|
|
255
|
-
], buyitems);
|
|
256
|
-
Types.buyitems = buyitems;
|
|
257
|
-
let buyship = class buyship extends Struct {
|
|
258
|
-
};
|
|
259
|
-
__decorate([
|
|
260
|
-
Struct.field(Name)
|
|
261
|
-
], buyship.prototype, "account", void 0);
|
|
262
|
-
__decorate([
|
|
263
|
-
Struct.field('string')
|
|
264
|
-
], buyship.prototype, "name", void 0);
|
|
265
|
-
buyship = __decorate([
|
|
266
|
-
Struct.type('buyship')
|
|
267
|
-
], buyship);
|
|
268
|
-
Types.buyship = buyship;
|
|
269
|
-
let buywarehouse = class buywarehouse extends Struct {
|
|
270
|
-
};
|
|
271
|
-
__decorate([
|
|
272
|
-
Struct.field(Name)
|
|
273
|
-
], buywarehouse.prototype, "account", void 0);
|
|
274
|
-
__decorate([
|
|
275
|
-
Struct.field(UInt64)
|
|
276
|
-
], buywarehouse.prototype, "ship_id", void 0);
|
|
277
|
-
__decorate([
|
|
278
|
-
Struct.field('string')
|
|
279
|
-
], buywarehouse.prototype, "name", void 0);
|
|
280
|
-
buywarehouse = __decorate([
|
|
281
|
-
Struct.type('buywarehouse')
|
|
282
|
-
], buywarehouse);
|
|
283
|
-
Types.buywarehouse = buywarehouse;
|
|
284
224
|
let cancel = class cancel extends Struct {
|
|
285
225
|
};
|
|
286
226
|
__decorate([
|
|
@@ -340,9 +280,6 @@ var Types;
|
|
|
340
280
|
__decorate([
|
|
341
281
|
Struct.field(UInt32)
|
|
342
282
|
], cargo_item.prototype, "quantity", void 0);
|
|
343
|
-
__decorate([
|
|
344
|
-
Struct.field(UInt64)
|
|
345
|
-
], cargo_item.prototype, "unit_cost", void 0);
|
|
346
283
|
__decorate([
|
|
347
284
|
Struct.field(UInt64, { optional: true })
|
|
348
285
|
], cargo_item.prototype, "seed", void 0);
|
|
@@ -364,9 +301,6 @@ var Types;
|
|
|
364
301
|
__decorate([
|
|
365
302
|
Struct.field(UInt64)
|
|
366
303
|
], cargo_row.prototype, "quantity", void 0);
|
|
367
|
-
__decorate([
|
|
368
|
-
Struct.field(UInt64)
|
|
369
|
-
], cargo_row.prototype, "unit_cost", void 0);
|
|
370
304
|
__decorate([
|
|
371
305
|
Struct.field(UInt64)
|
|
372
306
|
], cargo_row.prototype, "seed", void 0);
|
|
@@ -449,15 +383,6 @@ var Types;
|
|
|
449
383
|
Struct.type('loader_stats')
|
|
450
384
|
], loader_stats);
|
|
451
385
|
Types.loader_stats = loader_stats;
|
|
452
|
-
let trade_stats = class trade_stats extends Struct {
|
|
453
|
-
};
|
|
454
|
-
__decorate([
|
|
455
|
-
Struct.field(UInt16)
|
|
456
|
-
], trade_stats.prototype, "margin", void 0);
|
|
457
|
-
trade_stats = __decorate([
|
|
458
|
-
Struct.type('trade_stats')
|
|
459
|
-
], trade_stats);
|
|
460
|
-
Types.trade_stats = trade_stats;
|
|
461
386
|
let extractor_stats = class extractor_stats extends Struct {
|
|
462
387
|
};
|
|
463
388
|
__decorate([
|
|
@@ -488,6 +413,18 @@ var Types;
|
|
|
488
413
|
Struct.type('warp_stats')
|
|
489
414
|
], warp_stats);
|
|
490
415
|
Types.warp_stats = warp_stats;
|
|
416
|
+
let crafter_stats = class crafter_stats extends Struct {
|
|
417
|
+
};
|
|
418
|
+
__decorate([
|
|
419
|
+
Struct.field(UInt16)
|
|
420
|
+
], crafter_stats.prototype, "speed", void 0);
|
|
421
|
+
__decorate([
|
|
422
|
+
Struct.field(UInt16)
|
|
423
|
+
], crafter_stats.prototype, "drain", void 0);
|
|
424
|
+
crafter_stats = __decorate([
|
|
425
|
+
Struct.type('crafter_stats')
|
|
426
|
+
], crafter_stats);
|
|
427
|
+
Types.crafter_stats = crafter_stats;
|
|
491
428
|
let entity_defaults = class entity_defaults extends Struct {
|
|
492
429
|
};
|
|
493
430
|
__decorate([
|
|
@@ -511,15 +448,15 @@ var Types;
|
|
|
511
448
|
__decorate([
|
|
512
449
|
Struct.field(loader_stats)
|
|
513
450
|
], entity_defaults.prototype, "ship_loaders", void 0);
|
|
514
|
-
__decorate([
|
|
515
|
-
Struct.field(trade_stats)
|
|
516
|
-
], entity_defaults.prototype, "ship_trade", void 0);
|
|
517
451
|
__decorate([
|
|
518
452
|
Struct.field(extractor_stats)
|
|
519
453
|
], entity_defaults.prototype, "ship_extractor", void 0);
|
|
520
454
|
__decorate([
|
|
521
455
|
Struct.field(warp_stats)
|
|
522
456
|
], entity_defaults.prototype, "ship_warp", void 0);
|
|
457
|
+
__decorate([
|
|
458
|
+
Struct.field(crafter_stats)
|
|
459
|
+
], entity_defaults.prototype, "ship_crafter", void 0);
|
|
523
460
|
__decorate([
|
|
524
461
|
Struct.field(UInt32)
|
|
525
462
|
], entity_defaults.prototype, "warehouse_capacity", void 0);
|
|
@@ -547,9 +484,6 @@ var Types;
|
|
|
547
484
|
__decorate([
|
|
548
485
|
Struct.field(UInt16)
|
|
549
486
|
], item_def.prototype, "id", void 0);
|
|
550
|
-
__decorate([
|
|
551
|
-
Struct.field(UInt32)
|
|
552
|
-
], item_def.prototype, "base_price", void 0);
|
|
553
487
|
__decorate([
|
|
554
488
|
Struct.field(UInt32)
|
|
555
489
|
], item_def.prototype, "mass", void 0);
|
|
@@ -619,9 +553,6 @@ var Types;
|
|
|
619
553
|
__decorate([
|
|
620
554
|
Struct.field(UInt64, { optional: true })
|
|
621
555
|
], task.prototype, "entitygroup", void 0);
|
|
622
|
-
__decorate([
|
|
623
|
-
Struct.field(Int64, { optional: true })
|
|
624
|
-
], task.prototype, "credits", void 0);
|
|
625
556
|
__decorate([
|
|
626
557
|
Struct.field(UInt16, { optional: true })
|
|
627
558
|
], task.prototype, "energy_cost", void 0);
|
|
@@ -671,6 +602,69 @@ var Types;
|
|
|
671
602
|
Struct.type('container_row')
|
|
672
603
|
], container_row);
|
|
673
604
|
Types.container_row = container_row;
|
|
605
|
+
let craft = class craft extends Struct {
|
|
606
|
+
};
|
|
607
|
+
__decorate([
|
|
608
|
+
Struct.field(Name)
|
|
609
|
+
], craft.prototype, "entity_type", void 0);
|
|
610
|
+
__decorate([
|
|
611
|
+
Struct.field(UInt64)
|
|
612
|
+
], craft.prototype, "id", void 0);
|
|
613
|
+
__decorate([
|
|
614
|
+
Struct.field(UInt16)
|
|
615
|
+
], craft.prototype, "recipe_id", void 0);
|
|
616
|
+
__decorate([
|
|
617
|
+
Struct.field(UInt32)
|
|
618
|
+
], craft.prototype, "quantity", void 0);
|
|
619
|
+
__decorate([
|
|
620
|
+
Struct.field(cargo_item, { array: true })
|
|
621
|
+
], craft.prototype, "inputs", void 0);
|
|
622
|
+
craft = __decorate([
|
|
623
|
+
Struct.type('craft')
|
|
624
|
+
], craft);
|
|
625
|
+
Types.craft = craft;
|
|
626
|
+
let createentity = class createentity extends Struct {
|
|
627
|
+
};
|
|
628
|
+
__decorate([
|
|
629
|
+
Struct.field(Name)
|
|
630
|
+
], createentity.prototype, "owner", void 0);
|
|
631
|
+
__decorate([
|
|
632
|
+
Struct.field(Name)
|
|
633
|
+
], createentity.prototype, "entity_type", void 0);
|
|
634
|
+
__decorate([
|
|
635
|
+
Struct.field('string')
|
|
636
|
+
], createentity.prototype, "entity_name", void 0);
|
|
637
|
+
__decorate([
|
|
638
|
+
Struct.field(Int64)
|
|
639
|
+
], createentity.prototype, "x", void 0);
|
|
640
|
+
__decorate([
|
|
641
|
+
Struct.field(Int64)
|
|
642
|
+
], createentity.prototype, "y", void 0);
|
|
643
|
+
createentity = __decorate([
|
|
644
|
+
Struct.type('createentity')
|
|
645
|
+
], createentity);
|
|
646
|
+
Types.createentity = createentity;
|
|
647
|
+
let deploy = class deploy extends Struct {
|
|
648
|
+
};
|
|
649
|
+
__decorate([
|
|
650
|
+
Struct.field(Name)
|
|
651
|
+
], deploy.prototype, "entity_type", void 0);
|
|
652
|
+
__decorate([
|
|
653
|
+
Struct.field(UInt64)
|
|
654
|
+
], deploy.prototype, "id", void 0);
|
|
655
|
+
__decorate([
|
|
656
|
+
Struct.field(UInt16)
|
|
657
|
+
], deploy.prototype, "packed_item_id", void 0);
|
|
658
|
+
__decorate([
|
|
659
|
+
Struct.field(UInt64)
|
|
660
|
+
], deploy.prototype, "seed", void 0);
|
|
661
|
+
__decorate([
|
|
662
|
+
Struct.field('string')
|
|
663
|
+
], deploy.prototype, "entity_name", void 0);
|
|
664
|
+
deploy = __decorate([
|
|
665
|
+
Struct.type('deploy')
|
|
666
|
+
], deploy);
|
|
667
|
+
Types.deploy = deploy;
|
|
674
668
|
let enable = class enable extends Struct {
|
|
675
669
|
};
|
|
676
670
|
__decorate([
|
|
@@ -739,6 +733,9 @@ var Types;
|
|
|
739
733
|
__decorate([
|
|
740
734
|
Struct.field(warp_stats, { optional: true })
|
|
741
735
|
], entity_info.prototype, "warp", void 0);
|
|
736
|
+
__decorate([
|
|
737
|
+
Struct.field(crafter_stats, { optional: true })
|
|
738
|
+
], entity_info.prototype, "crafter", void 0);
|
|
742
739
|
__decorate([
|
|
743
740
|
Struct.field('bool')
|
|
744
741
|
], entity_info.prototype, "is_idle", void 0);
|
|
@@ -1073,27 +1070,6 @@ var Types;
|
|
|
1073
1070
|
Struct.type('location_derived')
|
|
1074
1071
|
], location_derived);
|
|
1075
1072
|
Types.location_derived = location_derived;
|
|
1076
|
-
let location_item = class location_item extends Struct {
|
|
1077
|
-
};
|
|
1078
|
-
__decorate([
|
|
1079
|
-
Struct.field(UInt16)
|
|
1080
|
-
], location_item.prototype, "id", void 0);
|
|
1081
|
-
__decorate([
|
|
1082
|
-
Struct.field(UInt32)
|
|
1083
|
-
], location_item.prototype, "price", void 0);
|
|
1084
|
-
__decorate([
|
|
1085
|
-
Struct.field(UInt16)
|
|
1086
|
-
], location_item.prototype, "supply", void 0);
|
|
1087
|
-
__decorate([
|
|
1088
|
-
Struct.field(UInt32)
|
|
1089
|
-
], location_item.prototype, "rarity_multiplier", void 0);
|
|
1090
|
-
__decorate([
|
|
1091
|
-
Struct.field(UInt32)
|
|
1092
|
-
], location_item.prototype, "location_multiplier", void 0);
|
|
1093
|
-
location_item = __decorate([
|
|
1094
|
-
Struct.type('location_item')
|
|
1095
|
-
], location_item);
|
|
1096
|
-
Types.location_item = location_item;
|
|
1097
1073
|
let location_info = class location_info extends Struct {
|
|
1098
1074
|
};
|
|
1099
1075
|
__decorate([
|
|
@@ -1102,9 +1078,6 @@ var Types;
|
|
|
1102
1078
|
__decorate([
|
|
1103
1079
|
Struct.field('bool')
|
|
1104
1080
|
], location_info.prototype, "is_system", void 0);
|
|
1105
|
-
__decorate([
|
|
1106
|
-
Struct.field(location_item, { array: true })
|
|
1107
|
-
], location_info.prototype, "items", void 0);
|
|
1108
1081
|
location_info = __decorate([
|
|
1109
1082
|
Struct.type('location_info')
|
|
1110
1083
|
], location_info);
|
|
@@ -1214,18 +1187,6 @@ var Types;
|
|
|
1214
1187
|
Struct.type('notify')
|
|
1215
1188
|
], notify);
|
|
1216
1189
|
Types.notify = notify;
|
|
1217
|
-
let payloan = class payloan extends Struct {
|
|
1218
|
-
};
|
|
1219
|
-
__decorate([
|
|
1220
|
-
Struct.field(Name)
|
|
1221
|
-
], payloan.prototype, "account", void 0);
|
|
1222
|
-
__decorate([
|
|
1223
|
-
Struct.field(UInt64)
|
|
1224
|
-
], payloan.prototype, "amount", void 0);
|
|
1225
|
-
payloan = __decorate([
|
|
1226
|
-
Struct.type('payloan')
|
|
1227
|
-
], payloan);
|
|
1228
|
-
Types.payloan = payloan;
|
|
1229
1190
|
let player_info = class player_info extends Struct {
|
|
1230
1191
|
};
|
|
1231
1192
|
__decorate([
|
|
@@ -1237,27 +1198,6 @@ var Types;
|
|
|
1237
1198
|
__decorate([
|
|
1238
1199
|
Struct.field('string')
|
|
1239
1200
|
], player_info.prototype, "company_name", void 0);
|
|
1240
|
-
__decorate([
|
|
1241
|
-
Struct.field(UInt64)
|
|
1242
|
-
], player_info.prototype, "balance", void 0);
|
|
1243
|
-
__decorate([
|
|
1244
|
-
Struct.field(UInt32)
|
|
1245
|
-
], player_info.prototype, "debt", void 0);
|
|
1246
|
-
__decorate([
|
|
1247
|
-
Struct.field(Int64)
|
|
1248
|
-
], player_info.prototype, "networth", void 0);
|
|
1249
|
-
__decorate([
|
|
1250
|
-
Struct.field(UInt64)
|
|
1251
|
-
], player_info.prototype, "available_loan", void 0);
|
|
1252
|
-
__decorate([
|
|
1253
|
-
Struct.field(UInt64)
|
|
1254
|
-
], player_info.prototype, "next_ship_price", void 0);
|
|
1255
|
-
__decorate([
|
|
1256
|
-
Struct.field(UInt64)
|
|
1257
|
-
], player_info.prototype, "next_warehouse_price", void 0);
|
|
1258
|
-
__decorate([
|
|
1259
|
-
Struct.field(UInt64)
|
|
1260
|
-
], player_info.prototype, "next_container_price", void 0);
|
|
1261
1201
|
__decorate([
|
|
1262
1202
|
Struct.field(UInt64)
|
|
1263
1203
|
], player_info.prototype, "ship_count", void 0);
|
|
@@ -1276,28 +1216,10 @@ var Types;
|
|
|
1276
1216
|
__decorate([
|
|
1277
1217
|
Struct.field(Name)
|
|
1278
1218
|
], player_row.prototype, "owner", void 0);
|
|
1279
|
-
__decorate([
|
|
1280
|
-
Struct.field(UInt64)
|
|
1281
|
-
], player_row.prototype, "balance", void 0);
|
|
1282
|
-
__decorate([
|
|
1283
|
-
Struct.field(UInt32)
|
|
1284
|
-
], player_row.prototype, "debt", void 0);
|
|
1285
|
-
__decorate([
|
|
1286
|
-
Struct.field(Int64)
|
|
1287
|
-
], player_row.prototype, "networth", void 0);
|
|
1288
1219
|
player_row = __decorate([
|
|
1289
1220
|
Struct.type('player_row')
|
|
1290
1221
|
], player_row);
|
|
1291
1222
|
Types.player_row = player_row;
|
|
1292
|
-
let purgesupply = class purgesupply extends Struct {
|
|
1293
|
-
};
|
|
1294
|
-
__decorate([
|
|
1295
|
-
Struct.field(UInt64, { optional: true })
|
|
1296
|
-
], purgesupply.prototype, "max_rows", void 0);
|
|
1297
|
-
purgesupply = __decorate([
|
|
1298
|
-
Struct.type('purgesupply')
|
|
1299
|
-
], purgesupply);
|
|
1300
|
-
Types.purgesupply = purgesupply;
|
|
1301
1223
|
let recharge = class recharge extends Struct {
|
|
1302
1224
|
};
|
|
1303
1225
|
__decorate([
|
|
@@ -1365,16 +1287,13 @@ var Types;
|
|
|
1365
1287
|
};
|
|
1366
1288
|
__decorate([
|
|
1367
1289
|
Struct.field(UInt16)
|
|
1368
|
-
], resource_stats.prototype, "
|
|
1369
|
-
__decorate([
|
|
1370
|
-
Struct.field(UInt16)
|
|
1371
|
-
], resource_stats.prototype, "density", void 0);
|
|
1290
|
+
], resource_stats.prototype, "stat1", void 0);
|
|
1372
1291
|
__decorate([
|
|
1373
1292
|
Struct.field(UInt16)
|
|
1374
|
-
], resource_stats.prototype, "
|
|
1293
|
+
], resource_stats.prototype, "stat2", void 0);
|
|
1375
1294
|
__decorate([
|
|
1376
1295
|
Struct.field(UInt16)
|
|
1377
|
-
], resource_stats.prototype, "
|
|
1296
|
+
], resource_stats.prototype, "stat3", void 0);
|
|
1378
1297
|
resource_stats = __decorate([
|
|
1379
1298
|
Struct.type('resource_stats')
|
|
1380
1299
|
], resource_stats);
|
|
@@ -1388,24 +1307,6 @@ var Types;
|
|
|
1388
1307
|
Struct.type('salt')
|
|
1389
1308
|
], salt);
|
|
1390
1309
|
Types.salt = salt;
|
|
1391
|
-
let sellitems = class sellitems extends Struct {
|
|
1392
|
-
};
|
|
1393
|
-
__decorate([
|
|
1394
|
-
Struct.field(Name)
|
|
1395
|
-
], sellitems.prototype, "entity_type", void 0);
|
|
1396
|
-
__decorate([
|
|
1397
|
-
Struct.field(UInt64)
|
|
1398
|
-
], sellitems.prototype, "id", void 0);
|
|
1399
|
-
__decorate([
|
|
1400
|
-
Struct.field(UInt16)
|
|
1401
|
-
], sellitems.prototype, "item_id", void 0);
|
|
1402
|
-
__decorate([
|
|
1403
|
-
Struct.field(UInt32)
|
|
1404
|
-
], sellitems.prototype, "quantity", void 0);
|
|
1405
|
-
sellitems = __decorate([
|
|
1406
|
-
Struct.type('sellitems')
|
|
1407
|
-
], sellitems);
|
|
1408
|
-
Types.sellitems = sellitems;
|
|
1409
1310
|
let sequence_row = class sequence_row extends Struct {
|
|
1410
1311
|
};
|
|
1411
1312
|
__decorate([
|
|
@@ -1453,15 +1354,15 @@ var Types;
|
|
|
1453
1354
|
__decorate([
|
|
1454
1355
|
Struct.field(loader_stats)
|
|
1455
1356
|
], ship_row.prototype, "loaders", void 0);
|
|
1456
|
-
__decorate([
|
|
1457
|
-
Struct.field(trade_stats, { optional: true })
|
|
1458
|
-
], ship_row.prototype, "trade", void 0);
|
|
1459
1357
|
__decorate([
|
|
1460
1358
|
Struct.field(extractor_stats, { optional: true })
|
|
1461
1359
|
], ship_row.prototype, "extractor", void 0);
|
|
1462
1360
|
__decorate([
|
|
1463
1361
|
Struct.field(warp_stats, { optional: true })
|
|
1464
1362
|
], ship_row.prototype, "warp", void 0);
|
|
1363
|
+
__decorate([
|
|
1364
|
+
Struct.field(crafter_stats, { optional: true })
|
|
1365
|
+
], ship_row.prototype, "crafter", void 0);
|
|
1465
1366
|
__decorate([
|
|
1466
1367
|
Struct.field(schedule, { optional: true })
|
|
1467
1368
|
], ship_row.prototype, "schedule", void 0);
|
|
@@ -1469,14 +1370,23 @@ var Types;
|
|
|
1469
1370
|
Struct.type('ship_row')
|
|
1470
1371
|
], ship_row);
|
|
1471
1372
|
Types.ship_row = ship_row;
|
|
1472
|
-
let
|
|
1373
|
+
let spawncargo = class spawncargo extends Struct {
|
|
1473
1374
|
};
|
|
1474
1375
|
__decorate([
|
|
1475
1376
|
Struct.field(UInt64)
|
|
1476
|
-
],
|
|
1377
|
+
], spawncargo.prototype, "entity_id", void 0);
|
|
1378
|
+
__decorate([
|
|
1379
|
+
Struct.field(UInt64)
|
|
1380
|
+
], spawncargo.prototype, "item_id", void 0);
|
|
1477
1381
|
__decorate([
|
|
1478
1382
|
Struct.field(UInt64)
|
|
1479
|
-
],
|
|
1383
|
+
], spawncargo.prototype, "quantity", void 0);
|
|
1384
|
+
spawncargo = __decorate([
|
|
1385
|
+
Struct.type('spawncargo')
|
|
1386
|
+
], spawncargo);
|
|
1387
|
+
Types.spawncargo = spawncargo;
|
|
1388
|
+
let starter_info = class starter_info extends Struct {
|
|
1389
|
+
};
|
|
1480
1390
|
__decorate([
|
|
1481
1391
|
Struct.field(entity_info)
|
|
1482
1392
|
], starter_info.prototype, "ship", void 0);
|
|
@@ -1538,39 +1448,6 @@ var Types;
|
|
|
1538
1448
|
Struct.type('stratum_data')
|
|
1539
1449
|
], stratum_data);
|
|
1540
1450
|
Types.stratum_data = stratum_data;
|
|
1541
|
-
let supply_row = class supply_row extends Struct {
|
|
1542
|
-
};
|
|
1543
|
-
__decorate([
|
|
1544
|
-
Struct.field(UInt64)
|
|
1545
|
-
], supply_row.prototype, "id", void 0);
|
|
1546
|
-
__decorate([
|
|
1547
|
-
Struct.field(coordinates)
|
|
1548
|
-
], supply_row.prototype, "coordinates", void 0);
|
|
1549
|
-
__decorate([
|
|
1550
|
-
Struct.field(UInt64)
|
|
1551
|
-
], supply_row.prototype, "epoch", void 0);
|
|
1552
|
-
__decorate([
|
|
1553
|
-
Struct.field(UInt16)
|
|
1554
|
-
], supply_row.prototype, "item_id", void 0);
|
|
1555
|
-
__decorate([
|
|
1556
|
-
Struct.field(UInt16)
|
|
1557
|
-
], supply_row.prototype, "supply", void 0);
|
|
1558
|
-
supply_row = __decorate([
|
|
1559
|
-
Struct.type('supply_row')
|
|
1560
|
-
], supply_row);
|
|
1561
|
-
Types.supply_row = supply_row;
|
|
1562
|
-
let takeloan = class takeloan extends Struct {
|
|
1563
|
-
};
|
|
1564
|
-
__decorate([
|
|
1565
|
-
Struct.field(Name)
|
|
1566
|
-
], takeloan.prototype, "account", void 0);
|
|
1567
|
-
__decorate([
|
|
1568
|
-
Struct.field(UInt64)
|
|
1569
|
-
], takeloan.prototype, "amount", void 0);
|
|
1570
|
-
takeloan = __decorate([
|
|
1571
|
-
Struct.type('takeloan')
|
|
1572
|
-
], takeloan);
|
|
1573
|
-
Types.takeloan = takeloan;
|
|
1574
1451
|
let task_results = class task_results extends Struct {
|
|
1575
1452
|
};
|
|
1576
1453
|
__decorate([
|
|
@@ -1643,30 +1520,6 @@ var Types;
|
|
|
1643
1520
|
Struct.type('types_row')
|
|
1644
1521
|
], types_row);
|
|
1645
1522
|
Types.types_row = types_row;
|
|
1646
|
-
let updatecredit = class updatecredit extends Struct {
|
|
1647
|
-
};
|
|
1648
|
-
__decorate([
|
|
1649
|
-
Struct.field(Name)
|
|
1650
|
-
], updatecredit.prototype, "account", void 0);
|
|
1651
|
-
__decorate([
|
|
1652
|
-
Struct.field(Int64)
|
|
1653
|
-
], updatecredit.prototype, "amount", void 0);
|
|
1654
|
-
updatecredit = __decorate([
|
|
1655
|
-
Struct.type('updatecredit')
|
|
1656
|
-
], updatecredit);
|
|
1657
|
-
Types.updatecredit = updatecredit;
|
|
1658
|
-
let updatedebt = class updatedebt extends Struct {
|
|
1659
|
-
};
|
|
1660
|
-
__decorate([
|
|
1661
|
-
Struct.field(Name)
|
|
1662
|
-
], updatedebt.prototype, "account", void 0);
|
|
1663
|
-
__decorate([
|
|
1664
|
-
Struct.field(Int64)
|
|
1665
|
-
], updatedebt.prototype, "amount", void 0);
|
|
1666
|
-
updatedebt = __decorate([
|
|
1667
|
-
Struct.type('updatedebt')
|
|
1668
|
-
], updatedebt);
|
|
1669
|
-
Types.updatedebt = updatedebt;
|
|
1670
1523
|
let warehouse_row = class warehouse_row extends Struct {
|
|
1671
1524
|
};
|
|
1672
1525
|
__decorate([
|
|
@@ -1738,7 +1591,6 @@ const TableMap = {
|
|
|
1738
1591
|
sequence: Types.sequence_row,
|
|
1739
1592
|
ship: Types.ship_row,
|
|
1740
1593
|
state: Types.state_row,
|
|
1741
|
-
supply: Types.supply_row,
|
|
1742
1594
|
types: Types.types_row,
|
|
1743
1595
|
warehouse: Types.warehouse_row,
|
|
1744
1596
|
};
|
|
@@ -1847,6 +1699,8 @@ var TaskType;
|
|
|
1847
1699
|
TaskType[TaskType["UNLOAD"] = 4] = "UNLOAD";
|
|
1848
1700
|
TaskType[TaskType["EXTRACT"] = 5] = "EXTRACT";
|
|
1849
1701
|
TaskType[TaskType["WARP"] = 6] = "WARP";
|
|
1702
|
+
TaskType[TaskType["CRAFT"] = 7] = "CRAFT";
|
|
1703
|
+
TaskType[TaskType["DEPLOY"] = 8] = "DEPLOY";
|
|
1850
1704
|
})(TaskType || (TaskType = {}));
|
|
1851
1705
|
var LocationType;
|
|
1852
1706
|
(function (LocationType) {
|
|
@@ -1897,9 +1751,6 @@ __decorate([
|
|
|
1897
1751
|
__decorate([
|
|
1898
1752
|
Struct.field('string')
|
|
1899
1753
|
], Item.prototype, "description", void 0);
|
|
1900
|
-
__decorate([
|
|
1901
|
-
Struct.field(UInt32)
|
|
1902
|
-
], Item.prototype, "base_price", void 0);
|
|
1903
1754
|
__decorate([
|
|
1904
1755
|
Struct.field(UInt32)
|
|
1905
1756
|
], Item.prototype, "mass", void 0);
|
|
@@ -1908,30 +1759,13 @@ __decorate([
|
|
|
1908
1759
|
], Item.prototype, "category", void 0);
|
|
1909
1760
|
__decorate([
|
|
1910
1761
|
Struct.field('string')
|
|
1911
|
-
], Item.prototype, "
|
|
1762
|
+
], Item.prototype, "tier", void 0);
|
|
1912
1763
|
__decorate([
|
|
1913
1764
|
Struct.field('string')
|
|
1914
1765
|
], Item.prototype, "color", void 0);
|
|
1915
1766
|
Item = __decorate([
|
|
1916
1767
|
Struct.type('item')
|
|
1917
1768
|
], Item);
|
|
1918
|
-
let ItemPrice = class ItemPrice extends Struct {
|
|
1919
|
-
};
|
|
1920
|
-
__decorate([
|
|
1921
|
-
Struct.field(UInt16)
|
|
1922
|
-
], ItemPrice.prototype, "id", void 0);
|
|
1923
|
-
__decorate([
|
|
1924
|
-
Struct.field(Item)
|
|
1925
|
-
], ItemPrice.prototype, "item", void 0);
|
|
1926
|
-
__decorate([
|
|
1927
|
-
Struct.field(UInt32)
|
|
1928
|
-
], ItemPrice.prototype, "price", void 0);
|
|
1929
|
-
__decorate([
|
|
1930
|
-
Struct.field(UInt16)
|
|
1931
|
-
], ItemPrice.prototype, "supply", void 0);
|
|
1932
|
-
ItemPrice = __decorate([
|
|
1933
|
-
Struct.type('ItemPrice')
|
|
1934
|
-
], ItemPrice);
|
|
1935
1769
|
|
|
1936
1770
|
function getCurrentEpoch(game) {
|
|
1937
1771
|
const current = new Date().getTime();
|
|
@@ -1960,89 +1794,231 @@ function hash512(seed, string) {
|
|
|
1960
1794
|
return Checksum512.hash(bytes);
|
|
1961
1795
|
}
|
|
1962
1796
|
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
1797
|
+
const DEPTH_THRESHOLD_T1 = 0;
|
|
1798
|
+
const DEPTH_THRESHOLD_T2 = 2000;
|
|
1799
|
+
const DEPTH_THRESHOLD_T3 = 10000;
|
|
1800
|
+
const DEPTH_THRESHOLD_T4 = 30000;
|
|
1801
|
+
const DEPTH_THRESHOLD_T5 = 55000;
|
|
1802
|
+
const LOCATION_MIN_DEPTH = 500;
|
|
1803
|
+
const LOCATION_MAX_DEPTH = 65535;
|
|
1804
|
+
const YIELD_THRESHOLD = Math.floor(0.003 * 0xffffffff);
|
|
1805
|
+
const PLANET_SUBTYPE_GAS_GIANT = 0;
|
|
1806
|
+
const PLANET_SUBTYPE_ROCKY = 1;
|
|
1807
|
+
const PLANET_SUBTYPE_TERRESTRIAL = 2;
|
|
1808
|
+
const PLANET_SUBTYPE_ICY = 3;
|
|
1809
|
+
const PLANET_SUBTYPE_OCEAN = 4;
|
|
1810
|
+
const PLANET_SUBTYPE_INDUSTRIAL = 5;
|
|
1811
|
+
const RESOURCE_CATALOG = [
|
|
1812
|
+
{ id: 26, tier: 't1' },
|
|
1813
|
+
{ id: 13, tier: 't2' },
|
|
1814
|
+
{ id: 24, tier: 't3' },
|
|
1815
|
+
{ id: 29, tier: 't1' },
|
|
1816
|
+
{ id: 47, tier: 't2' },
|
|
1817
|
+
{ id: 79, tier: 't3' },
|
|
1818
|
+
{ id: 1, tier: 't1' },
|
|
1819
|
+
{ id: 2, tier: 't2' },
|
|
1820
|
+
{ id: 18, tier: 't3' },
|
|
1821
|
+
{ id: 14, tier: 't1' },
|
|
1822
|
+
{ id: 1000, tier: 't2' },
|
|
1823
|
+
{ id: 1001, tier: 't3' },
|
|
1824
|
+
{ id: 6, tier: 't1' },
|
|
1825
|
+
{ id: 1003, tier: 't2' },
|
|
1826
|
+
{ id: 1002, tier: 't3' },
|
|
1827
|
+
];
|
|
1828
|
+
function getDepthThreshold(tier) {
|
|
1829
|
+
switch (tier) {
|
|
1830
|
+
case 't1':
|
|
1831
|
+
return DEPTH_THRESHOLD_T1;
|
|
1832
|
+
case 't2':
|
|
1833
|
+
return DEPTH_THRESHOLD_T2;
|
|
1834
|
+
case 't3':
|
|
1835
|
+
return DEPTH_THRESHOLD_T3;
|
|
1836
|
+
case 't4':
|
|
1837
|
+
return DEPTH_THRESHOLD_T4;
|
|
1838
|
+
case 't5':
|
|
1839
|
+
return DEPTH_THRESHOLD_T5;
|
|
1840
|
+
}
|
|
1841
|
+
}
|
|
1842
|
+
function getResourceTier(itemId) {
|
|
1843
|
+
const entry = RESOURCE_CATALOG.find((r) => r.id === itemId);
|
|
1844
|
+
return entry ? entry.tier : 't5';
|
|
1845
|
+
}
|
|
1846
|
+
function getResourceWeight(itemId, stratum) {
|
|
1847
|
+
const tier = getResourceTier(itemId);
|
|
1848
|
+
const threshold = getDepthThreshold(tier);
|
|
1849
|
+
if (stratum < threshold)
|
|
1850
|
+
return 0;
|
|
1851
|
+
const depthAbove = stratum - threshold;
|
|
1852
|
+
switch (tier) {
|
|
1853
|
+
case 't1':
|
|
1854
|
+
if (stratum < 2000)
|
|
1855
|
+
return 100;
|
|
1856
|
+
if (stratum < 10000)
|
|
1857
|
+
return 80;
|
|
1858
|
+
if (stratum < 30000)
|
|
1859
|
+
return 50;
|
|
1860
|
+
return 30;
|
|
1861
|
+
case 't2':
|
|
1862
|
+
if (depthAbove < 3000)
|
|
1863
|
+
return 40;
|
|
1864
|
+
if (depthAbove < 8000)
|
|
1865
|
+
return 60;
|
|
1866
|
+
return 50;
|
|
1867
|
+
case 't3':
|
|
1868
|
+
if (depthAbove < 5000)
|
|
1869
|
+
return 20;
|
|
1870
|
+
if (depthAbove < 15000)
|
|
1871
|
+
return 35;
|
|
1872
|
+
return 40;
|
|
1873
|
+
case 't4':
|
|
1874
|
+
if (depthAbove < 10000)
|
|
1875
|
+
return 10;
|
|
1876
|
+
if (depthAbove < 25000)
|
|
1877
|
+
return 20;
|
|
1878
|
+
return 30;
|
|
1879
|
+
case 't5':
|
|
1880
|
+
return 10;
|
|
1881
|
+
}
|
|
1882
|
+
}
|
|
1883
|
+
const ASTEROID_RESOURCES = [26, 13, 24, 29, 47];
|
|
1884
|
+
const NEBULA_RESOURCES = [47, 79, 1, 2, 18];
|
|
1885
|
+
const GAS_GIANT_RESOURCES = [1, 2, 18, 14, 6];
|
|
1886
|
+
const ROCKY_RESOURCES = [26, 13, 24, 14, 1000, 1001, 1002];
|
|
1887
|
+
const TERRESTRIAL_RESOURCES = [29, 47, 14, 1000, 6, 1003, 1002];
|
|
1888
|
+
const ICY_RESOURCES = [26, 1, 2, 14, 1001, 6, 1003];
|
|
1889
|
+
const OCEAN_RESOURCES = [29, 79, 1, 18, 6, 1003, 1002];
|
|
1890
|
+
const INDUSTRIAL_RESOURCES = [26, 13, 24, 29, 79, 1000, 1001];
|
|
1891
|
+
function getLocationCandidates(locationType, subtype) {
|
|
1892
|
+
if (locationType === 2)
|
|
1893
|
+
return ASTEROID_RESOURCES;
|
|
1894
|
+
if (locationType === 3)
|
|
1895
|
+
return NEBULA_RESOURCES;
|
|
1896
|
+
if (locationType === 1) {
|
|
1897
|
+
switch (subtype) {
|
|
1898
|
+
case PLANET_SUBTYPE_GAS_GIANT:
|
|
1899
|
+
return GAS_GIANT_RESOURCES;
|
|
1900
|
+
case PLANET_SUBTYPE_ROCKY:
|
|
1901
|
+
return ROCKY_RESOURCES;
|
|
1902
|
+
case PLANET_SUBTYPE_TERRESTRIAL:
|
|
1903
|
+
return TERRESTRIAL_RESOURCES;
|
|
1904
|
+
case PLANET_SUBTYPE_ICY:
|
|
1905
|
+
return ICY_RESOURCES;
|
|
1906
|
+
case PLANET_SUBTYPE_OCEAN:
|
|
1907
|
+
return OCEAN_RESOURCES;
|
|
1908
|
+
case PLANET_SUBTYPE_INDUSTRIAL:
|
|
1909
|
+
return INDUSTRIAL_RESOURCES;
|
|
1910
|
+
}
|
|
1911
|
+
}
|
|
1912
|
+
return [];
|
|
1913
|
+
}
|
|
1914
|
+
function getEligibleResources(locationType, subtype, stratum) {
|
|
1915
|
+
const candidates = getLocationCandidates(locationType, subtype);
|
|
1916
|
+
return candidates.filter((itemId) => {
|
|
1917
|
+
const tier = getResourceTier(itemId);
|
|
1918
|
+
const threshold = getDepthThreshold(tier);
|
|
1919
|
+
return stratum >= threshold;
|
|
1920
|
+
});
|
|
1921
|
+
}
|
|
1922
|
+
function depthScaleFactor(stratum) {
|
|
1923
|
+
if (stratum <= 1)
|
|
1924
|
+
return 1.0;
|
|
1925
|
+
const logScale = Math.log(stratum) / Math.log(65535);
|
|
1926
|
+
return 1.0 + logScale * 2.0;
|
|
1927
|
+
}
|
|
1928
|
+
|
|
1929
|
+
function deriveLocationSize(loc) {
|
|
1930
|
+
if (loc.type.toNumber() === LocationType.EMPTY)
|
|
1931
|
+
return 0;
|
|
1932
|
+
const raw = (loc.seed0.toNumber() << 8) | loc.seed1.toNumber();
|
|
1933
|
+
const normalized = raw / 65535;
|
|
1934
|
+
const curved = Math.pow(normalized, 3.0);
|
|
1935
|
+
const range = LOCATION_MAX_DEPTH - LOCATION_MIN_DEPTH;
|
|
1936
|
+
return Math.floor(LOCATION_MIN_DEPTH + curved * range);
|
|
1937
|
+
}
|
|
1938
|
+
|
|
1939
|
+
var syllables = [
|
|
1940
|
+
"A",
|
|
1941
|
+
"Ab",
|
|
1942
|
+
"Abl",
|
|
1943
|
+
"Abr",
|
|
1944
|
+
"Ach",
|
|
1945
|
+
"Acr",
|
|
1946
|
+
"Ad",
|
|
1947
|
+
"Ae",
|
|
1948
|
+
"Aed",
|
|
1949
|
+
"Aeg",
|
|
1950
|
+
"Aek",
|
|
1951
|
+
"Ael",
|
|
1952
|
+
"Aem",
|
|
1953
|
+
"Aen",
|
|
1954
|
+
"Aeon",
|
|
1955
|
+
"Aep",
|
|
1956
|
+
"Aer",
|
|
1957
|
+
"Aes",
|
|
1958
|
+
"Aesk",
|
|
1959
|
+
"Aet",
|
|
1960
|
+
"Aev",
|
|
1961
|
+
"Ag",
|
|
1962
|
+
"Agr",
|
|
1963
|
+
"Ahl",
|
|
1964
|
+
"Ai",
|
|
1965
|
+
"Ail",
|
|
1966
|
+
"Ain",
|
|
1967
|
+
"Ais",
|
|
1968
|
+
"Ak",
|
|
1969
|
+
"Aka",
|
|
1970
|
+
"Al",
|
|
1971
|
+
"Alb",
|
|
1972
|
+
"Ald",
|
|
1973
|
+
"Alg",
|
|
1974
|
+
"Alk",
|
|
1975
|
+
"Alm",
|
|
1976
|
+
"Alt",
|
|
1977
|
+
"Alv",
|
|
1978
|
+
"Am",
|
|
1979
|
+
"Amb",
|
|
1980
|
+
"Ami",
|
|
1981
|
+
"Amp",
|
|
1982
|
+
"An",
|
|
1983
|
+
"Anc",
|
|
1984
|
+
"Ang",
|
|
1985
|
+
"Ank",
|
|
1986
|
+
"Ann",
|
|
1987
|
+
"Ant",
|
|
1988
|
+
"Ap",
|
|
1989
|
+
"Aph",
|
|
1990
|
+
"Aqu",
|
|
1991
|
+
"Ar",
|
|
1992
|
+
"Ara",
|
|
1993
|
+
"Arb",
|
|
1994
|
+
"Arc",
|
|
1995
|
+
"Ard",
|
|
1996
|
+
"Arg",
|
|
1997
|
+
"Ari",
|
|
1998
|
+
"Arl",
|
|
1999
|
+
"Arm",
|
|
2000
|
+
"Arn",
|
|
2001
|
+
"Arr",
|
|
2002
|
+
"Ars",
|
|
2003
|
+
"Art",
|
|
2004
|
+
"As",
|
|
2005
|
+
"Asa",
|
|
2006
|
+
"Ash",
|
|
2007
|
+
"Asp",
|
|
2008
|
+
"Ast",
|
|
2009
|
+
"Astr",
|
|
2010
|
+
"At",
|
|
2011
|
+
"Ath",
|
|
2012
|
+
"Atr",
|
|
2013
|
+
"Aud",
|
|
2014
|
+
"Aug",
|
|
2015
|
+
"Aul",
|
|
2016
|
+
"Aum",
|
|
2017
|
+
"Aun",
|
|
2018
|
+
"Aur",
|
|
2019
|
+
"Aus",
|
|
2020
|
+
"Av",
|
|
2021
|
+
"Avn",
|
|
2046
2022
|
"Ax",
|
|
2047
2023
|
"Ayn",
|
|
2048
2024
|
"Az",
|
|
@@ -4206,9 +4182,7 @@ function deriveLocationStatic(gameSeed, coordinates) {
|
|
|
4206
4182
|
else {
|
|
4207
4183
|
loc.type = UInt8.from(LocationType.NEBULA);
|
|
4208
4184
|
}
|
|
4209
|
-
loc.subtype = UInt8.from(Number(loc.type) === LocationType.PLANET
|
|
4210
|
-
? hashResult.array[2] % 6
|
|
4211
|
-
: hashResult.array[2]);
|
|
4185
|
+
loc.subtype = UInt8.from(Number(loc.type) === LocationType.PLANET ? hashResult.array[2] % 6 : hashResult.array[2]);
|
|
4212
4186
|
loc.seed0 = UInt8.from(hashResult.array[3]);
|
|
4213
4187
|
loc.seed1 = UInt8.from(hashResult.array[4]);
|
|
4214
4188
|
return loc;
|
|
@@ -4225,9 +4199,11 @@ function deriveLocationEpoch(epochSeed, coordinates) {
|
|
|
4225
4199
|
});
|
|
4226
4200
|
}
|
|
4227
4201
|
function deriveLocation(gameSeed, epochSeed, coordinates) {
|
|
4202
|
+
const staticProps = deriveLocationStatic(gameSeed, coordinates);
|
|
4228
4203
|
return Types.location_derived.from({
|
|
4229
|
-
static_props:
|
|
4204
|
+
static_props: staticProps,
|
|
4230
4205
|
epoch_props: deriveLocationEpoch(epochSeed, coordinates),
|
|
4206
|
+
size: deriveLocationSize(staticProps),
|
|
4231
4207
|
});
|
|
4232
4208
|
}
|
|
4233
4209
|
|
|
@@ -4325,145 +4301,140 @@ class BaseManager {
|
|
|
4325
4301
|
}
|
|
4326
4302
|
|
|
4327
4303
|
var itemsData = [
|
|
4304
|
+
{
|
|
4305
|
+
id: 26,
|
|
4306
|
+
name: "Iron",
|
|
4307
|
+
description: "A versatile metal used in hulls and structures.",
|
|
4308
|
+
mass: 40000,
|
|
4309
|
+
category: "metal",
|
|
4310
|
+
tier: "t1",
|
|
4311
|
+
color: "#B7410E"
|
|
4312
|
+
},
|
|
4313
|
+
{
|
|
4314
|
+
id: 13,
|
|
4315
|
+
name: "Aluminum",
|
|
4316
|
+
description: "A lightweight metal for structural components.",
|
|
4317
|
+
mass: 27000,
|
|
4318
|
+
category: "metal",
|
|
4319
|
+
tier: "t2",
|
|
4320
|
+
color: "#A8B5C2"
|
|
4321
|
+
},
|
|
4322
|
+
{
|
|
4323
|
+
id: 24,
|
|
4324
|
+
name: "Chromium",
|
|
4325
|
+
description: "A hard, corrosion-resistant alloy metal.",
|
|
4326
|
+
mass: 52000,
|
|
4327
|
+
category: "metal",
|
|
4328
|
+
tier: "t3",
|
|
4329
|
+
color: "#D4E6F1"
|
|
4330
|
+
},
|
|
4331
|
+
{
|
|
4332
|
+
id: 29,
|
|
4333
|
+
name: "Copper",
|
|
4334
|
+
description: "A conductive metal for electronics and wiring.",
|
|
4335
|
+
mass: 60000,
|
|
4336
|
+
category: "precious",
|
|
4337
|
+
tier: "t1",
|
|
4338
|
+
color: "#B87333"
|
|
4339
|
+
},
|
|
4340
|
+
{
|
|
4341
|
+
id: 47,
|
|
4342
|
+
name: "Silver",
|
|
4343
|
+
description: "A high-conductivity metal for precision components.",
|
|
4344
|
+
mass: 55000,
|
|
4345
|
+
category: "precious",
|
|
4346
|
+
tier: "t2",
|
|
4347
|
+
color: "#C0C0C0"
|
|
4348
|
+
},
|
|
4349
|
+
{
|
|
4350
|
+
id: 79,
|
|
4351
|
+
name: "Gold",
|
|
4352
|
+
description: "A corrosion-proof metal for advanced electronics.",
|
|
4353
|
+
mass: 70000,
|
|
4354
|
+
category: "precious",
|
|
4355
|
+
tier: "t3",
|
|
4356
|
+
color: "#FFD700"
|
|
4357
|
+
},
|
|
4328
4358
|
{
|
|
4329
4359
|
id: 1,
|
|
4330
4360
|
name: "Hydrogen",
|
|
4331
4361
|
description: "A lightweight gas used for fuel cells and propulsion.",
|
|
4332
|
-
base_price: 50,
|
|
4333
4362
|
mass: 15000,
|
|
4334
4363
|
category: "gas",
|
|
4335
|
-
|
|
4364
|
+
tier: "t1",
|
|
4336
4365
|
color: "#7EC8E3"
|
|
4337
4366
|
},
|
|
4338
4367
|
{
|
|
4339
4368
|
id: 2,
|
|
4340
4369
|
name: "Helium",
|
|
4341
4370
|
description: "An inert noble gas used in energy systems.",
|
|
4342
|
-
base_price: 75,
|
|
4343
4371
|
mass: 2000,
|
|
4344
4372
|
category: "gas",
|
|
4345
|
-
|
|
4373
|
+
tier: "t2",
|
|
4346
4374
|
color: "#F5E6CC"
|
|
4347
4375
|
},
|
|
4348
|
-
{
|
|
4349
|
-
id: 6,
|
|
4350
|
-
name: "Carbon",
|
|
4351
|
-
description: "A versatile element for life support and coatings.",
|
|
4352
|
-
base_price: 100,
|
|
4353
|
-
mass: 12000,
|
|
4354
|
-
category: "organic",
|
|
4355
|
-
rarity: "common",
|
|
4356
|
-
color: "#4A4A4A"
|
|
4357
|
-
},
|
|
4358
|
-
{
|
|
4359
|
-
id: 14,
|
|
4360
|
-
name: "Silicon",
|
|
4361
|
-
description: "A semiconductor used in sensors and computing.",
|
|
4362
|
-
base_price: 150,
|
|
4363
|
-
mass: 28000,
|
|
4364
|
-
category: "mineral",
|
|
4365
|
-
rarity: "common",
|
|
4366
|
-
color: "#B8A9C9"
|
|
4367
|
-
},
|
|
4368
4376
|
{
|
|
4369
4377
|
id: 18,
|
|
4370
4378
|
name: "Argon",
|
|
4371
4379
|
description: "A noble gas used in industrial and energy applications.",
|
|
4372
|
-
base_price: 60,
|
|
4373
4380
|
mass: 8000,
|
|
4374
4381
|
category: "gas",
|
|
4375
|
-
|
|
4382
|
+
tier: "t3",
|
|
4376
4383
|
color: "#9B59B6"
|
|
4377
4384
|
},
|
|
4378
4385
|
{
|
|
4379
|
-
id:
|
|
4380
|
-
name: "
|
|
4381
|
-
description: "A
|
|
4382
|
-
|
|
4383
|
-
|
|
4384
|
-
|
|
4385
|
-
|
|
4386
|
-
color: "#C0C0C0"
|
|
4387
|
-
},
|
|
4388
|
-
{
|
|
4389
|
-
id: 26,
|
|
4390
|
-
name: "Iron",
|
|
4391
|
-
description: "A versatile metal used in hulls and structures.",
|
|
4392
|
-
base_price: 125,
|
|
4393
|
-
mass: 40000,
|
|
4394
|
-
category: "metal",
|
|
4395
|
-
rarity: "common",
|
|
4396
|
-
color: "#B7410E"
|
|
4397
|
-
},
|
|
4398
|
-
{
|
|
4399
|
-
id: 29,
|
|
4400
|
-
name: "Copper",
|
|
4401
|
-
description: "A conductive metal for electronics and wiring.",
|
|
4402
|
-
base_price: 200,
|
|
4403
|
-
mass: 60000,
|
|
4404
|
-
category: "metal",
|
|
4405
|
-
rarity: "uncommon",
|
|
4406
|
-
color: "#B87333"
|
|
4407
|
-
},
|
|
4408
|
-
{
|
|
4409
|
-
id: 54,
|
|
4410
|
-
name: "Xenon",
|
|
4411
|
-
description: "A rare noble gas for advanced propulsion systems.",
|
|
4412
|
-
base_price: 175,
|
|
4413
|
-
mass: 20000,
|
|
4414
|
-
category: "gas",
|
|
4415
|
-
rarity: "epic",
|
|
4416
|
-
color: "#5B2C6F"
|
|
4417
|
-
},
|
|
4418
|
-
{
|
|
4419
|
-
id: 74,
|
|
4420
|
-
name: "Tungsten",
|
|
4421
|
-
description: "An extremely dense metal for heavy-duty applications.",
|
|
4422
|
-
base_price: 500,
|
|
4423
|
-
mass: 80000,
|
|
4424
|
-
category: "metal",
|
|
4425
|
-
rarity: "epic",
|
|
4426
|
-
color: "#708090"
|
|
4386
|
+
id: 14,
|
|
4387
|
+
name: "Silicon",
|
|
4388
|
+
description: "A semiconductor used in sensors and computing.",
|
|
4389
|
+
mass: 28000,
|
|
4390
|
+
category: "mineral",
|
|
4391
|
+
tier: "t1",
|
|
4392
|
+
color: "#B8A9C9"
|
|
4427
4393
|
},
|
|
4428
4394
|
{
|
|
4429
4395
|
id: 1000,
|
|
4430
4396
|
name: "Quartz",
|
|
4431
4397
|
description: "A crystalline mineral for sensors and optics.",
|
|
4432
|
-
base_price: 200,
|
|
4433
4398
|
mass: 35000,
|
|
4434
4399
|
category: "mineral",
|
|
4435
|
-
|
|
4400
|
+
tier: "t2",
|
|
4436
4401
|
color: "#E8D5B7"
|
|
4437
4402
|
},
|
|
4438
4403
|
{
|
|
4439
4404
|
id: 1001,
|
|
4440
4405
|
name: "Sapphire",
|
|
4441
4406
|
description: "A precious crystal for precision instruments.",
|
|
4442
|
-
base_price: 400,
|
|
4443
4407
|
mass: 45000,
|
|
4444
4408
|
category: "mineral",
|
|
4445
|
-
|
|
4409
|
+
tier: "t3",
|
|
4446
4410
|
color: "#0F52BA"
|
|
4447
4411
|
},
|
|
4448
4412
|
{
|
|
4449
|
-
id:
|
|
4450
|
-
name: "
|
|
4451
|
-
description: "
|
|
4452
|
-
|
|
4453
|
-
mass: 25000,
|
|
4413
|
+
id: 6,
|
|
4414
|
+
name: "Carbon",
|
|
4415
|
+
description: "A versatile element for life support and coatings.",
|
|
4416
|
+
mass: 12000,
|
|
4454
4417
|
category: "organic",
|
|
4455
|
-
|
|
4456
|
-
color: "#
|
|
4418
|
+
tier: "t1",
|
|
4419
|
+
color: "#4A4A4A"
|
|
4457
4420
|
},
|
|
4458
4421
|
{
|
|
4459
4422
|
id: 1003,
|
|
4460
4423
|
name: "Biomass",
|
|
4461
4424
|
description: "Organic matter for life support systems.",
|
|
4462
|
-
base_price: 100,
|
|
4463
4425
|
mass: 30000,
|
|
4464
4426
|
category: "organic",
|
|
4465
|
-
|
|
4427
|
+
tier: "t2",
|
|
4466
4428
|
color: "#8B4513"
|
|
4429
|
+
},
|
|
4430
|
+
{
|
|
4431
|
+
id: 1002,
|
|
4432
|
+
name: "Resin",
|
|
4433
|
+
description: "A fossilized organic compound for coatings and sealants.",
|
|
4434
|
+
mass: 25000,
|
|
4435
|
+
category: "organic",
|
|
4436
|
+
tier: "t3",
|
|
4437
|
+
color: "#DAA520"
|
|
4467
4438
|
}
|
|
4468
4439
|
];
|
|
4469
4440
|
|
|
@@ -4471,10 +4442,9 @@ const items = itemsData.map((g) => Item.from({
|
|
|
4471
4442
|
id: g.id,
|
|
4472
4443
|
name: g.name,
|
|
4473
4444
|
description: g.description,
|
|
4474
|
-
base_price: g.base_price,
|
|
4475
4445
|
mass: g.mass,
|
|
4476
4446
|
category: g.category,
|
|
4477
|
-
|
|
4447
|
+
tier: g.tier,
|
|
4478
4448
|
color: g.color,
|
|
4479
4449
|
}));
|
|
4480
4450
|
const itemIds = items.map((i) => i.id);
|
|
@@ -4782,9 +4752,6 @@ function capsHasStorage(caps) {
|
|
|
4782
4752
|
function capsHasLoaders(caps) {
|
|
4783
4753
|
return caps.loaders !== undefined;
|
|
4784
4754
|
}
|
|
4785
|
-
function capsHasTrade(caps) {
|
|
4786
|
-
return caps.trade !== undefined;
|
|
4787
|
-
}
|
|
4788
4755
|
function capsHasExtractor(caps) {
|
|
4789
4756
|
return caps.extractor !== undefined;
|
|
4790
4757
|
}
|
|
@@ -4800,13 +4767,6 @@ function calcCargoMass(entity) {
|
|
|
4800
4767
|
}
|
|
4801
4768
|
return mass;
|
|
4802
4769
|
}
|
|
4803
|
-
function calcCargoValue(entity) {
|
|
4804
|
-
let value = UInt64.from(0);
|
|
4805
|
-
for (const item of entity.cargo) {
|
|
4806
|
-
value = value.adding(item.unit_cost.multiplying(item.quantity));
|
|
4807
|
-
}
|
|
4808
|
-
return value;
|
|
4809
|
-
}
|
|
4810
4770
|
function availableCapacity$1(entity) {
|
|
4811
4771
|
const cargoMass = calcCargoMass(entity);
|
|
4812
4772
|
return entity.capacity.gt(cargoMass)
|
|
@@ -5003,7 +4963,6 @@ function createProjectedEntity(entity) {
|
|
|
5003
4963
|
const loaders = entity.loaders;
|
|
5004
4964
|
const engines = entity.engines;
|
|
5005
4965
|
const generator = entity.generator;
|
|
5006
|
-
const trade = entity.trade;
|
|
5007
4966
|
const capacity = entity.capacity;
|
|
5008
4967
|
const projected = {
|
|
5009
4968
|
location: Coordinates.from(entity.coordinates),
|
|
@@ -5014,7 +4973,6 @@ function createProjectedEntity(entity) {
|
|
|
5014
4973
|
engines,
|
|
5015
4974
|
generator,
|
|
5016
4975
|
loaders,
|
|
5017
|
-
trade,
|
|
5018
4976
|
get totalMass() {
|
|
5019
4977
|
let mass = UInt64.from(this.shipMass).adding(this.cargoMass);
|
|
5020
4978
|
if (this.loaders) {
|
|
@@ -5031,9 +4989,6 @@ function createProjectedEntity(entity) {
|
|
|
5031
4989
|
hasLoaders() {
|
|
5032
4990
|
return capsHasLoaders(this.capabilities());
|
|
5033
4991
|
},
|
|
5034
|
-
hasTrade() {
|
|
5035
|
-
return this.trade !== undefined;
|
|
5036
|
-
},
|
|
5037
4992
|
capabilities() {
|
|
5038
4993
|
return {
|
|
5039
4994
|
hullmass: this.shipMass,
|
|
@@ -5041,7 +4996,6 @@ function createProjectedEntity(entity) {
|
|
|
5041
4996
|
engines: this.engines,
|
|
5042
4997
|
generator: this.generator,
|
|
5043
4998
|
loaders: this.loaders,
|
|
5044
|
-
trade: this.trade,
|
|
5045
4999
|
};
|
|
5046
5000
|
},
|
|
5047
5001
|
state() {
|
|
@@ -5216,17 +5170,6 @@ class Location {
|
|
|
5216
5170
|
isExtractableAt(gameSeed) {
|
|
5217
5171
|
return isExtractableLocation(this.getLocationTypeAt(gameSeed));
|
|
5218
5172
|
}
|
|
5219
|
-
setMarketPrices(prices) {
|
|
5220
|
-
this._marketPrices = prices;
|
|
5221
|
-
}
|
|
5222
|
-
get marketPrices() {
|
|
5223
|
-
return this._marketPrices;
|
|
5224
|
-
}
|
|
5225
|
-
getPrice(goodId) {
|
|
5226
|
-
if (!this._marketPrices)
|
|
5227
|
-
return undefined;
|
|
5228
|
-
return this._marketPrices.find((p) => p.id.equals(goodId));
|
|
5229
|
-
}
|
|
5230
5173
|
findNearby(gameSeed, maxDistance = 20) {
|
|
5231
5174
|
return findNearbyPlanets(Checksum256.from(gameSeed), this.coordinates, maxDistance);
|
|
5232
5175
|
}
|
|
@@ -5234,90 +5177,12 @@ class Location {
|
|
|
5234
5177
|
const otherCoords = other instanceof Location ? other.coordinates : Coordinates.from(other);
|
|
5235
5178
|
return this.coordinates.equals(otherCoords);
|
|
5236
5179
|
}
|
|
5237
|
-
setLocationRows(rows, epoch) {
|
|
5238
|
-
this._locationRows = rows;
|
|
5239
|
-
this._epoch = epoch;
|
|
5240
|
-
}
|
|
5241
|
-
get locationRows() {
|
|
5242
|
-
return this._locationRows;
|
|
5243
|
-
}
|
|
5244
|
-
getSupply(goodId) {
|
|
5245
|
-
if (!this._locationRows)
|
|
5246
|
-
return undefined;
|
|
5247
|
-
const row = this._locationRows.find((r) => r.item_id.equals(goodId) && this._epoch && r.epoch.equals(this._epoch));
|
|
5248
|
-
return row ? row.supply : undefined;
|
|
5249
|
-
}
|
|
5250
|
-
get availableGoods() {
|
|
5251
|
-
if (!this._locationRows)
|
|
5252
|
-
return undefined;
|
|
5253
|
-
return this._locationRows.filter((r) => this._epoch && r.epoch.equals(this._epoch) && r.supply.gt(UInt16.from(0)));
|
|
5254
|
-
}
|
|
5255
|
-
hasGood(goodId) {
|
|
5256
|
-
const supply = this.getSupply(goodId);
|
|
5257
|
-
return supply !== undefined && supply.gt(UInt16.from(0));
|
|
5258
|
-
}
|
|
5259
5180
|
get epoch() {
|
|
5260
5181
|
return this._epoch;
|
|
5261
5182
|
}
|
|
5262
|
-
get hasCachedData() {
|
|
5263
|
-
return this._marketPrices !== undefined || this._locationRows !== undefined;
|
|
5264
|
-
}
|
|
5265
|
-
get hasSupplyData() {
|
|
5266
|
-
return this._locationRows !== undefined;
|
|
5267
|
-
}
|
|
5268
5183
|
clearCache() {
|
|
5269
|
-
this._marketPrices = undefined;
|
|
5270
|
-
this._locationRows = undefined;
|
|
5271
5184
|
this._epoch = undefined;
|
|
5272
5185
|
}
|
|
5273
|
-
withUpdatedSupply(goodId, quantityDelta) {
|
|
5274
|
-
const newLocation = Location.from(this.coordinates);
|
|
5275
|
-
if (this._marketPrices) {
|
|
5276
|
-
newLocation._marketPrices = this._marketPrices.map((price) => {
|
|
5277
|
-
if (price.id.equals(goodId)) {
|
|
5278
|
-
const currentSupply = UInt16.from(price.supply);
|
|
5279
|
-
const delta = UInt16.from(Math.abs(quantityDelta));
|
|
5280
|
-
const newSupply = quantityDelta < 0
|
|
5281
|
-
? currentSupply.gte(delta)
|
|
5282
|
-
? currentSupply.subtracting(delta)
|
|
5283
|
-
: UInt16.from(0)
|
|
5284
|
-
: currentSupply.adding(quantityDelta);
|
|
5285
|
-
return ItemPrice.from({
|
|
5286
|
-
id: price.id,
|
|
5287
|
-
item: price.item,
|
|
5288
|
-
price: price.price,
|
|
5289
|
-
supply: newSupply,
|
|
5290
|
-
});
|
|
5291
|
-
}
|
|
5292
|
-
return price;
|
|
5293
|
-
});
|
|
5294
|
-
}
|
|
5295
|
-
if (this._locationRows && this._epoch) {
|
|
5296
|
-
newLocation._locationRows = this._locationRows.map((row) => {
|
|
5297
|
-
if (row.item_id.equals(goodId) && row.epoch.equals(this._epoch)) {
|
|
5298
|
-
const currentSupply = UInt16.from(row.supply);
|
|
5299
|
-
const delta = UInt16.from(Math.abs(quantityDelta));
|
|
5300
|
-
const newSupply = quantityDelta < 0
|
|
5301
|
-
? currentSupply.gte(delta)
|
|
5302
|
-
? currentSupply.subtracting(delta)
|
|
5303
|
-
: UInt16.from(0)
|
|
5304
|
-
: currentSupply.adding(quantityDelta);
|
|
5305
|
-
return Types.supply_row.from({
|
|
5306
|
-
id: row.id,
|
|
5307
|
-
coordinates: row.coordinates,
|
|
5308
|
-
epoch: row.epoch,
|
|
5309
|
-
item_id: row.item_id,
|
|
5310
|
-
supply: newSupply,
|
|
5311
|
-
});
|
|
5312
|
-
}
|
|
5313
|
-
return row;
|
|
5314
|
-
});
|
|
5315
|
-
newLocation._epoch = this._epoch;
|
|
5316
|
-
}
|
|
5317
|
-
newLocation._gameSeed = this._gameSeed;
|
|
5318
|
-
newLocation._hasSystem = this._hasSystem;
|
|
5319
|
-
return newLocation;
|
|
5320
|
-
}
|
|
5321
5186
|
}
|
|
5322
5187
|
function toLocation(coords) {
|
|
5323
5188
|
if (coords instanceof Location) {
|
|
@@ -5405,9 +5270,6 @@ class EntityInventory extends Types.cargo_item {
|
|
|
5405
5270
|
get totalMass() {
|
|
5406
5271
|
return UInt64.from(this.unitMass).multiplying(this.quantity);
|
|
5407
5272
|
}
|
|
5408
|
-
get totalCost() {
|
|
5409
|
-
return this.unit_cost.multiplying(this.quantity);
|
|
5410
|
-
}
|
|
5411
5273
|
get hasCargo() {
|
|
5412
5274
|
return UInt32.from(this.quantity).gt(UInt32.from(0));
|
|
5413
5275
|
}
|
|
@@ -5429,9 +5291,6 @@ class InventoryAccessor {
|
|
|
5429
5291
|
get totalMass() {
|
|
5430
5292
|
return this.items.reduce((sum, c) => sum.adding(c.totalMass), UInt64.from(0));
|
|
5431
5293
|
}
|
|
5432
|
-
get totalValue() {
|
|
5433
|
-
return this.items.reduce((sum, c) => sum.adding(c.totalCost), UInt64.from(0));
|
|
5434
|
-
}
|
|
5435
5294
|
forItem(goodId) {
|
|
5436
5295
|
return this.items.find((c) => c.item_id.equals(goodId));
|
|
5437
5296
|
}
|
|
@@ -5468,106 +5327,6 @@ function needsRecharge(entity) {
|
|
|
5468
5327
|
return UInt64.from(entity.energy).lt(entity.generator.capacity);
|
|
5469
5328
|
}
|
|
5470
5329
|
|
|
5471
|
-
function totalCargoMass(cargo) {
|
|
5472
|
-
return cargo.reduce((sum, c) => {
|
|
5473
|
-
return sum.adding(c.totalMass);
|
|
5474
|
-
}, UInt64.from(0));
|
|
5475
|
-
}
|
|
5476
|
-
function cargoValue(cargo) {
|
|
5477
|
-
return cargo.reduce((sum, c) => {
|
|
5478
|
-
return sum.adding(c.totalCost);
|
|
5479
|
-
}, UInt64.from(0));
|
|
5480
|
-
}
|
|
5481
|
-
function getCargoForItem(cargo, goodId) {
|
|
5482
|
-
return cargo.find((c) => c.item_id.equals(goodId));
|
|
5483
|
-
}
|
|
5484
|
-
function hasSpace(currentMass, maxCapacity, goodMass, quantity) {
|
|
5485
|
-
const additionalMass = goodMass.multiplying(quantity);
|
|
5486
|
-
const totalMass = currentMass.adding(additionalMass);
|
|
5487
|
-
return totalMass.lte(maxCapacity);
|
|
5488
|
-
}
|
|
5489
|
-
function availableCapacity(currentMass, maxCapacity) {
|
|
5490
|
-
if (currentMass.gte(maxCapacity)) {
|
|
5491
|
-
return UInt64.from(0);
|
|
5492
|
-
}
|
|
5493
|
-
return maxCapacity.subtracting(currentMass);
|
|
5494
|
-
}
|
|
5495
|
-
function isFull(currentMass, maxCapacity) {
|
|
5496
|
-
return currentMass.gte(maxCapacity);
|
|
5497
|
-
}
|
|
5498
|
-
function calculateSaleValue(cargo, prices) {
|
|
5499
|
-
if (cargo.length === 0) {
|
|
5500
|
-
return { revenue: UInt64.from(0), profit: UInt64.from(0), cost: UInt64.from(0) };
|
|
5501
|
-
}
|
|
5502
|
-
let revenue = UInt64.from(0);
|
|
5503
|
-
let cost = UInt64.from(0);
|
|
5504
|
-
for (const item of cargo) {
|
|
5505
|
-
if (UInt32.from(item.quantity).equals(UInt32.from(0)))
|
|
5506
|
-
continue;
|
|
5507
|
-
const goodId = Number(item.item_id);
|
|
5508
|
-
const salePrice = prices.get(goodId);
|
|
5509
|
-
if (salePrice) {
|
|
5510
|
-
revenue = revenue.adding(salePrice.multiplying(item.quantity));
|
|
5511
|
-
}
|
|
5512
|
-
cost = cost.adding(item.unit_cost.multiplying(item.quantity));
|
|
5513
|
-
}
|
|
5514
|
-
const profit = revenue.gte(cost) ? revenue.subtracting(cost) : UInt64.from(0);
|
|
5515
|
-
return {
|
|
5516
|
-
revenue,
|
|
5517
|
-
profit,
|
|
5518
|
-
cost,
|
|
5519
|
-
};
|
|
5520
|
-
}
|
|
5521
|
-
function calculateSaleValueFromArray(cargo, prices) {
|
|
5522
|
-
const priceMap = new Map();
|
|
5523
|
-
prices.forEach((price, index) => {
|
|
5524
|
-
priceMap.set(index, price);
|
|
5525
|
-
});
|
|
5526
|
-
return calculateSaleValue(cargo, priceMap);
|
|
5527
|
-
}
|
|
5528
|
-
function afterSellItems(cargo, goodsToSell) {
|
|
5529
|
-
if (cargo.length === 0) {
|
|
5530
|
-
return [];
|
|
5531
|
-
}
|
|
5532
|
-
return cargo.map((item) => {
|
|
5533
|
-
const saleItem = goodsToSell.find((s) => Number(item.item_id) === s.goodId);
|
|
5534
|
-
if (!saleItem) {
|
|
5535
|
-
return new EntityInventory(item);
|
|
5536
|
-
}
|
|
5537
|
-
const currentQty = Number(item.quantity);
|
|
5538
|
-
const newQty = Math.max(0, currentQty - saleItem.quantity);
|
|
5539
|
-
return new EntityInventory(Types.cargo_item.from({
|
|
5540
|
-
item_id: item.item_id,
|
|
5541
|
-
quantity: UInt32.from(newQty),
|
|
5542
|
-
unit_cost: item.unit_cost,
|
|
5543
|
-
}));
|
|
5544
|
-
});
|
|
5545
|
-
}
|
|
5546
|
-
function afterSellAllItems(cargo) {
|
|
5547
|
-
if (cargo.length === 0) {
|
|
5548
|
-
return [];
|
|
5549
|
-
}
|
|
5550
|
-
return cargo.map((item) => new EntityInventory(Types.cargo_item.from({
|
|
5551
|
-
item_id: item.item_id,
|
|
5552
|
-
quantity: UInt32.from(0),
|
|
5553
|
-
unit_cost: item.unit_cost,
|
|
5554
|
-
})));
|
|
5555
|
-
}
|
|
5556
|
-
|
|
5557
|
-
var cargoUtils = /*#__PURE__*/Object.freeze({
|
|
5558
|
-
__proto__: null,
|
|
5559
|
-
totalCargoMass: totalCargoMass,
|
|
5560
|
-
cargoValue: cargoValue,
|
|
5561
|
-
getCargoForItem: getCargoForItem,
|
|
5562
|
-
hasSpace: hasSpace,
|
|
5563
|
-
availableCapacity: availableCapacity,
|
|
5564
|
-
isFull: isFull,
|
|
5565
|
-
calculateSaleValue: calculateSaleValue,
|
|
5566
|
-
calculateSaleValueFromArray: calculateSaleValueFromArray,
|
|
5567
|
-
afterSellItems: afterSellItems,
|
|
5568
|
-
afterSellAllItems: afterSellAllItems
|
|
5569
|
-
});
|
|
5570
|
-
|
|
5571
5330
|
class Ship extends Types.entity_info {
|
|
5572
5331
|
get name() {
|
|
5573
5332
|
return this.entity_name;
|
|
@@ -5634,9 +5393,6 @@ class Ship extends Types.entity_info {
|
|
|
5634
5393
|
get totalCargoMass() {
|
|
5635
5394
|
return this.inv.totalMass;
|
|
5636
5395
|
}
|
|
5637
|
-
get cargoValue() {
|
|
5638
|
-
return this.inv.totalValue;
|
|
5639
|
-
}
|
|
5640
5396
|
get totalMass() {
|
|
5641
5397
|
let mass = UInt64.from(this.hullmass ?? 0).adding(this.totalCargoMass);
|
|
5642
5398
|
if (this.loaders) {
|
|
@@ -5685,18 +5441,6 @@ class Ship extends Types.entity_info {
|
|
|
5685
5441
|
return false;
|
|
5686
5442
|
return hasEnergyForDistance(this, distance);
|
|
5687
5443
|
}
|
|
5688
|
-
calculateSaleValue(prices) {
|
|
5689
|
-
return calculateSaleValue(this.cargo, prices);
|
|
5690
|
-
}
|
|
5691
|
-
calculateSaleValueFromArray(prices) {
|
|
5692
|
-
return calculateSaleValueFromArray(this.cargo, prices);
|
|
5693
|
-
}
|
|
5694
|
-
afterSellItems(goodsToSell) {
|
|
5695
|
-
return afterSellItems(this.cargo, goodsToSell);
|
|
5696
|
-
}
|
|
5697
|
-
afterSellAllItems() {
|
|
5698
|
-
return afterSellAllItems(this.cargo);
|
|
5699
|
-
}
|
|
5700
5444
|
}
|
|
5701
5445
|
|
|
5702
5446
|
class Warehouse extends Types.entity_info {
|
|
@@ -5727,9 +5471,6 @@ class Warehouse extends Types.entity_info {
|
|
|
5727
5471
|
get totalCargoMass() {
|
|
5728
5472
|
return this.inv.totalMass;
|
|
5729
5473
|
}
|
|
5730
|
-
get cargoValue() {
|
|
5731
|
-
return this.inv.totalValue;
|
|
5732
|
-
}
|
|
5733
5474
|
get maxCapacity() {
|
|
5734
5475
|
return UInt64.from(this.capacity);
|
|
5735
5476
|
}
|
|
@@ -5790,6 +5531,17 @@ class Container extends Types.entity_info {
|
|
|
5790
5531
|
return this.coordinates.z?.toNumber() || 0;
|
|
5791
5532
|
}
|
|
5792
5533
|
}
|
|
5534
|
+
function computeContainerCapabilities(stats) {
|
|
5535
|
+
const density = stats['density'] ?? 500;
|
|
5536
|
+
const strength = stats['strength'] ?? 500;
|
|
5537
|
+
const ductility = stats['ductility'] ?? 500;
|
|
5538
|
+
const purity = stats['purity'] ?? 500;
|
|
5539
|
+
const hullmass = 25000 + 75 * density;
|
|
5540
|
+
const statSum = strength + ductility + purity;
|
|
5541
|
+
const exponent = statSum / 2997;
|
|
5542
|
+
const capacity = Math.floor(1000000 * Math.pow(10, exponent));
|
|
5543
|
+
return { hullmass, capacity };
|
|
5544
|
+
}
|
|
5793
5545
|
|
|
5794
5546
|
class EntitiesManager extends BaseManager {
|
|
5795
5547
|
async getEntity(type, id) {
|
|
@@ -5867,134 +5619,10 @@ class Player extends Types.player_row {
|
|
|
5867
5619
|
static fromState(state) {
|
|
5868
5620
|
const playerRow = Types.player_row.from({
|
|
5869
5621
|
owner: Name.from(state.owner),
|
|
5870
|
-
balance: UInt64.from(state.balance),
|
|
5871
|
-
debt: UInt32.from(state.debt),
|
|
5872
|
-
networth: Int64.from(state.networth),
|
|
5873
5622
|
});
|
|
5874
5623
|
return new Player(playerRow);
|
|
5875
5624
|
}
|
|
5876
|
-
setShipCount(count) {
|
|
5877
|
-
this._shipCount = count;
|
|
5878
|
-
}
|
|
5879
|
-
get shipCount() {
|
|
5880
|
-
return this._shipCount;
|
|
5881
|
-
}
|
|
5882
|
-
getNextShipCost(shipCount) {
|
|
5883
|
-
const count = shipCount ?? this._shipCount ?? 0;
|
|
5884
|
-
const cost = Math.pow(Player.SHIP_COST_MULTIPLIER, count) * Player.BASE_SHIP_COST;
|
|
5885
|
-
return UInt64.from(Math.floor(cost));
|
|
5886
|
-
}
|
|
5887
|
-
get nextShipCost() {
|
|
5888
|
-
return this.getNextShipCost();
|
|
5889
|
-
}
|
|
5890
|
-
canBuyShip(shipCount) {
|
|
5891
|
-
return UInt64.from(this.balance).gte(this.getNextShipCost(shipCount));
|
|
5892
|
-
}
|
|
5893
|
-
get availableLoan() {
|
|
5894
|
-
const maxLoan = UInt64.from(Player.MAX_LOAN);
|
|
5895
|
-
if (UInt64.from(this.debt).gte(maxLoan)) {
|
|
5896
|
-
return UInt64.from(0);
|
|
5897
|
-
}
|
|
5898
|
-
return maxLoan.subtracting(this.debt);
|
|
5899
|
-
}
|
|
5900
|
-
get canTakeLoan() {
|
|
5901
|
-
return this.availableLoan.gt(UInt64.zero);
|
|
5902
|
-
}
|
|
5903
|
-
get canPayLoan() {
|
|
5904
|
-
return UInt64.from(this.debt).gt(UInt64.zero) && UInt64.from(this.balance).gt(UInt64.zero);
|
|
5905
|
-
}
|
|
5906
|
-
get maxPayback() {
|
|
5907
|
-
return UInt64.from(this.debt).lt(this.balance) ? this.debt : this.balance;
|
|
5908
|
-
}
|
|
5909
|
-
static get MAX_LOAN_LIMIT() {
|
|
5910
|
-
return Player.MAX_LOAN;
|
|
5911
|
-
}
|
|
5912
|
-
get hasDebt() {
|
|
5913
|
-
return UInt64.from(this.debt).gt(UInt64.zero);
|
|
5914
|
-
}
|
|
5915
|
-
get isSolvent() {
|
|
5916
|
-
return this.networth.gte(Int64.zero);
|
|
5917
|
-
}
|
|
5918
|
-
withBalanceChange(delta) {
|
|
5919
|
-
const newPlayer = Player.from(this);
|
|
5920
|
-
const amount = typeof delta === 'number' ? UInt64.from(Math.abs(delta)) : delta;
|
|
5921
|
-
if (typeof delta === 'number' && delta < 0) {
|
|
5922
|
-
newPlayer.balance = UInt64.from(this.balance).gte(amount)
|
|
5923
|
-
? this.balance.subtracting(amount)
|
|
5924
|
-
: UInt64.from(0);
|
|
5925
|
-
}
|
|
5926
|
-
else {
|
|
5927
|
-
newPlayer.balance = this.balance.adding(amount);
|
|
5928
|
-
}
|
|
5929
|
-
const balanceInt = Int64.from(newPlayer.balance);
|
|
5930
|
-
const debtInt = Int64.from(newPlayer.debt);
|
|
5931
|
-
newPlayer.networth = balanceInt.subtracting(debtInt);
|
|
5932
|
-
return newPlayer;
|
|
5933
|
-
}
|
|
5934
|
-
withDebtChange(delta) {
|
|
5935
|
-
const newPlayer = Player.from(this);
|
|
5936
|
-
const amount = typeof delta === 'number' ? UInt64.from(Math.abs(delta)) : delta;
|
|
5937
|
-
if (typeof delta === 'number' && delta < 0) {
|
|
5938
|
-
newPlayer.debt = UInt64.from(this.debt).gte(amount)
|
|
5939
|
-
? this.debt.subtracting(amount)
|
|
5940
|
-
: UInt64.from(0);
|
|
5941
|
-
}
|
|
5942
|
-
else {
|
|
5943
|
-
newPlayer.debt = this.debt.adding(amount);
|
|
5944
|
-
}
|
|
5945
|
-
const balanceInt = Int64.from(newPlayer.balance);
|
|
5946
|
-
const debtInt = Int64.from(newPlayer.debt);
|
|
5947
|
-
newPlayer.networth = balanceInt.subtracting(debtInt);
|
|
5948
|
-
return newPlayer;
|
|
5949
|
-
}
|
|
5950
|
-
withLoan(amount) {
|
|
5951
|
-
const newPlayer = Player.from(this);
|
|
5952
|
-
newPlayer.balance = this.balance.adding(amount);
|
|
5953
|
-
newPlayer.debt = this.debt.adding(amount);
|
|
5954
|
-
const balanceInt = Int64.from(newPlayer.balance);
|
|
5955
|
-
const debtInt = Int64.from(newPlayer.debt);
|
|
5956
|
-
newPlayer.networth = balanceInt.subtracting(debtInt);
|
|
5957
|
-
return newPlayer;
|
|
5958
|
-
}
|
|
5959
|
-
withLoanPayment(amount) {
|
|
5960
|
-
const actualPayment = this.maxPayback.lt(amount) ? this.maxPayback : amount;
|
|
5961
|
-
const newPlayer = Player.from(this);
|
|
5962
|
-
newPlayer.balance = this.balance.subtracting(actualPayment);
|
|
5963
|
-
newPlayer.debt = this.debt.subtracting(actualPayment);
|
|
5964
|
-
const balanceInt = Int64.from(newPlayer.balance);
|
|
5965
|
-
const debtInt = Int64.from(newPlayer.debt);
|
|
5966
|
-
newPlayer.networth = balanceInt.subtracting(debtInt);
|
|
5967
|
-
return newPlayer;
|
|
5968
|
-
}
|
|
5969
|
-
withSaleNetworth(sellPrice, paidPerUnit, quantity) {
|
|
5970
|
-
const cost = paidPerUnit.multiplying(quantity);
|
|
5971
|
-
const profit = sellPrice.gte(cost) ? sellPrice.subtracting(cost) : Int64.from(0);
|
|
5972
|
-
const newPlayer = Player.from(this);
|
|
5973
|
-
newPlayer.networth = Int64.from(this.networth).adding(profit);
|
|
5974
|
-
return newPlayer;
|
|
5975
|
-
}
|
|
5976
|
-
withSellGoods(sellPrice, paidPerUnit, quantity) {
|
|
5977
|
-
const cost = paidPerUnit.multiplying(quantity);
|
|
5978
|
-
const profit = sellPrice.gte(cost) ? sellPrice.subtracting(cost) : Int64.from(0);
|
|
5979
|
-
const newPlayer = Player.from(this);
|
|
5980
|
-
newPlayer.balance = this.balance.adding(sellPrice);
|
|
5981
|
-
newPlayer.networth = Int64.from(this.networth).adding(profit);
|
|
5982
|
-
return newPlayer;
|
|
5983
|
-
}
|
|
5984
|
-
withBuyGoods(purchaseCost) {
|
|
5985
|
-
const newPlayer = Player.from(this);
|
|
5986
|
-
newPlayer.balance = UInt64.from(this.balance).gte(purchaseCost)
|
|
5987
|
-
? this.balance.subtracting(purchaseCost)
|
|
5988
|
-
: UInt64.from(0);
|
|
5989
|
-
const balanceInt = Int64.from(newPlayer.balance);
|
|
5990
|
-
const debtInt = Int64.from(newPlayer.debt);
|
|
5991
|
-
newPlayer.networth = balanceInt.subtracting(debtInt);
|
|
5992
|
-
return newPlayer;
|
|
5993
|
-
}
|
|
5994
5625
|
}
|
|
5995
|
-
Player.MAX_LOAN = 1000000;
|
|
5996
|
-
Player.BASE_SHIP_COST = 500;
|
|
5997
|
-
Player.SHIP_COST_MULTIPLIER = 5;
|
|
5998
5626
|
|
|
5999
5627
|
class PlayersManager extends BaseManager {
|
|
6000
5628
|
async getPlayer(account) {
|
|
@@ -6006,211 +5634,7 @@ class PlayersManager extends BaseManager {
|
|
|
6006
5634
|
}
|
|
6007
5635
|
}
|
|
6008
5636
|
|
|
6009
|
-
function roll(gameSeed, rollSeed) {
|
|
6010
|
-
const hash = hash512(gameSeed, rollSeed);
|
|
6011
|
-
return (hash.array[0] << 8) | hash.array[1];
|
|
6012
|
-
}
|
|
6013
|
-
|
|
6014
|
-
var Rarities;
|
|
6015
|
-
(function (Rarities) {
|
|
6016
|
-
Rarities["legendary"] = "LEGENDARY";
|
|
6017
|
-
Rarities["epic"] = "EPIC";
|
|
6018
|
-
Rarities["rare"] = "RARE";
|
|
6019
|
-
Rarities["uncommon"] = "UNCOMMON";
|
|
6020
|
-
Rarities["common"] = "COMMON";
|
|
6021
|
-
Rarities["trash"] = "TRASH";
|
|
6022
|
-
})(Rarities || (Rarities = {}));
|
|
6023
|
-
function getRarity(gameSeed, epochSeed, location, goodId) {
|
|
6024
|
-
const seed = `${epochSeed}${location.x}${location.y}${goodId}rarity`;
|
|
6025
|
-
const rarityRoll = roll(gameSeed, seed);
|
|
6026
|
-
if (rarityRoll < 13) {
|
|
6027
|
-
return {
|
|
6028
|
-
rarity: Rarities.legendary,
|
|
6029
|
-
minMultiplier: 2.25,
|
|
6030
|
-
maxMultiplier: 3.0,
|
|
6031
|
-
};
|
|
6032
|
-
}
|
|
6033
|
-
else if (rarityRoll < 176) {
|
|
6034
|
-
return {
|
|
6035
|
-
rarity: Rarities.epic,
|
|
6036
|
-
minMultiplier: 1.75,
|
|
6037
|
-
maxMultiplier: 2.25,
|
|
6038
|
-
};
|
|
6039
|
-
}
|
|
6040
|
-
else if (rarityRoll < 996) {
|
|
6041
|
-
return {
|
|
6042
|
-
rarity: Rarities.rare,
|
|
6043
|
-
minMultiplier: 1.4,
|
|
6044
|
-
maxMultiplier: 1.75,
|
|
6045
|
-
};
|
|
6046
|
-
}
|
|
6047
|
-
else if (rarityRoll < 2966) {
|
|
6048
|
-
return {
|
|
6049
|
-
rarity: Rarities.uncommon,
|
|
6050
|
-
minMultiplier: 1.225,
|
|
6051
|
-
maxMultiplier: 1.4,
|
|
6052
|
-
};
|
|
6053
|
-
}
|
|
6054
|
-
else if (rarityRoll < 19568) {
|
|
6055
|
-
return {
|
|
6056
|
-
rarity: Rarities.common,
|
|
6057
|
-
minMultiplier: 1.07,
|
|
6058
|
-
maxMultiplier: 1.225,
|
|
6059
|
-
};
|
|
6060
|
-
}
|
|
6061
|
-
else if (rarityRoll < 45988) {
|
|
6062
|
-
return {
|
|
6063
|
-
rarity: Rarities.trash,
|
|
6064
|
-
minMultiplier: 1,
|
|
6065
|
-
maxMultiplier: 1.07,
|
|
6066
|
-
};
|
|
6067
|
-
}
|
|
6068
|
-
else if (rarityRoll < 62508) {
|
|
6069
|
-
return {
|
|
6070
|
-
rarity: Rarities.common,
|
|
6071
|
-
minMultiplier: 0.925,
|
|
6072
|
-
maxMultiplier: 1,
|
|
6073
|
-
};
|
|
6074
|
-
}
|
|
6075
|
-
else if (rarityRoll < 64518) {
|
|
6076
|
-
return {
|
|
6077
|
-
rarity: Rarities.uncommon,
|
|
6078
|
-
minMultiplier: 0.77,
|
|
6079
|
-
maxMultiplier: 0.925,
|
|
6080
|
-
};
|
|
6081
|
-
}
|
|
6082
|
-
else if (rarityRoll < 65437) {
|
|
6083
|
-
return {
|
|
6084
|
-
rarity: Rarities.rare,
|
|
6085
|
-
minMultiplier: 0.595,
|
|
6086
|
-
maxMultiplier: 0.77,
|
|
6087
|
-
};
|
|
6088
|
-
}
|
|
6089
|
-
else if (rarityRoll < 65523) {
|
|
6090
|
-
return {
|
|
6091
|
-
rarity: Rarities.epic,
|
|
6092
|
-
minMultiplier: 0.41,
|
|
6093
|
-
maxMultiplier: 0.595,
|
|
6094
|
-
};
|
|
6095
|
-
}
|
|
6096
|
-
else {
|
|
6097
|
-
return {
|
|
6098
|
-
rarity: Rarities.legendary,
|
|
6099
|
-
minMultiplier: 0.285,
|
|
6100
|
-
maxMultiplier: 0.41,
|
|
6101
|
-
};
|
|
6102
|
-
}
|
|
6103
|
-
}
|
|
6104
|
-
function getRarityMultiplier(gameSeed, epochSeed, location, goodId) {
|
|
6105
|
-
const rarity = getRarity(gameSeed, epochSeed, location, goodId);
|
|
6106
|
-
const range = rarity.maxMultiplier - rarity.minMultiplier;
|
|
6107
|
-
const seed = `${epochSeed}${location.x}${location.y}${goodId}raritymultiplier`;
|
|
6108
|
-
const r = roll(gameSeed, seed);
|
|
6109
|
-
return rarity.minMultiplier + (r / 65535) * range;
|
|
6110
|
-
}
|
|
6111
|
-
function getLocationMultiplier(gameSeed, location, goodId) {
|
|
6112
|
-
const seed = `${location.x}${location.y}${goodId}locationmultiplier`;
|
|
6113
|
-
const r = roll(gameSeed, seed);
|
|
6114
|
-
if (r < 13) {
|
|
6115
|
-
return 0.75;
|
|
6116
|
-
}
|
|
6117
|
-
else if (r < 176) {
|
|
6118
|
-
return 0.8;
|
|
6119
|
-
}
|
|
6120
|
-
else if (r < 996) {
|
|
6121
|
-
return 0.85;
|
|
6122
|
-
}
|
|
6123
|
-
else if (r < 2966) {
|
|
6124
|
-
return 0.9;
|
|
6125
|
-
}
|
|
6126
|
-
else if (r < 19568) {
|
|
6127
|
-
return 0.95;
|
|
6128
|
-
}
|
|
6129
|
-
else if (r < 45988) {
|
|
6130
|
-
return 1;
|
|
6131
|
-
}
|
|
6132
|
-
else if (r < 62508) {
|
|
6133
|
-
return 1.05;
|
|
6134
|
-
}
|
|
6135
|
-
else if (r < 64518) {
|
|
6136
|
-
return 1.1;
|
|
6137
|
-
}
|
|
6138
|
-
else if (r < 65437) {
|
|
6139
|
-
return 1.15;
|
|
6140
|
-
}
|
|
6141
|
-
else if (r < 65523) {
|
|
6142
|
-
return 1.2;
|
|
6143
|
-
}
|
|
6144
|
-
else {
|
|
6145
|
-
return 1.25;
|
|
6146
|
-
}
|
|
6147
|
-
}
|
|
6148
|
-
function getSupply(gameSeed, state, location, goodId) {
|
|
6149
|
-
const seed = `${state.seed}${location.x}${location.y}${goodId}supply`;
|
|
6150
|
-
const r = roll(gameSeed, seed);
|
|
6151
|
-
const percent = r / 65535;
|
|
6152
|
-
const epoch = 1 + Number(state.epoch) / 90;
|
|
6153
|
-
const ship = 1;
|
|
6154
|
-
const goodIdNum = Number(goodId);
|
|
6155
|
-
const base = Math.floor(128 / goodIdNum);
|
|
6156
|
-
return Math.floor(base * percent * ship * epoch);
|
|
6157
|
-
}
|
|
6158
|
-
function marketPrice(location, goodId, gameSeed, state) {
|
|
6159
|
-
const item = getItem(goodId);
|
|
6160
|
-
let price = Number(item.base_price);
|
|
6161
|
-
const rarityMultiplier = getRarityMultiplier(gameSeed, state.seed, location, goodId);
|
|
6162
|
-
price *= rarityMultiplier;
|
|
6163
|
-
const locationMultiplier = getLocationMultiplier(gameSeed, location, goodId);
|
|
6164
|
-
price *= locationMultiplier;
|
|
6165
|
-
const supply = getSupply(gameSeed, state, location, goodId);
|
|
6166
|
-
return ItemPrice.from({
|
|
6167
|
-
id: goodId,
|
|
6168
|
-
item,
|
|
6169
|
-
price: UInt32.from(price),
|
|
6170
|
-
supply: UInt16.from(supply),
|
|
6171
|
-
});
|
|
6172
|
-
}
|
|
6173
|
-
function marketPrices(location, gameSeed, state) {
|
|
6174
|
-
return getItems().map((item) => marketPrice(location, item.id, gameSeed, state));
|
|
6175
|
-
}
|
|
6176
|
-
|
|
6177
5637
|
class LocationsManager extends BaseManager {
|
|
6178
|
-
async getMarketPrice(location, goodId) {
|
|
6179
|
-
const game = await this.getGame();
|
|
6180
|
-
const state = await this.getState();
|
|
6181
|
-
return marketPrice(location, goodId, game.config.seed, state);
|
|
6182
|
-
}
|
|
6183
|
-
async getMarketPrices(location) {
|
|
6184
|
-
const game = await this.getGame();
|
|
6185
|
-
const state = await this.getState();
|
|
6186
|
-
return marketPrices(location, game.config.seed, state);
|
|
6187
|
-
}
|
|
6188
|
-
async getMarketPricesWithSupply(location) {
|
|
6189
|
-
const [game, state, supplyRows] = await Promise.all([
|
|
6190
|
-
this.getGame(),
|
|
6191
|
-
this.getState(),
|
|
6192
|
-
this.getSupplyRows(location),
|
|
6193
|
-
]);
|
|
6194
|
-
const prices = marketPrices(location, game.config.seed, state);
|
|
6195
|
-
const supplyMap = new Map();
|
|
6196
|
-
for (const row of supplyRows) {
|
|
6197
|
-
if (UInt64.from(row.epoch).equals(state.epoch)) {
|
|
6198
|
-
supplyMap.set(Number(row.item_id), Number(row.supply));
|
|
6199
|
-
}
|
|
6200
|
-
}
|
|
6201
|
-
return prices.map((price) => {
|
|
6202
|
-
const actualSupply = supplyMap.get(Number(price.id));
|
|
6203
|
-
if (actualSupply !== undefined) {
|
|
6204
|
-
return ItemPrice.from({
|
|
6205
|
-
id: price.id,
|
|
6206
|
-
item: price.item,
|
|
6207
|
-
price: price.price,
|
|
6208
|
-
supply: UInt64.from(actualSupply),
|
|
6209
|
-
});
|
|
6210
|
-
}
|
|
6211
|
-
return price;
|
|
6212
|
-
});
|
|
6213
|
-
}
|
|
6214
5638
|
async hasSystem(location) {
|
|
6215
5639
|
const game = await this.getGame();
|
|
6216
5640
|
return hasSystem(game.config.seed, location);
|
|
@@ -6219,40 +5643,6 @@ class LocationsManager extends BaseManager {
|
|
|
6219
5643
|
const game = await this.getGame();
|
|
6220
5644
|
return findNearbyPlanets(game.config.seed, origin, maxDistance);
|
|
6221
5645
|
}
|
|
6222
|
-
async getSupplyRows(location) {
|
|
6223
|
-
const hash = Checksum256.hash(Bytes.from(`${location.x}-${location.y}`, 'utf8'));
|
|
6224
|
-
return this.server.table('supply').all({
|
|
6225
|
-
index_position: 'secondary',
|
|
6226
|
-
from: hash,
|
|
6227
|
-
to: hash,
|
|
6228
|
-
});
|
|
6229
|
-
}
|
|
6230
|
-
async getLocationWithPrices(coords) {
|
|
6231
|
-
const location = toLocation(coords);
|
|
6232
|
-
const prices = await this.getMarketPrices(location.coordinates);
|
|
6233
|
-
location.setMarketPrices(prices);
|
|
6234
|
-
return location;
|
|
6235
|
-
}
|
|
6236
|
-
async getLocationWithSupply(coords) {
|
|
6237
|
-
const location = toLocation(coords);
|
|
6238
|
-
const [rows, state] = await Promise.all([
|
|
6239
|
-
this.getSupplyRows(location.coordinates),
|
|
6240
|
-
this.getState(),
|
|
6241
|
-
]);
|
|
6242
|
-
location.setLocationRows(rows, state.epoch);
|
|
6243
|
-
return location;
|
|
6244
|
-
}
|
|
6245
|
-
async getLocationComplete(coords) {
|
|
6246
|
-
const location = toLocation(coords);
|
|
6247
|
-
const [prices, rows, state] = await Promise.all([
|
|
6248
|
-
this.getMarketPrices(location.coordinates),
|
|
6249
|
-
this.getSupplyRows(location.coordinates),
|
|
6250
|
-
this.getState(),
|
|
6251
|
-
]);
|
|
6252
|
-
location.setMarketPrices(prices);
|
|
6253
|
-
location.setLocationRows(rows, state.epoch);
|
|
6254
|
-
return location;
|
|
6255
|
-
}
|
|
6256
5646
|
async getLocationEntity(id) {
|
|
6257
5647
|
const row = await this.server.table('location').get(UInt64.from(id));
|
|
6258
5648
|
return row ?? undefined;
|
|
@@ -6266,778 +5656,55 @@ class LocationsManager extends BaseManager {
|
|
|
6266
5656
|
}
|
|
6267
5657
|
}
|
|
6268
5658
|
|
|
6269
|
-
|
|
6270
|
-
|
|
6271
|
-
|
|
6272
|
-
|
|
6273
|
-
}
|
|
6274
|
-
function calculateMaxTradeQuantity(ship, player, goodPrice) {
|
|
6275
|
-
const pricePerUnit = UInt32.from(goodPrice.price);
|
|
6276
|
-
const massPerUnit = UInt32.from(goodPrice.item.mass);
|
|
6277
|
-
const spaceForQuantity = ship.availableCapacity.dividing(massPerUnit);
|
|
6278
|
-
const affordableQuantity = player.balance.dividing(pricePerUnit);
|
|
6279
|
-
const maxQuantity = spaceForQuantity.lt(affordableQuantity)
|
|
6280
|
-
? spaceForQuantity
|
|
6281
|
-
: affordableQuantity;
|
|
6282
|
-
return {
|
|
6283
|
-
maxQuantity: Number(maxQuantity),
|
|
6284
|
-
totalCost: Number(maxQuantity.multiplying(pricePerUnit)),
|
|
6285
|
-
totalMass: UInt64.from(maxQuantity.multiplying(massPerUnit)),
|
|
6286
|
-
affordableQuantity: Number(affordableQuantity),
|
|
6287
|
-
spaceForQuantity: Number(spaceForQuantity),
|
|
6288
|
-
};
|
|
6289
|
-
}
|
|
6290
|
-
function calculateTradeProfit(quantity, buyPrice, sellPrice) {
|
|
6291
|
-
const qty = UInt32.from(quantity);
|
|
6292
|
-
const buy = UInt32.from(buyPrice);
|
|
6293
|
-
const sell = UInt32.from(sellPrice);
|
|
6294
|
-
const cost = UInt64.from(qty).multiplying(buy);
|
|
6295
|
-
const revenue = UInt64.from(qty).multiplying(sell);
|
|
6296
|
-
const profit = Int64.from(revenue).subtracting(cost);
|
|
6297
|
-
const margin = cost.gt(UInt64.zero) ? (Number(profit) / Number(cost)) * 100 : 0;
|
|
6298
|
-
return { revenue, cost, profit, margin };
|
|
6299
|
-
}
|
|
6300
|
-
function calculateProfitPerMass(quantity, buyPrice, sellPrice, massPerUnit) {
|
|
6301
|
-
const profit = (sellPrice - buyPrice) * quantity;
|
|
6302
|
-
const totalMass = quantity * massPerUnit;
|
|
6303
|
-
return totalMass > 0 ? profit / totalMass : 0;
|
|
6304
|
-
}
|
|
6305
|
-
function calculateProfitPerSecond(profit, travelTimeSeconds) {
|
|
6306
|
-
const t = UInt32.from(travelTimeSeconds);
|
|
6307
|
-
return t.gt(UInt32.zero) ? Number(profit) / Number(t) : 0;
|
|
6308
|
-
}
|
|
6309
|
-
function findBestItemToTrade(ship, player, originPrices, destPrices, travelTimeSeconds) {
|
|
6310
|
-
let bestTrade = null;
|
|
6311
|
-
let bestProfitPerSecond = 0;
|
|
6312
|
-
for (const originPrice of originPrices) {
|
|
6313
|
-
const destPrice = destPrices.find((p) => p.id.equals(originPrice.id));
|
|
6314
|
-
if (!destPrice)
|
|
6315
|
-
continue;
|
|
6316
|
-
if (!isProfitable(originPrice.price, destPrice.price))
|
|
6317
|
-
continue;
|
|
6318
|
-
const calc = calculateMaxTradeQuantity(ship, player, originPrice);
|
|
6319
|
-
if (calc.maxQuantity === 0)
|
|
6320
|
-
continue;
|
|
6321
|
-
const tradeResult = calculateTradeProfit(calc.maxQuantity, originPrice.price, destPrice.price);
|
|
6322
|
-
const profitPerSecond = calculateProfitPerSecond(tradeResult.profit, travelTimeSeconds);
|
|
6323
|
-
if (profitPerSecond > bestProfitPerSecond) {
|
|
6324
|
-
bestProfitPerSecond = profitPerSecond;
|
|
6325
|
-
bestTrade = {
|
|
6326
|
-
item: originPrice,
|
|
6327
|
-
quantity: calc.maxQuantity,
|
|
6328
|
-
profit: Number(tradeResult.profit),
|
|
6329
|
-
profitPerSecond,
|
|
6330
|
-
margin: tradeResult.margin,
|
|
6331
|
-
};
|
|
6332
|
-
}
|
|
5659
|
+
class EpochsManager extends BaseManager {
|
|
5660
|
+
async getCurrentHeight() {
|
|
5661
|
+
const game = await this.getGame();
|
|
5662
|
+
return getCurrentEpoch(game);
|
|
6333
5663
|
}
|
|
6334
|
-
|
|
6335
|
-
|
|
6336
|
-
|
|
6337
|
-
|
|
6338
|
-
}
|
|
6339
|
-
function isProfitable(buyPrice, sellPrice) {
|
|
6340
|
-
return UInt32.from(sellPrice).gt(UInt32.from(buyPrice));
|
|
6341
|
-
}
|
|
6342
|
-
function calculateROI(cost, profit) {
|
|
6343
|
-
return cost > 0 ? (profit / cost) * 100 : 0;
|
|
6344
|
-
}
|
|
6345
|
-
|
|
6346
|
-
async function findDealsForShip(ship, originLocation, getNearbyLocations, getMarketPrices, options = {}) {
|
|
6347
|
-
const { maxDeals = 10, maxDistance = 20 * PRECISION, playerBalance, minProfitPerSecond = 0, minMarginPercent = 0, availableSpace, } = options;
|
|
6348
|
-
const balance = playerBalance !== undefined ? UInt64.from(playerBalance) : undefined;
|
|
6349
|
-
const origin = Location.from(originLocation);
|
|
6350
|
-
const originPrices = await getMarketPrices(originLocation);
|
|
6351
|
-
origin.setMarketPrices(originPrices);
|
|
6352
|
-
const nearbyLocations = await getNearbyLocations(originLocation, maxDistance);
|
|
6353
|
-
const deals = [];
|
|
6354
|
-
const currentMass = ship.totalMass;
|
|
6355
|
-
const shipCapacity = ship.maxCapacity;
|
|
6356
|
-
const effectiveAvailableMass = availableSpace !== undefined
|
|
6357
|
-
? UInt64.from(availableSpace)
|
|
6358
|
-
: currentMass.lt(shipCapacity)
|
|
6359
|
-
? shipCapacity.subtracting(currentMass)
|
|
6360
|
-
: UInt64.zero;
|
|
6361
|
-
for (const destLocation of nearbyLocations) {
|
|
6362
|
-
const destinationPrices = await getMarketPrices(destLocation.coordinates);
|
|
6363
|
-
destLocation.setMarketPrices(destinationPrices);
|
|
6364
|
-
const distance = distanceBetweenCoordinates(originLocation, destLocation.coordinates);
|
|
6365
|
-
for (const originGood of originPrices) {
|
|
6366
|
-
const destGood = destinationPrices.find((g) => g.id.equals(originGood.id));
|
|
6367
|
-
if (!destGood)
|
|
6368
|
-
continue;
|
|
6369
|
-
if (!isProfitable(originGood.price, destGood.price) ||
|
|
6370
|
-
originGood.supply.equals(UInt16.from(0))) {
|
|
6371
|
-
continue;
|
|
6372
|
-
}
|
|
6373
|
-
const canAfford = balance !== undefined
|
|
6374
|
-
? balance.dividing(originGood.price)
|
|
6375
|
-
: UInt64.from(Number.MAX_SAFE_INTEGER);
|
|
6376
|
-
const canHaul = effectiveAvailableMass.dividing(originGood.item.mass);
|
|
6377
|
-
const supplyLimit = UInt64.from(originGood.supply);
|
|
6378
|
-
let maxQuantity = canAfford;
|
|
6379
|
-
if (canHaul.lt(maxQuantity))
|
|
6380
|
-
maxQuantity = canHaul;
|
|
6381
|
-
if (supplyLimit.lt(maxQuantity))
|
|
6382
|
-
maxQuantity = supplyLimit;
|
|
6383
|
-
if (maxQuantity.equals(UInt64.zero))
|
|
6384
|
-
continue;
|
|
6385
|
-
const cargoMass = originGood.item.mass.multiplying(maxQuantity);
|
|
6386
|
-
const availableSpaceUInt = UInt64.from(availableSpace);
|
|
6387
|
-
const baseMass = availableSpace !== undefined
|
|
6388
|
-
? shipCapacity.gte(availableSpaceUInt)
|
|
6389
|
-
? shipCapacity.subtracting(availableSpaceUInt)
|
|
6390
|
-
: UInt64.zero
|
|
6391
|
-
: currentMass;
|
|
6392
|
-
const totalMass = baseMass.adding(cargoMass);
|
|
6393
|
-
const needsRecharge = !ship.hasEnergyFor(distance);
|
|
6394
|
-
const travelEstimate = estimateTravelTime(ship, totalMass, distance, {
|
|
6395
|
-
needsRecharge,
|
|
6396
|
-
loadMass: Number(cargoMass),
|
|
6397
|
-
});
|
|
6398
|
-
const tradeCalc = calculateTradeProfit(maxQuantity, originGood.price, destGood.price);
|
|
6399
|
-
const profitPerUnit = destGood.price.subtracting(originGood.price);
|
|
6400
|
-
const profitPerSecond = calculateProfitPerSecond(tradeCalc.profit, travelEstimate.total);
|
|
6401
|
-
if (profitPerSecond < minProfitPerSecond)
|
|
6402
|
-
continue;
|
|
6403
|
-
if (tradeCalc.margin < minMarginPercent)
|
|
6404
|
-
continue;
|
|
6405
|
-
deals.push({
|
|
6406
|
-
origin,
|
|
6407
|
-
destination: destLocation,
|
|
6408
|
-
item: originGood,
|
|
6409
|
-
distance,
|
|
6410
|
-
supply: originGood.supply,
|
|
6411
|
-
buyPrice: originGood.price,
|
|
6412
|
-
sellPrice: destGood.price,
|
|
6413
|
-
profitPerUnit,
|
|
6414
|
-
maxQuantity: UInt32.from(maxQuantity),
|
|
6415
|
-
totalProfit: tradeCalc.profit,
|
|
6416
|
-
travelTime: travelEstimate.total,
|
|
6417
|
-
travelTimeBreakdown: travelEstimate,
|
|
6418
|
-
profitPerSecond,
|
|
6419
|
-
marginPercent: tradeCalc.margin,
|
|
6420
|
-
});
|
|
6421
|
-
}
|
|
5664
|
+
async getCurrent() {
|
|
5665
|
+
const game = await this.getGame();
|
|
5666
|
+
const epoch = await this.getCurrentHeight();
|
|
5667
|
+
return getEpochInfo(game, epoch);
|
|
6422
5668
|
}
|
|
6423
|
-
|
|
6424
|
-
|
|
6425
|
-
|
|
6426
|
-
async function findBestDeal(ship, originLocation, getNearbyLocations, getMarketPrices, options = {}) {
|
|
6427
|
-
const deals = await findDealsForShip(ship, originLocation, getNearbyLocations, getMarketPrices, {
|
|
6428
|
-
...options,
|
|
6429
|
-
maxDeals: 1,
|
|
6430
|
-
});
|
|
6431
|
-
return deals[0];
|
|
6432
|
-
}
|
|
6433
|
-
|
|
6434
|
-
function calculateCargoMass(cargo) {
|
|
6435
|
-
let mass = UInt32.from(0);
|
|
6436
|
-
for (const c of cargo) {
|
|
6437
|
-
if (UInt64.from(c.quantity).gt(UInt64.zero)) {
|
|
6438
|
-
const goodMass = getItem(c.item_id).mass;
|
|
6439
|
-
mass = mass.adding(goodMass.multiplying(c.quantity));
|
|
6440
|
-
}
|
|
5669
|
+
async getByHeight(height) {
|
|
5670
|
+
const game = await this.getGame();
|
|
5671
|
+
return getEpochInfo(game, UInt64.from(height));
|
|
6441
5672
|
}
|
|
6442
|
-
|
|
6443
|
-
|
|
6444
|
-
|
|
6445
|
-
|
|
6446
|
-
|
|
6447
|
-
!ship.loaders ||
|
|
6448
|
-
ship.loaders.quantity.equals(UInt32.zero)) {
|
|
6449
|
-
return UInt32.zero;
|
|
5673
|
+
async getTimeRemaining() {
|
|
5674
|
+
const epochInfo = await this.getCurrent();
|
|
5675
|
+
const now = Date.now();
|
|
5676
|
+
const endTime = epochInfo.end.getTime();
|
|
5677
|
+
return Math.max(0, endTime - now);
|
|
6450
5678
|
}
|
|
6451
|
-
|
|
6452
|
-
|
|
6453
|
-
|
|
6454
|
-
|
|
6455
|
-
|
|
6456
|
-
|
|
6457
|
-
|
|
6458
|
-
if (
|
|
6459
|
-
|
|
6460
|
-
|
|
6461
|
-
|
|
6462
|
-
|
|
6463
|
-
|
|
6464
|
-
|
|
6465
|
-
|
|
5679
|
+
async getProgress() {
|
|
5680
|
+
const epochInfo = await this.getCurrent();
|
|
5681
|
+
const now = Date.now();
|
|
5682
|
+
const startTime = epochInfo.start.getTime();
|
|
5683
|
+
const endTime = epochInfo.end.getTime();
|
|
5684
|
+
const duration = endTime - startTime;
|
|
5685
|
+
const elapsed = now - startTime;
|
|
5686
|
+
if (elapsed <= 0)
|
|
5687
|
+
return 0;
|
|
5688
|
+
if (elapsed >= duration)
|
|
5689
|
+
return 1;
|
|
5690
|
+
return elapsed / duration;
|
|
5691
|
+
}
|
|
5692
|
+
async fitsInCurrentEpoch(durationMs) {
|
|
5693
|
+
const remaining = await this.getTimeRemaining();
|
|
5694
|
+
return durationMs <= remaining;
|
|
6466
5695
|
}
|
|
6467
|
-
return {
|
|
6468
|
-
revenue,
|
|
6469
|
-
cost,
|
|
6470
|
-
profit: Int64.from(revenue).subtracting(cost),
|
|
6471
|
-
};
|
|
6472
5696
|
}
|
|
6473
|
-
|
|
6474
|
-
|
|
6475
|
-
|
|
6476
|
-
|
|
6477
|
-
|
|
6478
|
-
|
|
6479
|
-
|
|
6480
|
-
|
|
6481
|
-
|
|
6482
|
-
|
|
6483
|
-
|
|
6484
|
-
items.push({
|
|
6485
|
-
goodId: c.item_id,
|
|
6486
|
-
goodName: c.item?.name ?? `Item #${goodId}`,
|
|
6487
|
-
quantity: UInt32.from(c.quantity),
|
|
6488
|
-
pricePerUnit,
|
|
6489
|
-
revenue,
|
|
6490
|
-
costPerUnit: c.unit_cost,
|
|
6491
|
-
profit,
|
|
6492
|
-
});
|
|
6493
|
-
}
|
|
6494
|
-
return items;
|
|
6495
|
-
}
|
|
6496
|
-
function createSellAndTradeOption(saleRevenue, saleCost, deal, cargoSale, unloadTime) {
|
|
6497
|
-
const saleProfit = Int64.from(saleRevenue).subtracting(saleCost);
|
|
6498
|
-
const totalProfit = saleProfit.adding(deal.totalProfit);
|
|
6499
|
-
const profitPerSecond = deal.travelTime.gt(UInt32.zero)
|
|
6500
|
-
? Number(totalProfit) / Number(deal.travelTime)
|
|
6501
|
-
: Number(totalProfit);
|
|
6502
|
-
const unload = unloadTime ?? UInt32.zero;
|
|
6503
|
-
const breakdown = deal.travelTimeBreakdown
|
|
6504
|
-
? {
|
|
6505
|
-
unloadTime: unload,
|
|
6506
|
-
loadTime: deal.travelTimeBreakdown.loadTime,
|
|
6507
|
-
rechargeTime: deal.travelTimeBreakdown.rechargeTime,
|
|
6508
|
-
flightTime: deal.travelTimeBreakdown.flightTime,
|
|
6509
|
-
total: unload
|
|
6510
|
-
.adding(deal.travelTimeBreakdown.loadTime)
|
|
6511
|
-
.adding(deal.travelTimeBreakdown.rechargeTime)
|
|
6512
|
-
.adding(deal.travelTimeBreakdown.flightTime),
|
|
6513
|
-
}
|
|
6514
|
-
: undefined;
|
|
6515
|
-
return {
|
|
6516
|
-
id: `sell-trade-${deal.destination.coordinates.x}-${deal.destination.coordinates.y}-${deal.item.id}`,
|
|
6517
|
-
type: 'sell-and-trade',
|
|
6518
|
-
title: `Trade ${deal.item.item.name}`,
|
|
6519
|
-
description: `Sell cargo, buy ${deal.maxQuantity} ${deal.item.item.name}, deliver to (${deal.destination.coordinates.x}, ${deal.destination.coordinates.y})`,
|
|
6520
|
-
reason: `${deal.marginPercent.toFixed(0)}% margin, ${deal.profitPerSecond.toFixed(1)}/s profit rate`,
|
|
6521
|
-
recommended: false,
|
|
6522
|
-
highestProfit: false,
|
|
6523
|
-
estimatedProfit: saleProfit,
|
|
6524
|
-
saleRevenue,
|
|
6525
|
-
purchaseCost: UInt64.from(deal.buyPrice).multiplying(deal.maxQuantity),
|
|
6526
|
-
nextTradeProfit: deal.totalProfit,
|
|
6527
|
-
profitPerSecond,
|
|
6528
|
-
marginPercent: deal.marginPercent,
|
|
6529
|
-
destination: deal.destination,
|
|
6530
|
-
deal,
|
|
6531
|
-
travelTime: breakdown?.total ?? deal.travelTime,
|
|
6532
|
-
travelTimeBreakdown: breakdown,
|
|
6533
|
-
cargoSale,
|
|
6534
|
-
cargoProfitLoss: saleProfit,
|
|
6535
|
-
};
|
|
6536
|
-
}
|
|
6537
|
-
function createTravelToSellOption(currentRevenue, cargoCost, betterSale, cargo, destPrices) {
|
|
6538
|
-
const totalQuantity = cargo.reduce((s, c) => s.adding(UInt64.from(c.quantity)), UInt64.zero);
|
|
6539
|
-
const currentPrice = totalQuantity.gt(UInt64.zero)
|
|
6540
|
-
? UInt32.from(currentRevenue.dividing(totalQuantity))
|
|
6541
|
-
: UInt32.zero;
|
|
6542
|
-
const priceIncrease = betterSale.price.gte(currentPrice)
|
|
6543
|
-
? betterSale.price.subtracting(currentPrice)
|
|
6544
|
-
: UInt32.zero;
|
|
6545
|
-
const hasDealAfter = !!betterSale.bestDealAfterSale;
|
|
6546
|
-
const cargoSale = destPrices ? buildCargoSaleItems(cargo, destPrices) : undefined;
|
|
6547
|
-
const cargoProfitLoss = cargoSale?.reduce((sum, item) => sum.adding(item.profit), Int64.zero);
|
|
6548
|
-
const saleProfit = Int64.from(betterSale.revenue).subtracting(cargoCost);
|
|
6549
|
-
const profitPerSecond = betterSale.travelTime.gt(UInt32.zero)
|
|
6550
|
-
? Number(saleProfit) / Number(betterSale.travelTime)
|
|
6551
|
-
: Number(saleProfit);
|
|
6552
|
-
return {
|
|
6553
|
-
id: `travel-sell-${betterSale.location.coordinates.x}-${betterSale.location.coordinates.y}`,
|
|
6554
|
-
type: 'travel-to-sell',
|
|
6555
|
-
title: 'Move to Sell Nearby',
|
|
6556
|
-
description: `Keep cargo, travel to better market${hasDealAfter ? ', then trade' : ''}`,
|
|
6557
|
-
reason: `+${Number(priceIncrease).toLocaleString()}/unit better price${hasDealAfter ? ', good deals available there' : ''}`,
|
|
6558
|
-
recommended: false,
|
|
6559
|
-
highestProfit: false,
|
|
6560
|
-
estimatedProfit: betterSale.improvement,
|
|
6561
|
-
saleRevenue: betterSale.revenue,
|
|
6562
|
-
profitPerSecond,
|
|
6563
|
-
saleLocation: betterSale.location,
|
|
6564
|
-
salePrice: betterSale.price,
|
|
6565
|
-
currentPrice,
|
|
6566
|
-
destination: betterSale.location,
|
|
6567
|
-
deal: betterSale.bestDealAfterSale,
|
|
6568
|
-
travelTime: betterSale.travelTime,
|
|
6569
|
-
travelTimeBreakdown: betterSale.travelTimeBreakdown,
|
|
6570
|
-
cargoSale,
|
|
6571
|
-
cargoProfitLoss,
|
|
6572
|
-
};
|
|
6573
|
-
}
|
|
6574
|
-
function createSellAndRepositionOption(saleRevenue, saleCost, reposition, cargoSale) {
|
|
6575
|
-
const saleProfit = Int64.from(saleRevenue).subtracting(saleCost);
|
|
6576
|
-
const deal = reposition.bestDeal;
|
|
6577
|
-
return {
|
|
6578
|
-
id: `sell-reposition-${reposition.location.coordinates.x}-${reposition.location.coordinates.y}`,
|
|
6579
|
-
type: 'sell-and-reposition',
|
|
6580
|
-
title: 'Sell & Move',
|
|
6581
|
-
description: `Sell cargo here, travel empty to buy ${deal.item.item.name}`,
|
|
6582
|
-
reason: `No good trades here — ${deal.marginPercent.toFixed(0)}% margin trade available at destination`,
|
|
6583
|
-
recommended: false,
|
|
6584
|
-
highestProfit: false,
|
|
6585
|
-
estimatedProfit: saleProfit,
|
|
6586
|
-
saleRevenue,
|
|
6587
|
-
nextTradeProfit: deal.totalProfit,
|
|
6588
|
-
profitPerSecond: deal.profitPerSecond,
|
|
6589
|
-
marginPercent: deal.marginPercent,
|
|
6590
|
-
destination: reposition.location,
|
|
6591
|
-
deal: reposition.bestDeal,
|
|
6592
|
-
travelTime: reposition.travelTime,
|
|
6593
|
-
travelTimeBreakdown: reposition.travelTimeBreakdown,
|
|
6594
|
-
cargoSale,
|
|
6595
|
-
cargoProfitLoss: saleProfit,
|
|
6596
|
-
};
|
|
6597
|
-
}
|
|
6598
|
-
function createOrbitOption() {
|
|
6599
|
-
return {
|
|
6600
|
-
id: 'orbit',
|
|
6601
|
-
type: 'orbit',
|
|
6602
|
-
title: 'Enter Orbit',
|
|
6603
|
-
description: 'Arrive at this location, keep cargo',
|
|
6604
|
-
reason: 'Keep cargo, decide later',
|
|
6605
|
-
recommended: false,
|
|
6606
|
-
highestProfit: false,
|
|
6607
|
-
estimatedProfit: UInt64.zero,
|
|
6608
|
-
};
|
|
6609
|
-
}
|
|
6610
|
-
function createSellAndStayOption(saleRevenue, saleCost, cargoSale, unloadTime) {
|
|
6611
|
-
const saleProfit = Int64.from(saleRevenue).subtracting(saleCost);
|
|
6612
|
-
return {
|
|
6613
|
-
id: 'sell-stay',
|
|
6614
|
-
type: 'sell-and-stay',
|
|
6615
|
-
title: 'Sell & Enter Orbit',
|
|
6616
|
-
description: `Sell cargo, remain docked at this location`,
|
|
6617
|
-
reason: 'Collect profits now, decide next move later',
|
|
6618
|
-
recommended: false,
|
|
6619
|
-
highestProfit: false,
|
|
6620
|
-
estimatedProfit: saleProfit,
|
|
6621
|
-
saleRevenue,
|
|
6622
|
-
cargoSale,
|
|
6623
|
-
cargoProfitLoss: saleProfit,
|
|
6624
|
-
travelTimeBreakdown: unloadTime !== undefined
|
|
6625
|
-
? {
|
|
6626
|
-
unloadTime,
|
|
6627
|
-
loadTime: UInt32.zero,
|
|
6628
|
-
rechargeTime: UInt32.zero,
|
|
6629
|
-
flightTime: UInt32.zero,
|
|
6630
|
-
total: unloadTime,
|
|
6631
|
-
}
|
|
6632
|
-
: undefined,
|
|
6633
|
-
};
|
|
6634
|
-
}
|
|
6635
|
-
function createExploreOption(destination, travelTime, discountedGood, travelTimeBreakdown, potentialDeals) {
|
|
6636
|
-
let description = 'Travel to look for trading opportunities';
|
|
6637
|
-
let reason = 'No profitable trades found nearby';
|
|
6638
|
-
if (potentialDeals && potentialDeals.length > 0) {
|
|
6639
|
-
const bestDeal = potentialDeals[0];
|
|
6640
|
-
description = `${potentialDeals.length} deal${potentialDeals.length > 1 ? 's' : ''} available — best: ${bestDeal.goodName}`;
|
|
6641
|
-
reason = `${bestDeal.marginPercent.toFixed(0)}% margin, ${bestDeal.profitPerSecond.toFixed(1)}/s`;
|
|
6642
|
-
}
|
|
6643
|
-
else if (discountedGood) {
|
|
6644
|
-
const { name, discountPercent } = discountedGood;
|
|
6645
|
-
if (discountPercent >= 60) {
|
|
6646
|
-
description = `${name} at ${discountPercent}% off`;
|
|
6647
|
-
reason = 'Legendary find — extremely rare opportunity';
|
|
6648
|
-
}
|
|
6649
|
-
else if (discountPercent >= 40) {
|
|
6650
|
-
description = `${name} at ${discountPercent}% off`;
|
|
6651
|
-
reason = 'Epic deal — exceptional prices';
|
|
6652
|
-
}
|
|
6653
|
-
else if (discountPercent >= 23) {
|
|
6654
|
-
description = `${name} at ${discountPercent}% off`;
|
|
6655
|
-
reason = 'Rare discount — well below market';
|
|
6656
|
-
}
|
|
6657
|
-
else if (discountPercent >= 8) {
|
|
6658
|
-
description = `${name} at ${discountPercent}% off`;
|
|
6659
|
-
reason = `Good prices on ${name}`;
|
|
6660
|
-
}
|
|
6661
|
-
else {
|
|
6662
|
-
description = `${name} slightly discounted`;
|
|
6663
|
-
reason = 'Minor savings available';
|
|
6664
|
-
}
|
|
6665
|
-
}
|
|
6666
|
-
return {
|
|
6667
|
-
id: `explore-${destination.coordinates.x}-${destination.coordinates.y}`,
|
|
6668
|
-
type: 'explore',
|
|
6669
|
-
title: 'Move',
|
|
6670
|
-
description,
|
|
6671
|
-
reason,
|
|
6672
|
-
recommended: false,
|
|
6673
|
-
highestProfit: false,
|
|
6674
|
-
estimatedProfit: UInt64.zero,
|
|
6675
|
-
destination,
|
|
6676
|
-
travelTime,
|
|
6677
|
-
travelTimeBreakdown,
|
|
6678
|
-
discountedGood,
|
|
6679
|
-
potentialDeals,
|
|
6680
|
-
};
|
|
6681
|
-
}
|
|
6682
|
-
async function analyzeCollectOptions(ship, arrivedAt, callbacks, options = {}) {
|
|
6683
|
-
const { playerBalance = Infinity, minSaleImprovement = 100 } = options;
|
|
6684
|
-
const cargo = ship.sellableCargo;
|
|
6685
|
-
const hasCargo = cargo.length > 0;
|
|
6686
|
-
const originPrices = await callbacks.getMarketPrices(arrivedAt);
|
|
6687
|
-
const priceMap = new Map(originPrices.map((p) => [Number(p.id), p.price]));
|
|
6688
|
-
const { revenue: cargoValueHere, cost: cargoCost } = analyzeCargoSale(cargo, priceMap);
|
|
6689
|
-
const cargoSaleHere = buildCargoSaleItems(cargo, priceMap);
|
|
6690
|
-
const collectOptions = [];
|
|
6691
|
-
const maxDistance = options.maxDistance ?? Number(ship.maxDistance);
|
|
6692
|
-
const nearbyLocations = await callbacks.getNearbyLocations(arrivedAt, maxDistance);
|
|
6693
|
-
const dealsAtOrigin = await findDealsForShip(ship, arrivedAt, callbacks.getNearbyLocations, callbacks.getMarketPrices, {
|
|
6694
|
-
maxDeals: 5,
|
|
6695
|
-
maxDistance,
|
|
6696
|
-
playerBalance: playerBalance + Number(cargoValueHere),
|
|
6697
|
-
availableSpace: Number(ship.maxCapacity),
|
|
6698
|
-
});
|
|
6699
|
-
if (hasCargo && dealsAtOrigin.length > 0) {
|
|
6700
|
-
const cargoGoodIds = new Set(cargo.map((c) => Number(c.item_id)));
|
|
6701
|
-
for (const deal of dealsAtOrigin.slice(0, 3)) {
|
|
6702
|
-
const dealGoodId = Number(deal.item.id);
|
|
6703
|
-
if (cargoGoodIds.has(dealGoodId)) {
|
|
6704
|
-
continue;
|
|
6705
|
-
}
|
|
6706
|
-
const unloadTime = calculateUnloadTime(ship, cargo);
|
|
6707
|
-
const option = createSellAndTradeOption(cargoValueHere, cargoCost, deal, cargoSaleHere, unloadTime);
|
|
6708
|
-
collectOptions.push(option);
|
|
6709
|
-
}
|
|
6710
|
-
}
|
|
6711
|
-
if (hasCargo) {
|
|
6712
|
-
const locationsToCheck = nearbyLocations.slice(0, 10);
|
|
6713
|
-
const allDestPrices = await Promise.all(locationsToCheck.map((loc) => callbacks.getMarketPrices(loc.coordinates)));
|
|
6714
|
-
const candidateLocations = [];
|
|
6715
|
-
for (let i = 0; i < locationsToCheck.length; i++) {
|
|
6716
|
-
const destLocation = locationsToCheck[i];
|
|
6717
|
-
const destPrices = allDestPrices[i];
|
|
6718
|
-
const destPriceMap = new Map(destPrices.map((p) => [Number(p.id), p.price]));
|
|
6719
|
-
const { revenue: destRevenue } = analyzeCargoSale(cargo, destPriceMap);
|
|
6720
|
-
const improvement = Int64.from(destRevenue).subtracting(cargoValueHere);
|
|
6721
|
-
if (improvement.gt(Int64.from(minSaleImprovement))) {
|
|
6722
|
-
candidateLocations.push({ destLocation, destPriceMap, destRevenue, improvement });
|
|
6723
|
-
}
|
|
6724
|
-
}
|
|
6725
|
-
const betterSaleResults = await Promise.all(candidateLocations.map(async ({ destLocation, destPriceMap, destRevenue, improvement }) => {
|
|
6726
|
-
const distance = distanceBetweenCoordinates(arrivedAt, destLocation.coordinates);
|
|
6727
|
-
const needsRecharge = !ship.hasEnergyFor(distance);
|
|
6728
|
-
const travelEstimate = estimateTravelTime(ship, ship.totalMass, distance, {
|
|
6729
|
-
needsRecharge,
|
|
6730
|
-
});
|
|
6731
|
-
const dealsAfterSale = await findDealsForShip(ship, destLocation.coordinates, callbacks.getNearbyLocations, callbacks.getMarketPrices, {
|
|
6732
|
-
maxDeals: 1,
|
|
6733
|
-
maxDistance,
|
|
6734
|
-
playerBalance: destRevenue,
|
|
6735
|
-
availableSpace: Number(ship.maxCapacity),
|
|
6736
|
-
});
|
|
6737
|
-
return {
|
|
6738
|
-
better: {
|
|
6739
|
-
location: destLocation,
|
|
6740
|
-
price: UInt32.from(destRevenue.dividing(cargo.reduce((s, c) => s.adding(c.quantity), UInt64.zero))),
|
|
6741
|
-
revenue: destRevenue,
|
|
6742
|
-
improvement,
|
|
6743
|
-
bestDealAfterSale: dealsAfterSale[0],
|
|
6744
|
-
distance,
|
|
6745
|
-
travelTime: travelEstimate.total,
|
|
6746
|
-
travelTimeBreakdown: travelEstimate,
|
|
6747
|
-
},
|
|
6748
|
-
destPriceMap,
|
|
6749
|
-
};
|
|
6750
|
-
}));
|
|
6751
|
-
const betterSaleLocations = betterSaleResults.sort((a, b) => Number(b.better.improvement) - Number(a.better.improvement));
|
|
6752
|
-
for (const { better, destPriceMap } of betterSaleLocations.slice(0, 2)) {
|
|
6753
|
-
const option = createTravelToSellOption(cargoValueHere, cargoCost, better, cargo, destPriceMap);
|
|
6754
|
-
collectOptions.push(option);
|
|
6755
|
-
}
|
|
6756
|
-
}
|
|
6757
|
-
if (hasCargo && dealsAtOrigin.length === 0) {
|
|
6758
|
-
const locationsToCheck = nearbyLocations.slice(0, 10);
|
|
6759
|
-
const allDealsAtDest = await Promise.all(locationsToCheck.map((destLocation) => findDealsForShip(ship, destLocation.coordinates, callbacks.getNearbyLocations, callbacks.getMarketPrices, {
|
|
6760
|
-
maxDeals: 1,
|
|
6761
|
-
maxDistance,
|
|
6762
|
-
playerBalance: UInt64.from(playerBalance).adding(cargoValueHere),
|
|
6763
|
-
availableSpace: Number(ship.maxCapacity),
|
|
6764
|
-
})));
|
|
6765
|
-
const repositionLocations = [];
|
|
6766
|
-
for (let i = 0; i < locationsToCheck.length; i++) {
|
|
6767
|
-
const destLocation = locationsToCheck[i];
|
|
6768
|
-
const dealsAtDest = allDealsAtDest[i];
|
|
6769
|
-
if (dealsAtDest.length > 0) {
|
|
6770
|
-
const distance = distanceBetweenCoordinates(arrivedAt, destLocation.coordinates);
|
|
6771
|
-
const needsRecharge = !ship.hasEnergyFor(distance);
|
|
6772
|
-
const travelEstimate = estimateTravelTime(ship, ship.totalMass, distance, {
|
|
6773
|
-
needsRecharge,
|
|
6774
|
-
unloadMass: calculateCargoMass(cargo),
|
|
6775
|
-
});
|
|
6776
|
-
repositionLocations.push({
|
|
6777
|
-
location: destLocation,
|
|
6778
|
-
bestDeal: dealsAtDest[0],
|
|
6779
|
-
distance,
|
|
6780
|
-
travelTime: travelEstimate.total,
|
|
6781
|
-
travelTimeBreakdown: travelEstimate,
|
|
6782
|
-
});
|
|
6783
|
-
}
|
|
6784
|
-
}
|
|
6785
|
-
repositionLocations.sort((a, b) => b.bestDeal.profitPerSecond - a.bestDeal.profitPerSecond);
|
|
6786
|
-
for (const reposition of repositionLocations.slice(0, 2)) {
|
|
6787
|
-
const option = createSellAndRepositionOption(cargoValueHere, cargoCost, reposition, cargoSaleHere);
|
|
6788
|
-
collectOptions.push(option);
|
|
6789
|
-
}
|
|
6790
|
-
}
|
|
6791
|
-
if (hasCargo) {
|
|
6792
|
-
const unloadTime = calculateUnloadTime(ship, cargo);
|
|
6793
|
-
const sellAndStay = createSellAndStayOption(cargoValueHere, cargoCost, cargoSaleHere, unloadTime);
|
|
6794
|
-
collectOptions.push(sellAndStay);
|
|
6795
|
-
}
|
|
6796
|
-
if (!hasCargo && dealsAtOrigin.length > 0) {
|
|
6797
|
-
for (const deal of dealsAtOrigin.slice(0, 3)) {
|
|
6798
|
-
const option = {
|
|
6799
|
-
id: `trade-${deal.destination.coordinates.x}-${deal.destination.coordinates.y}-${deal.item.id}`,
|
|
6800
|
-
type: 'sell-and-trade',
|
|
6801
|
-
title: `Trade ${deal.item.item.name}`,
|
|
6802
|
-
description: `Buy ${deal.maxQuantity} ${deal.item.item.name}, deliver to (${deal.destination.coordinates.x}, ${deal.destination.coordinates.y})`,
|
|
6803
|
-
reason: `${deal.marginPercent.toFixed(0)}% margin, ${deal.profitPerSecond.toFixed(1)}/s profit rate`,
|
|
6804
|
-
recommended: false,
|
|
6805
|
-
highestProfit: false,
|
|
6806
|
-
estimatedProfit: deal.totalProfit,
|
|
6807
|
-
purchaseCost: UInt64.from(deal.buyPrice).multiplying(deal.maxQuantity),
|
|
6808
|
-
nextTradeProfit: deal.totalProfit,
|
|
6809
|
-
profitPerSecond: deal.profitPerSecond,
|
|
6810
|
-
marginPercent: deal.marginPercent,
|
|
6811
|
-
destination: deal.destination,
|
|
6812
|
-
deal,
|
|
6813
|
-
travelTime: deal.travelTime,
|
|
6814
|
-
travelTimeBreakdown: {
|
|
6815
|
-
unloadTime: UInt32.zero,
|
|
6816
|
-
loadTime: deal.travelTimeBreakdown.loadTime,
|
|
6817
|
-
rechargeTime: deal.travelTimeBreakdown.rechargeTime,
|
|
6818
|
-
flightTime: deal.travelTimeBreakdown.flightTime,
|
|
6819
|
-
total: deal.travelTimeBreakdown.total,
|
|
6820
|
-
},
|
|
6821
|
-
};
|
|
6822
|
-
collectOptions.push(option);
|
|
6823
|
-
}
|
|
6824
|
-
}
|
|
6825
|
-
if (collectOptions.length === 0) {
|
|
6826
|
-
const gameSeed = callbacks.getGameSeed?.();
|
|
6827
|
-
const state = callbacks.getState?.();
|
|
6828
|
-
const exploreCandidates = [];
|
|
6829
|
-
for (const dest of nearbyLocations.slice(0, 10)) {
|
|
6830
|
-
const distance = distanceBetweenCoordinates(arrivedAt, dest.coordinates);
|
|
6831
|
-
const needsRecharge = !ship.hasEnergyFor(distance);
|
|
6832
|
-
const unloadMass = hasCargo ? calculateCargoMass(cargo) : UInt32.zero;
|
|
6833
|
-
const travelEstimate = estimateTravelTime(ship, ship.totalMass, distance, {
|
|
6834
|
-
needsRecharge,
|
|
6835
|
-
unloadMass,
|
|
6836
|
-
});
|
|
6837
|
-
let discountedGood;
|
|
6838
|
-
let bestDiscount = 0;
|
|
6839
|
-
if (gameSeed && state) {
|
|
6840
|
-
const allGoods = getItems();
|
|
6841
|
-
for (const good of allGoods) {
|
|
6842
|
-
const rarity = getRarity(gameSeed, state.seed, dest.coordinates, good.id);
|
|
6843
|
-
if (rarity.minMultiplier < 1.0) {
|
|
6844
|
-
const discountPercent = Math.round((1 - rarity.minMultiplier) * 100);
|
|
6845
|
-
if (discountPercent > bestDiscount) {
|
|
6846
|
-
bestDiscount = discountPercent;
|
|
6847
|
-
const rarityName = rarity.rarity === Rarities.legendary
|
|
6848
|
-
? 'Legendary'
|
|
6849
|
-
: rarity.rarity === Rarities.epic
|
|
6850
|
-
? 'Epic'
|
|
6851
|
-
: rarity.rarity === Rarities.rare
|
|
6852
|
-
? 'Rare'
|
|
6853
|
-
: rarity.rarity === Rarities.uncommon
|
|
6854
|
-
? 'Uncommon'
|
|
6855
|
-
: 'Common';
|
|
6856
|
-
discountedGood = {
|
|
6857
|
-
goodId: Number(good.id),
|
|
6858
|
-
name: good.name,
|
|
6859
|
-
rarity: rarityName,
|
|
6860
|
-
discountPercent,
|
|
6861
|
-
};
|
|
6862
|
-
}
|
|
6863
|
-
}
|
|
6864
|
-
}
|
|
6865
|
-
}
|
|
6866
|
-
const destDeals = await findDealsForShip(ship, dest.coordinates, callbacks.getNearbyLocations, callbacks.getMarketPrices, { maxDeals: 2 });
|
|
6867
|
-
const potentialDeals = destDeals.map((d) => ({
|
|
6868
|
-
goodId: Number(d.item.id),
|
|
6869
|
-
goodName: d.item.item.name,
|
|
6870
|
-
destinationCoords: d.destination.coordinates,
|
|
6871
|
-
marginPercent: d.marginPercent,
|
|
6872
|
-
profitPerSecond: d.profitPerSecond,
|
|
6873
|
-
}));
|
|
6874
|
-
let score = 0;
|
|
6875
|
-
if (potentialDeals.length > 0) {
|
|
6876
|
-
score = potentialDeals[0].profitPerSecond;
|
|
6877
|
-
}
|
|
6878
|
-
else if (bestDiscount > 0) {
|
|
6879
|
-
score = bestDiscount * 0.01;
|
|
6880
|
-
}
|
|
6881
|
-
exploreCandidates.push({
|
|
6882
|
-
dest,
|
|
6883
|
-
travelTime: travelEstimate.total,
|
|
6884
|
-
travelTimeBreakdown: travelEstimate,
|
|
6885
|
-
discountedGood,
|
|
6886
|
-
bestDiscount,
|
|
6887
|
-
potentialDeals: potentialDeals.length > 0 ? potentialDeals : undefined,
|
|
6888
|
-
score,
|
|
6889
|
-
});
|
|
6890
|
-
}
|
|
6891
|
-
exploreCandidates.sort((a, b) => b.score - a.score);
|
|
6892
|
-
for (const candidate of exploreCandidates.slice(0, 3)) {
|
|
6893
|
-
const option = createExploreOption(candidate.dest, candidate.travelTime, candidate.discountedGood, candidate.travelTimeBreakdown, candidate.potentialDeals);
|
|
6894
|
-
collectOptions.push(option);
|
|
6895
|
-
}
|
|
6896
|
-
}
|
|
6897
|
-
const orbitOption = createOrbitOption();
|
|
6898
|
-
collectOptions.push(orbitOption);
|
|
6899
|
-
const MIN_MARGIN_THRESHOLD = 15;
|
|
6900
|
-
const MIN_PROFIT_PER_SECOND_THRESHOLD = 0.5;
|
|
6901
|
-
collectOptions.sort((a, b) => (b.profitPerSecond ?? 0) - (a.profitPerSecond ?? 0));
|
|
6902
|
-
if (collectOptions.length > 0) {
|
|
6903
|
-
const bestByProfitPerSecond = collectOptions[0];
|
|
6904
|
-
const meetsQualityThreshold = (bestByProfitPerSecond.marginPercent ?? 0) > MIN_MARGIN_THRESHOLD ||
|
|
6905
|
-
(bestByProfitPerSecond.profitPerSecond ?? 0) > MIN_PROFIT_PER_SECOND_THRESHOLD;
|
|
6906
|
-
if (meetsQualityThreshold) {
|
|
6907
|
-
bestByProfitPerSecond.recommended = true;
|
|
6908
|
-
}
|
|
6909
|
-
const bestByProfit = collectOptions.reduce((best, opt) => opt.estimatedProfit > best.estimatedProfit ? opt : best);
|
|
6910
|
-
if (bestByProfit.id !== bestByProfitPerSecond.id || !meetsQualityThreshold) {
|
|
6911
|
-
bestByProfit.highestProfit = true;
|
|
6912
|
-
}
|
|
6913
|
-
}
|
|
6914
|
-
return {
|
|
6915
|
-
arrivedAt,
|
|
6916
|
-
ship,
|
|
6917
|
-
cargo,
|
|
6918
|
-
cargoValueHere,
|
|
6919
|
-
options: collectOptions,
|
|
6920
|
-
hasProfitableOptions: collectOptions.some((o) => o.estimatedProfit.gt(UInt64.zero)),
|
|
6921
|
-
};
|
|
6922
|
-
}
|
|
6923
|
-
|
|
6924
|
-
class TradesManager extends BaseManager {
|
|
6925
|
-
constructor() {
|
|
6926
|
-
super(...arguments);
|
|
6927
|
-
this.priceCache = new Map();
|
|
6928
|
-
}
|
|
6929
|
-
makePriceCacheKey(location) {
|
|
6930
|
-
return `${location.x},${location.y}`;
|
|
6931
|
-
}
|
|
6932
|
-
async createCallbacks() {
|
|
6933
|
-
const game = await this.getGame();
|
|
6934
|
-
const serverState = await this.getState();
|
|
6935
|
-
const currentEpoch = getCurrentEpoch(game);
|
|
6936
|
-
if (!this.priceCacheEpoch || !this.priceCacheEpoch.equals(currentEpoch)) {
|
|
6937
|
-
this.priceCache.clear();
|
|
6938
|
-
this.priceCacheEpoch = currentEpoch;
|
|
6939
|
-
}
|
|
6940
|
-
const getNearbyLocations = async (origin, maxDistance) => {
|
|
6941
|
-
const nearby = findNearbyPlanets(game.config.seed, origin, maxDistance);
|
|
6942
|
-
return nearby.map((d) => toLocation(d.destination));
|
|
6943
|
-
};
|
|
6944
|
-
const getMarketPrices = async (location) => {
|
|
6945
|
-
const cacheKey = this.makePriceCacheKey(location);
|
|
6946
|
-
const cached = this.priceCache.get(cacheKey);
|
|
6947
|
-
if (cached) {
|
|
6948
|
-
return cached;
|
|
6949
|
-
}
|
|
6950
|
-
const locationWithSupply = await this.context.locations.getLocationComplete(location);
|
|
6951
|
-
const prices = locationWithSupply.marketPrices || [];
|
|
6952
|
-
const result = prices.map((price) => {
|
|
6953
|
-
const actualSupply = locationWithSupply.getSupply(price.id);
|
|
6954
|
-
if (actualSupply !== undefined) {
|
|
6955
|
-
return ItemPrice.from({
|
|
6956
|
-
id: price.id,
|
|
6957
|
-
item: price.item,
|
|
6958
|
-
price: price.price,
|
|
6959
|
-
supply: actualSupply,
|
|
6960
|
-
});
|
|
6961
|
-
}
|
|
6962
|
-
return price;
|
|
6963
|
-
});
|
|
6964
|
-
this.priceCache.set(cacheKey, result);
|
|
6965
|
-
return result;
|
|
6966
|
-
};
|
|
6967
|
-
const getGameSeed = () => game.config.seed;
|
|
6968
|
-
const getState = () => serverState;
|
|
6969
|
-
return { getNearbyLocations, getMarketPrices, getGameSeed, getState };
|
|
6970
|
-
}
|
|
6971
|
-
clearPriceCache() {
|
|
6972
|
-
this.priceCache.clear();
|
|
6973
|
-
this.priceCacheEpoch = undefined;
|
|
6974
|
-
}
|
|
6975
|
-
async findDeals(ship, originLocation, options = {}) {
|
|
6976
|
-
const origin = originLocation || Coordinates.from(ship.coordinates);
|
|
6977
|
-
const callbacks = await this.createCallbacks();
|
|
6978
|
-
const deals = await findDealsForShip(ship, origin, callbacks.getNearbyLocations, callbacks.getMarketPrices, options);
|
|
6979
|
-
return deals;
|
|
6980
|
-
}
|
|
6981
|
-
async findBestDeal(ship, originLocation, options = {}) {
|
|
6982
|
-
const deals = await this.findDeals(ship, originLocation, { ...options, maxDeals: 1 });
|
|
6983
|
-
return deals[0];
|
|
6984
|
-
}
|
|
6985
|
-
async getCollectOptions(ship, arrivedAt, options = {}) {
|
|
6986
|
-
const location = arrivedAt || Coordinates.from(ship.coordinates);
|
|
6987
|
-
const callbacks = await this.createCallbacks();
|
|
6988
|
-
return analyzeCollectOptions(ship, location, callbacks, options);
|
|
6989
|
-
}
|
|
6990
|
-
}
|
|
6991
|
-
|
|
6992
|
-
class EpochsManager extends BaseManager {
|
|
6993
|
-
async getCurrentHeight() {
|
|
6994
|
-
const game = await this.getGame();
|
|
6995
|
-
return getCurrentEpoch(game);
|
|
6996
|
-
}
|
|
6997
|
-
async getCurrent() {
|
|
6998
|
-
const game = await this.getGame();
|
|
6999
|
-
const epoch = await this.getCurrentHeight();
|
|
7000
|
-
return getEpochInfo(game, epoch);
|
|
7001
|
-
}
|
|
7002
|
-
async getByHeight(height) {
|
|
7003
|
-
const game = await this.getGame();
|
|
7004
|
-
return getEpochInfo(game, UInt64.from(height));
|
|
7005
|
-
}
|
|
7006
|
-
async getTimeRemaining() {
|
|
7007
|
-
const epochInfo = await this.getCurrent();
|
|
7008
|
-
const now = Date.now();
|
|
7009
|
-
const endTime = epochInfo.end.getTime();
|
|
7010
|
-
return Math.max(0, endTime - now);
|
|
7011
|
-
}
|
|
7012
|
-
async getProgress() {
|
|
7013
|
-
const epochInfo = await this.getCurrent();
|
|
7014
|
-
const now = Date.now();
|
|
7015
|
-
const startTime = epochInfo.start.getTime();
|
|
7016
|
-
const endTime = epochInfo.end.getTime();
|
|
7017
|
-
const duration = endTime - startTime;
|
|
7018
|
-
const elapsed = now - startTime;
|
|
7019
|
-
if (elapsed <= 0)
|
|
7020
|
-
return 0;
|
|
7021
|
-
if (elapsed >= duration)
|
|
7022
|
-
return 1;
|
|
7023
|
-
return elapsed / duration;
|
|
7024
|
-
}
|
|
7025
|
-
async fitsInCurrentEpoch(durationMs) {
|
|
7026
|
-
const remaining = await this.getTimeRemaining();
|
|
7027
|
-
return durationMs <= remaining;
|
|
7028
|
-
}
|
|
7029
|
-
}
|
|
7030
|
-
|
|
7031
|
-
class ActionsManager extends BaseManager {
|
|
7032
|
-
travel(shipId, destination, recharge = true) {
|
|
7033
|
-
const x = Int64.from(destination.x);
|
|
7034
|
-
const y = Int64.from(destination.y);
|
|
7035
|
-
return this.server.action('travel', {
|
|
7036
|
-
entity_type: EntityType.SHIP,
|
|
7037
|
-
id: UInt64.from(shipId),
|
|
7038
|
-
x,
|
|
7039
|
-
y,
|
|
7040
|
-
recharge,
|
|
5697
|
+
|
|
5698
|
+
class ActionsManager extends BaseManager {
|
|
5699
|
+
travel(shipId, destination, recharge = true) {
|
|
5700
|
+
const x = Int64.from(destination.x);
|
|
5701
|
+
const y = Int64.from(destination.y);
|
|
5702
|
+
return this.server.action('travel', {
|
|
5703
|
+
entity_type: EntityType.SHIP,
|
|
5704
|
+
id: UInt64.from(shipId),
|
|
5705
|
+
x,
|
|
5706
|
+
y,
|
|
5707
|
+
recharge,
|
|
7041
5708
|
});
|
|
7042
5709
|
}
|
|
7043
5710
|
grouptravel(entities, destination, recharge = true) {
|
|
@@ -7083,54 +5750,6 @@ class ActionsManager extends BaseManager {
|
|
|
7083
5750
|
quantity: UInt32.from(quantity),
|
|
7084
5751
|
});
|
|
7085
5752
|
}
|
|
7086
|
-
buyItems(entityId, goodId, quantity, entityType = EntityType.SHIP) {
|
|
7087
|
-
return this.server.action('buyitems', {
|
|
7088
|
-
entity_type: entityType,
|
|
7089
|
-
id: UInt64.from(entityId),
|
|
7090
|
-
item_id: UInt16.from(goodId),
|
|
7091
|
-
quantity: UInt32.from(quantity),
|
|
7092
|
-
});
|
|
7093
|
-
}
|
|
7094
|
-
sellItems(entityId, goodId, quantity, entityType = EntityType.SHIP) {
|
|
7095
|
-
return this.server.action('sellitems', {
|
|
7096
|
-
entity_type: entityType,
|
|
7097
|
-
id: UInt64.from(entityId),
|
|
7098
|
-
item_id: UInt16.from(goodId),
|
|
7099
|
-
quantity: UInt32.from(quantity),
|
|
7100
|
-
});
|
|
7101
|
-
}
|
|
7102
|
-
buyShip(account, name) {
|
|
7103
|
-
return this.server.action('buyship', {
|
|
7104
|
-
account: Name.from(account),
|
|
7105
|
-
name,
|
|
7106
|
-
});
|
|
7107
|
-
}
|
|
7108
|
-
buyWarehouse(account, shipId, name) {
|
|
7109
|
-
return this.server.action('buywarehouse', {
|
|
7110
|
-
account: Name.from(account),
|
|
7111
|
-
ship_id: UInt64.from(shipId),
|
|
7112
|
-
name,
|
|
7113
|
-
});
|
|
7114
|
-
}
|
|
7115
|
-
buyContainer(account, shipId, name) {
|
|
7116
|
-
return this.server.action('buycontainer', {
|
|
7117
|
-
account: Name.from(account),
|
|
7118
|
-
ship_id: UInt64.from(shipId),
|
|
7119
|
-
name,
|
|
7120
|
-
});
|
|
7121
|
-
}
|
|
7122
|
-
takeLoan(account, amount) {
|
|
7123
|
-
return this.server.action('takeloan', {
|
|
7124
|
-
account: Name.from(account),
|
|
7125
|
-
amount: UInt64.from(amount),
|
|
7126
|
-
});
|
|
7127
|
-
}
|
|
7128
|
-
payLoan(account, amount) {
|
|
7129
|
-
return this.server.action('payloan', {
|
|
7130
|
-
account: Name.from(account),
|
|
7131
|
-
amount: UInt64.from(amount),
|
|
7132
|
-
});
|
|
7133
|
-
}
|
|
7134
5753
|
foundCompany(account, name) {
|
|
7135
5754
|
return this.platform.action('foundcompany', {
|
|
7136
5755
|
account: Name.from(account),
|
|
@@ -7157,25 +5776,32 @@ class ActionsManager extends BaseManager {
|
|
|
7157
5776
|
y,
|
|
7158
5777
|
});
|
|
7159
5778
|
}
|
|
5779
|
+
craft(entityType, entityId, recipeId, quantity, inputs) {
|
|
5780
|
+
const cargoInputs = inputs.map((i) => Types.cargo_item.from({
|
|
5781
|
+
item_id: UInt16.from(i.itemId),
|
|
5782
|
+
quantity: UInt32.from(i.quantity),
|
|
5783
|
+
seed: i.seed !== undefined ? UInt64.from(i.seed) : null,
|
|
5784
|
+
}));
|
|
5785
|
+
return this.server.action('craft', {
|
|
5786
|
+
entity_type: entityType,
|
|
5787
|
+
id: UInt64.from(entityId),
|
|
5788
|
+
recipe_id: UInt16.from(recipeId),
|
|
5789
|
+
quantity: UInt32.from(quantity),
|
|
5790
|
+
inputs: cargoInputs,
|
|
5791
|
+
});
|
|
5792
|
+
}
|
|
5793
|
+
deploy(entityType, entityId, packedItemId, seed, entityName) {
|
|
5794
|
+
return this.server.action('deploy', {
|
|
5795
|
+
entity_type: entityType,
|
|
5796
|
+
id: UInt64.from(entityId),
|
|
5797
|
+
packed_item_id: UInt16.from(packedItemId),
|
|
5798
|
+
seed: UInt64.from(seed),
|
|
5799
|
+
entity_name: entityName,
|
|
5800
|
+
});
|
|
5801
|
+
}
|
|
7160
5802
|
joinGame(account, companyName) {
|
|
7161
5803
|
return [this.foundCompany(account, companyName), this.join(account)];
|
|
7162
5804
|
}
|
|
7163
|
-
sellAllCargo(ship, cargo) {
|
|
7164
|
-
let shipCargo;
|
|
7165
|
-
if (ship instanceof Ship) {
|
|
7166
|
-
shipCargo = cargo || ship.inventory;
|
|
7167
|
-
}
|
|
7168
|
-
else {
|
|
7169
|
-
if (!cargo) {
|
|
7170
|
-
throw new Error('cargo parameter required when ship is a UInt64Type');
|
|
7171
|
-
}
|
|
7172
|
-
shipCargo = cargo;
|
|
7173
|
-
}
|
|
7174
|
-
const shipId = ship instanceof Ship ? ship.id : UInt64.from(ship);
|
|
7175
|
-
return shipCargo
|
|
7176
|
-
.filter((c) => c.hasCargo)
|
|
7177
|
-
.map((c) => this.sellItems(shipId, c.item_id, c.quantity, EntityType.SHIP));
|
|
7178
|
-
}
|
|
7179
5805
|
}
|
|
7180
5806
|
|
|
7181
5807
|
class GameContext {
|
|
@@ -7202,12 +5828,6 @@ class GameContext {
|
|
|
7202
5828
|
}
|
|
7203
5829
|
return this._locations;
|
|
7204
5830
|
}
|
|
7205
|
-
get trades() {
|
|
7206
|
-
if (!this._trades) {
|
|
7207
|
-
this._trades = new TradesManager(this);
|
|
7208
|
-
}
|
|
7209
|
-
return this._trades;
|
|
7210
|
-
}
|
|
7211
5831
|
get epochs() {
|
|
7212
5832
|
if (!this._epochs) {
|
|
7213
5833
|
this._epochs = new EpochsManager(this);
|
|
@@ -7304,9 +5924,6 @@ class Shipload {
|
|
|
7304
5924
|
get locations() {
|
|
7305
5925
|
return this._context.locations;
|
|
7306
5926
|
}
|
|
7307
|
-
get trades() {
|
|
7308
|
-
return this._context.trades;
|
|
7309
|
-
}
|
|
7310
5927
|
get epochs() {
|
|
7311
5928
|
return this._context.epochs;
|
|
7312
5929
|
}
|
|
@@ -7383,137 +6000,6 @@ function makeContainer(state) {
|
|
|
7383
6000
|
return new Container(entityInfo);
|
|
7384
6001
|
}
|
|
7385
6002
|
|
|
7386
|
-
const DEPTH_THRESHOLD_COMMON = 0;
|
|
7387
|
-
const DEPTH_THRESHOLD_UNCOMMON = 2000;
|
|
7388
|
-
const DEPTH_THRESHOLD_RARE = 10000;
|
|
7389
|
-
const DEPTH_THRESHOLD_EPIC = 30000;
|
|
7390
|
-
const DEPTH_THRESHOLD_LEGENDARY = 55000;
|
|
7391
|
-
const LOCATION_MIN_DEPTH = 500;
|
|
7392
|
-
const LOCATION_MAX_DEPTH = 65535;
|
|
7393
|
-
const YIELD_THRESHOLD = Math.floor(0.003 * 0xffffffff);
|
|
7394
|
-
const PLANET_SUBTYPE_GAS_GIANT = 0;
|
|
7395
|
-
const PLANET_SUBTYPE_ROCKY = 1;
|
|
7396
|
-
const PLANET_SUBTYPE_TERRESTRIAL = 2;
|
|
7397
|
-
const PLANET_SUBTYPE_ICY = 3;
|
|
7398
|
-
const PLANET_SUBTYPE_OCEAN = 4;
|
|
7399
|
-
const PLANET_SUBTYPE_INDUSTRIAL = 5;
|
|
7400
|
-
const RESOURCE_CATALOG = [
|
|
7401
|
-
{ id: 26, rarity: 'common' },
|
|
7402
|
-
{ id: 1, rarity: 'common' },
|
|
7403
|
-
{ id: 14, rarity: 'common' },
|
|
7404
|
-
{ id: 6, rarity: 'common' },
|
|
7405
|
-
{ id: 29, rarity: 'uncommon' },
|
|
7406
|
-
{ id: 2, rarity: 'uncommon' },
|
|
7407
|
-
{ id: 1000, rarity: 'uncommon' },
|
|
7408
|
-
{ id: 1003, rarity: 'uncommon' },
|
|
7409
|
-
{ id: 22, rarity: 'rare' },
|
|
7410
|
-
{ id: 18, rarity: 'rare' },
|
|
7411
|
-
{ id: 1001, rarity: 'rare' },
|
|
7412
|
-
{ id: 1002, rarity: 'rare' },
|
|
7413
|
-
{ id: 74, rarity: 'epic' },
|
|
7414
|
-
{ id: 54, rarity: 'epic' },
|
|
7415
|
-
];
|
|
7416
|
-
function getDepthThreshold(rarity) {
|
|
7417
|
-
switch (rarity) {
|
|
7418
|
-
case 'common':
|
|
7419
|
-
return DEPTH_THRESHOLD_COMMON;
|
|
7420
|
-
case 'uncommon':
|
|
7421
|
-
return DEPTH_THRESHOLD_UNCOMMON;
|
|
7422
|
-
case 'rare':
|
|
7423
|
-
return DEPTH_THRESHOLD_RARE;
|
|
7424
|
-
case 'epic':
|
|
7425
|
-
return DEPTH_THRESHOLD_EPIC;
|
|
7426
|
-
case 'legendary':
|
|
7427
|
-
return DEPTH_THRESHOLD_LEGENDARY;
|
|
7428
|
-
}
|
|
7429
|
-
}
|
|
7430
|
-
function getResourceRarity(itemId) {
|
|
7431
|
-
const entry = RESOURCE_CATALOG.find((r) => r.id === itemId);
|
|
7432
|
-
return entry ? entry.rarity : 'legendary';
|
|
7433
|
-
}
|
|
7434
|
-
function getResourceWeight(itemId, stratum) {
|
|
7435
|
-
const rarity = getResourceRarity(itemId);
|
|
7436
|
-
const threshold = getDepthThreshold(rarity);
|
|
7437
|
-
if (stratum < threshold)
|
|
7438
|
-
return 0;
|
|
7439
|
-
const depthAbove = stratum - threshold;
|
|
7440
|
-
switch (rarity) {
|
|
7441
|
-
case 'common':
|
|
7442
|
-
if (stratum < 2000)
|
|
7443
|
-
return 100;
|
|
7444
|
-
if (stratum < 10000)
|
|
7445
|
-
return 80;
|
|
7446
|
-
if (stratum < 30000)
|
|
7447
|
-
return 50;
|
|
7448
|
-
return 30;
|
|
7449
|
-
case 'uncommon':
|
|
7450
|
-
if (depthAbove < 3000)
|
|
7451
|
-
return 40;
|
|
7452
|
-
if (depthAbove < 8000)
|
|
7453
|
-
return 60;
|
|
7454
|
-
return 50;
|
|
7455
|
-
case 'rare':
|
|
7456
|
-
if (depthAbove < 5000)
|
|
7457
|
-
return 20;
|
|
7458
|
-
if (depthAbove < 15000)
|
|
7459
|
-
return 35;
|
|
7460
|
-
return 40;
|
|
7461
|
-
case 'epic':
|
|
7462
|
-
if (depthAbove < 10000)
|
|
7463
|
-
return 10;
|
|
7464
|
-
if (depthAbove < 25000)
|
|
7465
|
-
return 20;
|
|
7466
|
-
return 30;
|
|
7467
|
-
case 'legendary':
|
|
7468
|
-
return 10;
|
|
7469
|
-
}
|
|
7470
|
-
}
|
|
7471
|
-
const ASTEROID_RESOURCES = [26, 29, 22, 74, 14, 1000, 1001];
|
|
7472
|
-
const NEBULA_RESOURCES = [1, 2, 18, 54];
|
|
7473
|
-
const GAS_GIANT_RESOURCES = [1, 2, 18, 54];
|
|
7474
|
-
const ROCKY_RESOURCES = [26, 29, 22, 74, 6, 1003, 1002];
|
|
7475
|
-
const TERRESTRIAL_RESOURCES = [6, 1003, 1002, 1001];
|
|
7476
|
-
const ICY_RESOURCES = [6, 14, 1000, 1001, 18];
|
|
7477
|
-
const OCEAN_RESOURCES = [1, 2, 1003, 1002];
|
|
7478
|
-
const INDUSTRIAL_RESOURCES = [26, 29, 22, 74, 14, 1000, 54];
|
|
7479
|
-
function getLocationCandidates(locationType, subtype) {
|
|
7480
|
-
if (locationType === 2)
|
|
7481
|
-
return ASTEROID_RESOURCES;
|
|
7482
|
-
if (locationType === 3)
|
|
7483
|
-
return NEBULA_RESOURCES;
|
|
7484
|
-
if (locationType === 1) {
|
|
7485
|
-
switch (subtype) {
|
|
7486
|
-
case PLANET_SUBTYPE_GAS_GIANT:
|
|
7487
|
-
return GAS_GIANT_RESOURCES;
|
|
7488
|
-
case PLANET_SUBTYPE_ROCKY:
|
|
7489
|
-
return ROCKY_RESOURCES;
|
|
7490
|
-
case PLANET_SUBTYPE_TERRESTRIAL:
|
|
7491
|
-
return TERRESTRIAL_RESOURCES;
|
|
7492
|
-
case PLANET_SUBTYPE_ICY:
|
|
7493
|
-
return ICY_RESOURCES;
|
|
7494
|
-
case PLANET_SUBTYPE_OCEAN:
|
|
7495
|
-
return OCEAN_RESOURCES;
|
|
7496
|
-
case PLANET_SUBTYPE_INDUSTRIAL:
|
|
7497
|
-
return INDUSTRIAL_RESOURCES;
|
|
7498
|
-
}
|
|
7499
|
-
}
|
|
7500
|
-
return [];
|
|
7501
|
-
}
|
|
7502
|
-
function getEligibleResources(locationType, subtype, stratum) {
|
|
7503
|
-
const candidates = getLocationCandidates(locationType, subtype);
|
|
7504
|
-
return candidates.filter((itemId) => {
|
|
7505
|
-
const rarity = getResourceRarity(itemId);
|
|
7506
|
-
const threshold = getDepthThreshold(rarity);
|
|
7507
|
-
return stratum >= threshold;
|
|
7508
|
-
});
|
|
7509
|
-
}
|
|
7510
|
-
function depthScaleFactor(stratum) {
|
|
7511
|
-
if (stratum <= 1)
|
|
7512
|
-
return 1.0;
|
|
7513
|
-
const logScale = Math.log(stratum) / Math.log(65535);
|
|
7514
|
-
return 1.0 + logScale * 2.0;
|
|
7515
|
-
}
|
|
7516
|
-
|
|
7517
6003
|
function deriveStratum(epochSeed, coords, stratum, locationType, subtype, _maxDepth) {
|
|
7518
6004
|
const seed = Checksum256.from(epochSeed);
|
|
7519
6005
|
const c = Coordinates.from(coords);
|
|
@@ -7562,19 +6048,21 @@ function deriveStratum(epochSeed, coords, stratum, locationType, subtype, _maxDe
|
|
|
7562
6048
|
const baseRichness = Math.floor(normalized * normalized * 999) + 1;
|
|
7563
6049
|
let depthBonus = 0;
|
|
7564
6050
|
if (stratum > 1) {
|
|
7565
|
-
depthBonus = 50 * Math.log(stratum) / Math.log(65535);
|
|
6051
|
+
depthBonus = (50 * Math.log(stratum)) / Math.log(65535);
|
|
7566
6052
|
}
|
|
7567
6053
|
const richness = Math.min(Math.floor(baseRichness + depthBonus), 1000);
|
|
7568
6054
|
return { itemId: selectedItemId, seed: seedBigInt, richness, reserve };
|
|
7569
6055
|
}
|
|
7570
6056
|
function deriveResourceStats(seed) {
|
|
7571
|
-
const
|
|
7572
|
-
|
|
7573
|
-
|
|
7574
|
-
|
|
6057
|
+
const seedBytes = new Uint8Array(8);
|
|
6058
|
+
for (let i = 7; i >= 0; i--) {
|
|
6059
|
+
seedBytes[i] = Number(seed & 0xffn);
|
|
6060
|
+
seed >>= 8n;
|
|
6061
|
+
}
|
|
6062
|
+
const hashResult = Checksum256.hash(Bytes.from(seedBytes));
|
|
7575
6063
|
const hashBytes = hashResult.array;
|
|
7576
6064
|
const extractU16 = (offset) => (hashBytes[offset] << 8) | hashBytes[offset + 1];
|
|
7577
|
-
const
|
|
6065
|
+
const weibull = (raw) => {
|
|
7578
6066
|
const u = raw / 65536;
|
|
7579
6067
|
let x = 0.27 * Math.sqrt(-Math.log(1 - u));
|
|
7580
6068
|
if (x > 1)
|
|
@@ -7582,22 +6070,357 @@ function deriveResourceStats(seed) {
|
|
|
7582
6070
|
return Math.floor(x * 999) + 1;
|
|
7583
6071
|
};
|
|
7584
6072
|
return {
|
|
7585
|
-
|
|
7586
|
-
|
|
7587
|
-
|
|
7588
|
-
resonance: weibullStat(extractU16(6)),
|
|
6073
|
+
stat1: weibull(extractU16(0)),
|
|
6074
|
+
stat2: weibull(extractU16(2)),
|
|
6075
|
+
stat3: weibull(extractU16(4)),
|
|
7589
6076
|
};
|
|
7590
6077
|
}
|
|
7591
6078
|
|
|
7592
|
-
|
|
7593
|
-
|
|
6079
|
+
const METAL_STATS = [
|
|
6080
|
+
{
|
|
6081
|
+
key: 'strength',
|
|
6082
|
+
label: 'Strength',
|
|
6083
|
+
abbreviation: 'STR',
|
|
6084
|
+
purpose: 'Raw structural/mechanical force',
|
|
6085
|
+
},
|
|
6086
|
+
{
|
|
6087
|
+
key: 'tolerance',
|
|
6088
|
+
label: 'Tolerance',
|
|
6089
|
+
abbreviation: 'TOL',
|
|
6090
|
+
purpose: 'Ability to withstand heat, pressure, and stress extremes',
|
|
6091
|
+
},
|
|
6092
|
+
{
|
|
6093
|
+
key: 'density',
|
|
6094
|
+
label: 'Density',
|
|
6095
|
+
abbreviation: 'DEN',
|
|
6096
|
+
purpose: 'Mass per unit',
|
|
6097
|
+
inverted: true,
|
|
6098
|
+
},
|
|
6099
|
+
];
|
|
6100
|
+
const PRECIOUS_STATS = [
|
|
6101
|
+
{
|
|
6102
|
+
key: 'conductivity',
|
|
6103
|
+
label: 'Conductivity',
|
|
6104
|
+
abbreviation: 'CON',
|
|
6105
|
+
purpose: 'Efficiency of energy/signal transfer',
|
|
6106
|
+
},
|
|
6107
|
+
{
|
|
6108
|
+
key: 'ductility',
|
|
6109
|
+
label: 'Ductility',
|
|
6110
|
+
abbreviation: 'DUC',
|
|
6111
|
+
purpose: 'Ability to be worked into fine, precise shapes',
|
|
6112
|
+
},
|
|
6113
|
+
{
|
|
6114
|
+
key: 'reflectivity',
|
|
6115
|
+
label: 'Reflectivity',
|
|
6116
|
+
abbreviation: 'REF',
|
|
6117
|
+
purpose: 'Surface quality for heat management and precision optics',
|
|
6118
|
+
},
|
|
6119
|
+
];
|
|
6120
|
+
const GAS_STATS = [
|
|
6121
|
+
{
|
|
6122
|
+
key: 'volatility',
|
|
6123
|
+
label: 'Volatility',
|
|
6124
|
+
abbreviation: 'VOL',
|
|
6125
|
+
purpose: 'Energy release potential for propulsion and force',
|
|
6126
|
+
},
|
|
6127
|
+
{
|
|
6128
|
+
key: 'reactivity',
|
|
6129
|
+
label: 'Reactivity',
|
|
6130
|
+
abbreviation: 'REA',
|
|
6131
|
+
purpose: 'Chemical interaction speed for processing and penetration',
|
|
6132
|
+
},
|
|
6133
|
+
{
|
|
6134
|
+
key: 'thermal',
|
|
6135
|
+
label: 'Thermal',
|
|
6136
|
+
abbreviation: 'THM',
|
|
6137
|
+
purpose: 'Heat capacity for thermal management',
|
|
6138
|
+
},
|
|
6139
|
+
];
|
|
6140
|
+
const MINERAL_STATS = [
|
|
6141
|
+
{
|
|
6142
|
+
key: 'resonance',
|
|
6143
|
+
label: 'Resonance',
|
|
6144
|
+
abbreviation: 'RES',
|
|
6145
|
+
purpose: 'Energy field interaction — storage, focusing, projection',
|
|
6146
|
+
},
|
|
6147
|
+
{
|
|
6148
|
+
key: 'hardness',
|
|
6149
|
+
label: 'Hardness',
|
|
6150
|
+
abbreviation: 'HRD',
|
|
6151
|
+
purpose: 'Resistance to wear — cutting surfaces, penetration',
|
|
6152
|
+
},
|
|
6153
|
+
{
|
|
6154
|
+
key: 'clarity',
|
|
6155
|
+
label: 'Clarity',
|
|
6156
|
+
abbreviation: 'CLR',
|
|
6157
|
+
purpose: 'Crystalline perfection — precision optics',
|
|
6158
|
+
},
|
|
6159
|
+
];
|
|
6160
|
+
const ORGANIC_STATS = [
|
|
6161
|
+
{
|
|
6162
|
+
key: 'plasticity',
|
|
6163
|
+
label: 'Plasticity',
|
|
6164
|
+
abbreviation: 'PLA',
|
|
6165
|
+
purpose: 'Ease of reshaping — speeds processing',
|
|
6166
|
+
},
|
|
6167
|
+
{
|
|
6168
|
+
key: 'insulation',
|
|
6169
|
+
label: 'Insulation',
|
|
6170
|
+
abbreviation: 'INS',
|
|
6171
|
+
purpose: 'Energy containment — reduces energy loss',
|
|
6172
|
+
},
|
|
6173
|
+
{
|
|
6174
|
+
key: 'purity',
|
|
6175
|
+
label: 'Purity',
|
|
6176
|
+
abbreviation: 'PUR',
|
|
6177
|
+
purpose: 'Biological cleanliness — better composites and lubricants',
|
|
6178
|
+
},
|
|
6179
|
+
];
|
|
6180
|
+
const STAT_MAP = {
|
|
6181
|
+
metal: METAL_STATS,
|
|
6182
|
+
precious: PRECIOUS_STATS,
|
|
6183
|
+
gas: GAS_STATS,
|
|
6184
|
+
mineral: MINERAL_STATS,
|
|
6185
|
+
organic: ORGANIC_STATS,
|
|
6186
|
+
};
|
|
6187
|
+
function getStatDefinitions(category) {
|
|
6188
|
+
return STAT_MAP[category];
|
|
6189
|
+
}
|
|
6190
|
+
function getStatName(category, index) {
|
|
6191
|
+
return STAT_MAP[category][index];
|
|
6192
|
+
}
|
|
6193
|
+
function resolveStats(category, stats) {
|
|
6194
|
+
return {
|
|
6195
|
+
definitions: STAT_MAP[category],
|
|
6196
|
+
values: [stats.stat1, stats.stat2, stats.stat3],
|
|
6197
|
+
};
|
|
6198
|
+
}
|
|
6199
|
+
|
|
6200
|
+
const ITEM_HULL_PLATES = 10001;
|
|
6201
|
+
const ITEM_CARGO_LINING = 10002;
|
|
6202
|
+
const ITEM_CONTAINER_PACKED = 10003;
|
|
6203
|
+
const components = [
|
|
6204
|
+
{
|
|
6205
|
+
id: ITEM_HULL_PLATES,
|
|
6206
|
+
name: 'Hull Plates',
|
|
6207
|
+
description: 'Structural plating formed from metal. Used in hulls, containers, and frames.',
|
|
6208
|
+
color: '#7B8D9E',
|
|
6209
|
+
mass: 50000,
|
|
6210
|
+
stats: [
|
|
6211
|
+
{ key: 'strength', source: 'metal' },
|
|
6212
|
+
{ key: 'density', source: 'metal' },
|
|
6213
|
+
],
|
|
6214
|
+
recipe: [{ category: 'metal', quantity: 40 }],
|
|
6215
|
+
usedIn: [{ type: 'entity', name: 'Container' }],
|
|
6216
|
+
},
|
|
6217
|
+
{
|
|
6218
|
+
id: ITEM_CARGO_LINING,
|
|
6219
|
+
name: 'Cargo Lining',
|
|
6220
|
+
description: 'Precision-formed composite lining for cargo storage. Combines precious metal shaping with organic sealing.',
|
|
6221
|
+
color: '#D4A843',
|
|
6222
|
+
mass: 30000,
|
|
6223
|
+
stats: [
|
|
6224
|
+
{ key: 'ductility', source: 'precious' },
|
|
6225
|
+
{ key: 'purity', source: 'organic' },
|
|
6226
|
+
],
|
|
6227
|
+
recipe: [
|
|
6228
|
+
{ category: 'precious', quantity: 10 },
|
|
6229
|
+
{ category: 'organic', quantity: 20 },
|
|
6230
|
+
],
|
|
6231
|
+
usedIn: [{ type: 'entity', name: 'Container' }],
|
|
6232
|
+
},
|
|
6233
|
+
];
|
|
6234
|
+
const entityRecipes = [
|
|
6235
|
+
{
|
|
6236
|
+
id: 'container',
|
|
6237
|
+
name: 'Container',
|
|
6238
|
+
description: 'Passive floating cargo storage in space. Towed by ships.',
|
|
6239
|
+
color: '#7B8D9E',
|
|
6240
|
+
packedItemId: ITEM_CONTAINER_PACKED,
|
|
6241
|
+
recipe: [
|
|
6242
|
+
{ itemId: ITEM_HULL_PLATES, quantity: 6 },
|
|
6243
|
+
{ itemId: ITEM_CARGO_LINING, quantity: 2 },
|
|
6244
|
+
],
|
|
6245
|
+
stats: [
|
|
6246
|
+
{ key: 'strength', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'strength' },
|
|
6247
|
+
{ key: 'density', sourceComponentId: ITEM_HULL_PLATES, sourceStatKey: 'density' },
|
|
6248
|
+
{ key: 'ductility', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'ductility' },
|
|
6249
|
+
{ key: 'purity', sourceComponentId: ITEM_CARGO_LINING, sourceStatKey: 'purity' },
|
|
6250
|
+
],
|
|
6251
|
+
},
|
|
6252
|
+
];
|
|
6253
|
+
function getComponentById(id) {
|
|
6254
|
+
return components.find((c) => c.id === id);
|
|
6255
|
+
}
|
|
6256
|
+
function getEntityRecipe(id) {
|
|
6257
|
+
return entityRecipes.find((r) => r.id === id);
|
|
6258
|
+
}
|
|
6259
|
+
function getEntityRecipeByItemId(itemId) {
|
|
6260
|
+
return entityRecipes.find((r) => r.packedItemId === itemId);
|
|
6261
|
+
}
|
|
6262
|
+
function getAllCraftableItems() {
|
|
6263
|
+
const items = [];
|
|
6264
|
+
for (const comp of components) {
|
|
6265
|
+
items.push({ type: 'component', id: comp.id, name: comp.name, description: comp.description, color: comp.color });
|
|
6266
|
+
}
|
|
6267
|
+
for (const entity of entityRecipes) {
|
|
6268
|
+
items.push({ type: 'entity', id: entity.id, name: entity.name, description: entity.description, color: entity.color });
|
|
6269
|
+
}
|
|
6270
|
+
return items;
|
|
6271
|
+
}
|
|
6272
|
+
function getComponentsForCategory(category) {
|
|
6273
|
+
return components.filter((c) => c.recipe.some((r) => r.category === category));
|
|
6274
|
+
}
|
|
6275
|
+
function getComponentsForStat(statKey) {
|
|
6276
|
+
return components.filter((c) => c.stats.some((s) => s.key === statKey));
|
|
6277
|
+
}
|
|
6278
|
+
|
|
6279
|
+
function encodeStats(values) {
|
|
6280
|
+
let seed = 0n;
|
|
6281
|
+
for (let i = 0; i < values.length && i < 6; i++) {
|
|
6282
|
+
seed |= BigInt(values[i] & 0x3ff) << BigInt(i * 10);
|
|
6283
|
+
}
|
|
6284
|
+
return seed;
|
|
6285
|
+
}
|
|
6286
|
+
function decodeStats(seed, count) {
|
|
6287
|
+
const stats = [];
|
|
6288
|
+
for (let i = 0; i < count; i++) {
|
|
6289
|
+
stats.push(Number((seed >> BigInt(i * 10)) & 0x3ffn));
|
|
6290
|
+
}
|
|
6291
|
+
return stats;
|
|
6292
|
+
}
|
|
6293
|
+
function decodeCraftedItemStats(itemId, seed) {
|
|
6294
|
+
const comp = getComponentById(itemId);
|
|
6295
|
+
if (comp) {
|
|
6296
|
+
const values = decodeStats(seed, comp.stats.length);
|
|
6297
|
+
const result = {};
|
|
6298
|
+
for (let i = 0; i < comp.stats.length; i++) {
|
|
6299
|
+
result[comp.stats[i].key] = values[i];
|
|
6300
|
+
}
|
|
6301
|
+
return result;
|
|
6302
|
+
}
|
|
6303
|
+
const entityRecipe = entityRecipes.find((r) => r.packedItemId === itemId);
|
|
6304
|
+
if (entityRecipe) {
|
|
6305
|
+
const values = decodeStats(seed, entityRecipe.stats.length);
|
|
6306
|
+
const result = {};
|
|
6307
|
+
for (let i = 0; i < entityRecipe.stats.length; i++) {
|
|
6308
|
+
result[entityRecipe.stats[i].key] = values[i];
|
|
6309
|
+
}
|
|
6310
|
+
return result;
|
|
6311
|
+
}
|
|
6312
|
+
return {};
|
|
6313
|
+
}
|
|
6314
|
+
function blendStacks(stacks, statKey) {
|
|
6315
|
+
let totalQty = 0;
|
|
6316
|
+
let weightedSum = 0;
|
|
6317
|
+
for (const stack of stacks) {
|
|
6318
|
+
const val = stack.stats[statKey] ?? 0;
|
|
6319
|
+
weightedSum += val * stack.quantity;
|
|
6320
|
+
totalQty += stack.quantity;
|
|
6321
|
+
}
|
|
6322
|
+
if (totalQty === 0)
|
|
7594
6323
|
return 0;
|
|
7595
|
-
|
|
7596
|
-
|
|
7597
|
-
|
|
7598
|
-
const
|
|
7599
|
-
|
|
6324
|
+
return Math.round(weightedSum / totalQty);
|
|
6325
|
+
}
|
|
6326
|
+
function computeComponentStats(componentId, categoryStacks) {
|
|
6327
|
+
const comp = getComponentById(componentId);
|
|
6328
|
+
if (!comp)
|
|
6329
|
+
return [];
|
|
6330
|
+
return comp.stats.map((statDef) => {
|
|
6331
|
+
const matching = categoryStacks.find((cs) => cs.category === statDef.source);
|
|
6332
|
+
const value = matching ? blendStacks(matching.stacks, statDef.key) : 0;
|
|
6333
|
+
return { key: statDef.key, value: Math.max(1, Math.min(999, value)) };
|
|
6334
|
+
});
|
|
6335
|
+
}
|
|
6336
|
+
function blendComponentStacks(stacks) {
|
|
6337
|
+
if (stacks.length === 0)
|
|
6338
|
+
return {};
|
|
6339
|
+
const allKeys = new Set();
|
|
6340
|
+
for (const s of stacks) {
|
|
6341
|
+
for (const k of Object.keys(s.stats))
|
|
6342
|
+
allKeys.add(k);
|
|
6343
|
+
}
|
|
6344
|
+
const result = {};
|
|
6345
|
+
for (const key of allKeys) {
|
|
6346
|
+
result[key] = blendStacks(stacks.map((s) => ({ quantity: s.quantity, stats: s.stats })), key);
|
|
6347
|
+
}
|
|
6348
|
+
return result;
|
|
6349
|
+
}
|
|
6350
|
+
function computeEntityStats(entityRecipeId, componentStacks) {
|
|
6351
|
+
const recipe = getEntityRecipe(entityRecipeId);
|
|
6352
|
+
if (!recipe)
|
|
6353
|
+
return [];
|
|
6354
|
+
const blendedByComponent = {};
|
|
6355
|
+
for (const [compId, stacks] of Object.entries(componentStacks)) {
|
|
6356
|
+
blendedByComponent[Number(compId)] = blendComponentStacks(stacks);
|
|
6357
|
+
}
|
|
6358
|
+
return recipe.stats.map((stat) => {
|
|
6359
|
+
const blended = blendedByComponent[stat.sourceComponentId] ?? {};
|
|
6360
|
+
const value = blended[stat.sourceStatKey] ?? 0;
|
|
6361
|
+
return { key: stat.key, value: Math.max(1, Math.min(999, value)) };
|
|
6362
|
+
});
|
|
6363
|
+
}
|
|
6364
|
+
|
|
6365
|
+
function totalCargoMass(cargo) {
|
|
6366
|
+
return cargo.reduce((sum, c) => {
|
|
6367
|
+
return sum.adding(c.totalMass);
|
|
6368
|
+
}, UInt64.from(0));
|
|
6369
|
+
}
|
|
6370
|
+
function getCargoForItem(cargo, goodId) {
|
|
6371
|
+
return cargo.find((c) => c.item_id.equals(goodId));
|
|
6372
|
+
}
|
|
6373
|
+
function hasSpace(currentMass, maxCapacity, goodMass, quantity) {
|
|
6374
|
+
const additionalMass = goodMass.multiplying(quantity);
|
|
6375
|
+
const totalMass = currentMass.adding(additionalMass);
|
|
6376
|
+
return totalMass.lte(maxCapacity);
|
|
6377
|
+
}
|
|
6378
|
+
function availableCapacity(currentMass, maxCapacity) {
|
|
6379
|
+
if (currentMass.gte(maxCapacity)) {
|
|
6380
|
+
return UInt64.from(0);
|
|
6381
|
+
}
|
|
6382
|
+
return maxCapacity.subtracting(currentMass);
|
|
6383
|
+
}
|
|
6384
|
+
function isFull(currentMass, maxCapacity) {
|
|
6385
|
+
return currentMass.gte(maxCapacity);
|
|
6386
|
+
}
|
|
6387
|
+
function afterRemoveItems(cargo, goodsToRemove) {
|
|
6388
|
+
if (cargo.length === 0) {
|
|
6389
|
+
return [];
|
|
6390
|
+
}
|
|
6391
|
+
return cargo.map((item) => {
|
|
6392
|
+
const removeItem = goodsToRemove.find((s) => Number(item.item_id) === s.goodId);
|
|
6393
|
+
if (!removeItem) {
|
|
6394
|
+
return new EntityInventory(item);
|
|
6395
|
+
}
|
|
6396
|
+
const currentQty = Number(item.quantity);
|
|
6397
|
+
const newQty = Math.max(0, currentQty - removeItem.quantity);
|
|
6398
|
+
return new EntityInventory(Types.cargo_item.from({
|
|
6399
|
+
item_id: item.item_id,
|
|
6400
|
+
quantity: UInt32.from(newQty),
|
|
6401
|
+
}));
|
|
6402
|
+
});
|
|
7600
6403
|
}
|
|
6404
|
+
function afterRemoveAllItems(cargo) {
|
|
6405
|
+
if (cargo.length === 0) {
|
|
6406
|
+
return [];
|
|
6407
|
+
}
|
|
6408
|
+
return cargo.map((item) => new EntityInventory(Types.cargo_item.from({
|
|
6409
|
+
item_id: item.item_id,
|
|
6410
|
+
quantity: UInt32.from(0),
|
|
6411
|
+
})));
|
|
6412
|
+
}
|
|
6413
|
+
|
|
6414
|
+
var cargoUtils = /*#__PURE__*/Object.freeze({
|
|
6415
|
+
__proto__: null,
|
|
6416
|
+
totalCargoMass: totalCargoMass,
|
|
6417
|
+
getCargoForItem: getCargoForItem,
|
|
6418
|
+
hasSpace: hasSpace,
|
|
6419
|
+
availableCapacity: availableCapacity,
|
|
6420
|
+
isFull: isFull,
|
|
6421
|
+
afterRemoveItems: afterRemoveItems,
|
|
6422
|
+
afterRemoveAllItems: afterRemoveAllItems
|
|
6423
|
+
});
|
|
7601
6424
|
|
|
7602
6425
|
function canMove(e) {
|
|
7603
6426
|
return 'engines' in e && 'generator' in e && 'energy' in e;
|
|
@@ -7611,9 +6434,6 @@ function hasStorage(e) {
|
|
|
7611
6434
|
function hasLoaders(e) {
|
|
7612
6435
|
return 'loaders' in e && e.loaders !== undefined;
|
|
7613
6436
|
}
|
|
7614
|
-
function hasTrade(e) {
|
|
7615
|
-
return 'trade' in e && e.trade !== undefined;
|
|
7616
|
-
}
|
|
7617
6437
|
function hasMass(e) {
|
|
7618
6438
|
return 'hullmass' in e;
|
|
7619
6439
|
}
|
|
@@ -7647,5 +6467,9 @@ function calc_extraction_energy(extractor, duration) {
|
|
|
7647
6467
|
return UInt16.from(energy);
|
|
7648
6468
|
}
|
|
7649
6469
|
|
|
7650
|
-
|
|
6470
|
+
function capsHasCrafter(caps) {
|
|
6471
|
+
return caps.crafter !== undefined;
|
|
6472
|
+
}
|
|
6473
|
+
|
|
6474
|
+
export { ActionsManager, COMMIT_ALREADY_SET, COMMIT_CANNOT_MATCH, COMMIT_NOT_SET, COMPANY_NOT_FOUND, CONTAINER_Z, Container, Coordinates, DEPTH_THRESHOLD_T1, DEPTH_THRESHOLD_T2, DEPTH_THRESHOLD_T3, DEPTH_THRESHOLD_T4, DEPTH_THRESHOLD_T5, EPOCH_NON_ZERO, EPOCH_NOT_READY, ERROR_SYSTEM_ALREADY_INITIALIZED, ERROR_SYSTEM_DISABLED, ERROR_SYSTEM_NOT_INITIALIZED, EntitiesManager, EntityInventory, EntityType, EpochsManager, GAME_NOT_FOUND, GAME_SEED_NOT_SET, GameState, INITIAL_CONTAINER_CAPACITY, INITIAL_CONTAINER_HULLMASS, INITIAL_EXTRACTOR_DRAIN, INITIAL_EXTRACTOR_EFFICIENCY, INITIAL_EXTRACTOR_RATE, INITIAL_LOADER_MASS, INITIAL_LOADER_QUANTITY, INITIAL_LOADER_THRUST, INITIAL_SHIP_CAPACITY, INITIAL_SHIP_DRAIN, INITIAL_SHIP_ENERGY, INITIAL_SHIP_GENERATOR_CAPACITY, INITIAL_SHIP_HULLMASS, INITIAL_SHIP_MASS, INITIAL_SHIP_RECHARGE, INITIAL_SHIP_THRUST, INITIAL_SHIP_Z, INITIAL_WAREHOUSE_CAPACITY, INSUFFICIENT_BALANCE, INSUFFICIENT_ITEM_QUANTITY, INSUFFICIENT_ITEM_SUPPLY, INVALID_AMOUNT, ITEM_CARGO_LINING, ITEM_CONTAINER_PACKED, ITEM_DOES_NOT_EXIST, ITEM_HULL_PLATES, ITEM_NOT_AVAILABLE_AT_LOCATION, InventoryAccessor, Item, LOCATION_MAX_DEPTH, LOCATION_MIN_DEPTH, Location, LocationType, LocationsManager, MAX_ORBITAL_ALTITUDE, MIN_ORBITAL_ALTITUDE, NO_SCHEDULE, 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, PRECISION, platform as PlatformContract, Player, PlayersManager, REQUIRES_MORE_THAN_ONE, REQUIRES_POSITIVE_VALUE, SHIP_ALREADY_THERE, SHIP_ALREADY_TRAVELING, SHIP_CANNOT_BUY_TRAVELING, SHIP_CANNOT_CANCEL_TASK, SHIP_CANNOT_UPDATE_TRAVELING, SHIP_CARGO_NOT_LOADED, SHIP_CARGO_NOT_OWNED, SHIP_INVALID_CARGO, SHIP_INVALID_DESTINATION, SHIP_INVALID_TRAVEL_DURATION, SHIP_NOT_ARRIVED, SHIP_NOT_ENOUGH_ENERGY, SHIP_NOT_ENOUGH_ENERGY_CAPACITY, SHIP_NOT_FOUND, SHIP_NOT_IDLE, SHIP_NOT_OWNED, SHIP_NO_COMPLETED_TASKS, SHIP_NO_TASKS_TO_CANCEL, ScheduleAccessor, server as ServerContract, Ship, Shipload, TRAVEL_MAX_DURATION, TaskCancelable, TaskType, WAREHOUSE_ALREADY_AT_LOCATION, WAREHOUSE_CAPACITY_EXCEEDED, WAREHOUSE_NOT_FOUND, WAREHOUSE_Z, Warehouse, availableCapacity$1 as availableCapacity, availableCapacityFromMass, blendComponentStacks, blendStacks, calcCargoMass, calcEnergyUsage, calcLoadDuration, calc_acceleration, calc_energyusage, calc_extraction_duration, calc_extraction_energy, calc_flighttime, calc_loader_acceleration, calc_loader_flighttime, calc_orbital_altitude, calc_rechargetime, calc_ship_acceleration, calc_ship_flighttime, calc_ship_mass, calc_ship_rechargetime, calc_transfer_duration, calculateFlightTime, calculateLoadTimeBreakdown, calculateRefuelingTime, calculateTransferTime, canMove, capsHasCrafter, capsHasExtractor, capsHasLoaders, capsHasMass, capsHasMovement, capsHasStorage, cargoUtils, components, computeComponentStats, computeContainerCapabilities, computeEntityStats, coordsToLocationId, createInventoryAccessor, createProjectedEntity, createScheduleAccessor, decodeCraftedItemStats, decodeStats, Shipload as default, depthScaleFactor, deriveLocation, deriveLocationEpoch, deriveLocationSize, deriveLocationStatic, deriveResourceStats, deriveStratum, distanceBetweenCoordinates, distanceBetweenPoints, encodeStats, energyPercent, entityRecipes, estimateDealTravelTime, estimateTravelTime, findNearbyPlanets, getAllCraftableItems, getComponentById, getComponentsForCategory, getComponentsForStat, getCurrentEpoch, getDepthThreshold, getDestinationLocation, getEligibleResources, getEntityRecipe, getEntityRecipeByItemId, getEpochInfo, getFlightOrigin, getItem, getItems, getLocationCandidates, getLocationType, getPositionAt, getResourceTier, getResourceWeight, getStatDefinitions, getStatName, getSystemName, hasEnergy, hasEnergyForDistance$1 as hasEnergyForDistance, hasExtractor, hasLoaders, hasMass, hasSchedule, hasSpace$1 as hasSpace, hasSpaceForMass, hasStorage, hasSystem, hash, hash512, isExtractableLocation, isFull$1 as isFull, isFullFromMass, itemIds, lerp, makeContainer, makeShip, makeWarehouse, maxTravelDistance, needsRecharge, projectEntity, projectEntityAt, resolveStats, rotation, schedule, toLocation };
|
|
7651
6475
|
//# sourceMappingURL=shipload.m.js.map
|