From e91b4fba26325d029157e526c03961d0f1029252 Mon Sep 17 00:00:00 2001 From: Jai <814683@qq.com> Date: Mon, 4 Dec 2023 19:21:23 +0800 Subject: [PATCH 001/548] optimiz nova rotation (#55) --- internal/action/buff.go | 27 ++++++++------ internal/action/step/attack.go | 44 +++++++++++++---------- internal/character/lightning_sorceress.go | 32 ++++++----------- 3 files changed, 53 insertions(+), 50 deletions(-) diff --git a/internal/action/buff.go b/internal/action/buff.go index 3a3ef9183..f7e5e7d2b 100644 --- a/internal/action/buff.go +++ b/internal/action/buff.go @@ -32,27 +32,32 @@ func (b *Builder) Buff() *StepChainAction { steps = append(steps, b.buffCTA(d)...) + keys := []string{} for buff, kb := range b.ch.BuffSkills() { if _, found := d.PlayerUnit.Skills[buff]; !found { return nil } if kb != "" { - steps = append(steps, - step.SyncStep(func(_ data.Data) error { - hid.PressKey(kb) - helper.Sleep(300) - hid.Click(hid.RightButton) - helper.Sleep(300) - - return nil - }), - ) + keys = append(keys, kb) } } - if len(steps) > 0 { + if len(keys) > 0 { b.logger.Debug("Buffing...") + + steps = append(steps, + step.SyncStep(func(_ data.Data) error { + for _, kb := range keys { + helper.Sleep(200) + hid.PressKey(kb) + helper.Sleep(300) + hid.Click(hid.RightButton) + helper.Sleep(300) + } + return nil + }), + ) lastBuffedAt = time.Now() } diff --git a/internal/action/step/attack.go b/internal/action/step/attack.go index 2040983c1..e4971254a 100644 --- a/internal/action/step/attack.go +++ b/internal/action/step/attack.go @@ -24,6 +24,7 @@ type AttackStep struct { moveToStep *MoveToStep auraKeyBinding string forceApplyKeyBinding bool + aoe bool } type AttackOption func(step *AttackStep) @@ -49,6 +50,7 @@ func PrimaryAttack(target data.UnitID, numOfAttacks int, opts ...AttackOption) * target: target, standStillBinding: config.Config.Bindings.StandStill, numOfAttacksRemaining: numOfAttacks, + aoe: target == 0, } for _, o := range opts { @@ -57,14 +59,15 @@ func PrimaryAttack(target data.UnitID, numOfAttacks int, opts ...AttackOption) * return s } -func SecondaryAttack(keyBinding string, id data.UnitID, numOfAttacks int, opts ...AttackOption) *AttackStep { +func SecondaryAttack(keyBinding string, target data.UnitID, numOfAttacks int, opts ...AttackOption) *AttackStep { s := &AttackStep{ primaryAttack: false, basicStep: newBasicStep(), - target: id, + target: target, standStillBinding: config.Config.Bindings.StandStill, numOfAttacksRemaining: numOfAttacks, keyBinding: keyBinding, + aoe: target == 0, } for _, o := range opts { o(s) @@ -86,24 +89,27 @@ func (p *AttackStep) Status(_ data.Data) Status { func (p *AttackStep) Run(d data.Data) error { monster, found := d.Monsters.FindByID(p.target) - if !found || monster.Stats[stat.Life] <= 0 { - // Monster is dead, let's skip the attack sequence - p.tryTransitionStatus(StatusCompleted) - return nil - } - // Move into the attack distance range before starting - if p.followEnemy { - if !p.ensureEnemyIsInRange(monster, d) { - return nil - } - } else { - // Since we are not following the enemy, and it's not in range, we can't attack it - _, distance, found := pather.GetPath(d, monster.Position) - if !found || distance > p.maxDistance { + if !p.aoe { + if !found || monster.Stats[stat.Life] <= 0 { + // Monster is dead, let's skip the attack sequence p.tryTransitionStatus(StatusCompleted) return nil } + + // Move into the attack distance range before starting + if p.followEnemy { + if !p.ensureEnemyIsInRange(monster, d) { + return nil + } + } else { + // Since we are not following the enemy, and it's not in range, we can't attack it + _, distance, found := pather.GetPath(d, monster.Position) + if !found || distance > p.maxDistance { + p.tryTransitionStatus(StatusCompleted) + return nil + } + } } if p.status == StatusNotStarted || p.forceApplyKeyBinding { @@ -121,8 +127,10 @@ func (p *AttackStep) Run(d data.Data) error { p.tryTransitionStatus(StatusInProgress) if time.Since(p.lastRun) > config.Config.Runtime.CastDuration && p.numOfAttacksRemaining > 0 { hid.KeyDown(p.standStillBinding) - x, y := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, monster.Position.X, monster.Position.Y) - hid.MovePointer(x, y) + if !p.aoe { + x, y := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, monster.Position.X, monster.Position.Y) + hid.MovePointer(x, y) + } if p.primaryAttack { hid.Click(hid.LeftButton) diff --git a/internal/character/lightning_sorceress.go b/internal/character/lightning_sorceress.go index e641ac8fd..d079808e5 100644 --- a/internal/character/lightning_sorceress.go +++ b/internal/character/lightning_sorceress.go @@ -15,8 +15,8 @@ import ( const ( lightningSorceressMaxAttacksLoop = 10 - lightningSorceressMinDistance = 1 - lightningSorceressMaxDistance = 10 + lightningSorceressMinDistance = 2 + lightningSorceressMaxDistance = 8 ) type LightningSorceress struct { @@ -47,40 +47,30 @@ func (s LightningSorceress) KillMonsterSequence( if len(opts) == 0 { opts = append(opts, step.Distance(lightningSorceressMinDistance, lightningSorceressMaxDistance)) } - //if useStaticField { - // steps = append(steps, - // step.SecondaryAttack(config.Config.Bindings.Sorceress.Blizzard, id, 1, time.Millisecond*100, step.Distance(lightningSorceressMinDistance, maxDistance)), - // step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, id, 5, config.Config.Runtime.CastDuration, step.Distance(lightningSorceressMinDistance, 15)), - // ) - //} + if completedAttackLoops >= lightningSorceressMaxAttacksLoop { return []step.Step{} } steps := make([]step.Step, 0) - // Cast a Blizzard on very close mobs, in order to clear possible trash close the player, every two attack rotations - if completedAttackLoops%2 == 0 { - for _, m := range d.Monsters.Enemies() { - if d := pather.DistanceFromMe(d, m.Position); d < 4 { - s.logger.Debug("Monster detected close to the player, casting Nova over it") - steps = append(steps, step.SecondaryAttack(config.Config.Bindings.Sorceress.Nova, m.UnitID, 5, opts...), step.SecondaryAttack(config.Config.Bindings.Sorceress.Nova, m.UnitID, 5, opts...)) - break - } + for _, m := range d.Monsters.Enemies() { + if d := pather.DistanceFromMe(d, m.Position); d < 5 { + s.logger.Debug("Monster detected close to the player, casting Nova over it") + steps = append(steps, step.SecondaryAttack(config.Config.Bindings.Sorceress.Nova, 0, 3, opts...)) + break } } // In case monster is stuck behind a wall or character is not able to reach it we will short the distance if completedAttackLoops > 5 { if completedAttackLoops == 6 { - s.logger.Debug("Looks like monster is not reachable, reducing max attack distance") + s.logger.Debug("Looks like monster is not reachable, reducing max attack distance.") } - opts = []step.AttackOption{step.Distance(1, 5)} + opts = []step.AttackOption{step.Distance(0, 1)} } steps = append(steps, - step.SecondaryAttack(config.Config.Bindings.Sorceress.Nova, id, 3, opts...), - step.SecondaryAttack(config.Config.Bindings.Sorceress.Nova, id, 3, opts...), - // step.PrimaryAttack(id, 4, opts...), + step.SecondaryAttack(config.Config.Bindings.Sorceress.Nova, id, 5, opts...), ) completedAttackLoops++ previousUnitID = int(id) From d3778e4b2e6b58e85aecac842c0450185851fe16 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Mon, 4 Dec 2023 20:32:03 +0900 Subject: [PATCH 002/548] upgrade d2go lib --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 049a378a4..9a1dc08e1 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/bwmarrin/discordgo v0.27.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 github.com/go-vgo/robotgo v0.110.0 - github.com/hectorgimenez/d2go v0.0.0-20231024132949-8ae0eb55c201 + github.com/hectorgimenez/d2go v0.0.0-20231202072020-c32e8d6ae175 github.com/lxn/win v0.0.0-20210218163916-a377121e959e github.com/robotn/gohook v0.41.0 go.uber.org/zap v1.26.0 diff --git a/go.sum b/go.sum index a53632f3a..0941113a5 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/hectorgimenez/d2go v0.0.0-20231024132949-8ae0eb55c201 h1:fz5W8/MM6EsujQhD2M40rStUFxMKqNKH1sGM6Br5LxA= -github.com/hectorgimenez/d2go v0.0.0-20231024132949-8ae0eb55c201/go.mod h1:HANIsWVCTQeNdEC6whvHegpOlRckU2TPqXr+nEXvoc8= +github.com/hectorgimenez/d2go v0.0.0-20231202072020-c32e8d6ae175 h1:j5rtEg00TG+8f7Rd9IJYDulAxP0GUG53ChhbHfpF80Y= +github.com/hectorgimenez/d2go v0.0.0-20231202072020-c32e8d6ae175/go.mod h1:HANIsWVCTQeNdEC6whvHegpOlRckU2TPqXr+nEXvoc8= github.com/hybridgroup/mjpeg v0.0.0-20140228234708-4680f319790e/go.mod h1:eagM805MRKrioHYuU7iKLUyFPVKqVV6um5DAvCkUtXs= github.com/jezek/xgb v1.1.0 h1:wnpxJzP1+rkbGclEkmwpVFQWpuE2PUGNUzP8SbfFobk= github.com/jezek/xgb v1.1.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= From 0db5a9d53e857c2c22b467872561d0029a568865 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Mon, 8 Jan 2024 18:04:54 +0900 Subject: [PATCH 003/548] increase identify item delay --- internal/action/identify.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/action/identify.go b/internal/action/identify.go index fd5c8463e..cb4b87b8b 100644 --- a/internal/action/identify.go +++ b/internal/action/identify.go @@ -78,13 +78,13 @@ func (b *Builder) itemsToIdentify(d data.Data) (items []data.Item) { func identifyItem(idTome data.Item, i data.Item) { screenPos := ui.GetScreenCoordsForItem(idTome) hid.MovePointer(screenPos.X, screenPos.Y) - helper.Sleep(350) + helper.Sleep(500) hid.Click(hid.RightButton) - helper.Sleep(200) + helper.Sleep(1000) screenPos = ui.GetScreenCoordsForItem(i) hid.MovePointer(screenPos.X, screenPos.Y) - helper.Sleep(300) + helper.Sleep(1000) hid.Click(hid.LeftButton) helper.Sleep(350) } From 424407c81aa8accc3b720e53139ef3f0cad91659 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Fri, 19 Jan 2024 22:28:57 +0900 Subject: [PATCH 004/548] read WP data from memory --- go.mod | 12 ++++++------ go.sum | 26 +++++++++++++------------- internal/action/waypoint.go | 25 +++++++++++++++---------- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 9a1dc08e1..289d3d596 100644 --- a/go.mod +++ b/go.mod @@ -7,13 +7,13 @@ require ( github.com/bwmarrin/discordgo v0.27.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 github.com/go-vgo/robotgo v0.110.0 - github.com/hectorgimenez/d2go v0.0.0-20231202072020-c32e8d6ae175 + github.com/hectorgimenez/d2go v0.0.0-20240119130048-f06c587c7a10 github.com/lxn/win v0.0.0-20210218163916-a377121e959e github.com/robotn/gohook v0.41.0 go.uber.org/zap v1.26.0 gocv.io/x/gocv v0.35.0 - golang.org/x/sync v0.5.0 - golang.org/x/sys v0.14.0 + golang.org/x/sync v0.6.0 + golang.org/x/sys v0.16.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -28,7 +28,7 @@ require ( github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 // indirect github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770 // indirect - github.com/shirou/gopsutil/v3 v3.23.10 // indirect + github.com/shirou/gopsutil/v3 v3.23.12 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect @@ -39,7 +39,7 @@ require ( github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.15.0 // indirect - golang.org/x/image v0.14.0 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/image v0.15.0 // indirect golang.org/x/net v0.18.0 // indirect ) diff --git a/go.sum b/go.sum index 0941113a5..4f76baf85 100644 --- a/go.sum +++ b/go.sum @@ -23,8 +23,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/hectorgimenez/d2go v0.0.0-20231202072020-c32e8d6ae175 h1:j5rtEg00TG+8f7Rd9IJYDulAxP0GUG53ChhbHfpF80Y= -github.com/hectorgimenez/d2go v0.0.0-20231202072020-c32e8d6ae175/go.mod h1:HANIsWVCTQeNdEC6whvHegpOlRckU2TPqXr+nEXvoc8= +github.com/hectorgimenez/d2go v0.0.0-20240119130048-f06c587c7a10 h1:D5P2UEd1bZtuDuduevQ/1dP6ZJsMiHZjAjdmEE3MXMQ= +github.com/hectorgimenez/d2go v0.0.0-20240119130048-f06c587c7a10/go.mod h1:HANIsWVCTQeNdEC6whvHegpOlRckU2TPqXr+nEXvoc8= github.com/hybridgroup/mjpeg v0.0.0-20140228234708-4680f319790e/go.mod h1:eagM805MRKrioHYuU7iKLUyFPVKqVV6um5DAvCkUtXs= github.com/jezek/xgb v1.1.0 h1:wnpxJzP1+rkbGclEkmwpVFQWpuE2PUGNUzP8SbfFobk= github.com/jezek/xgb v1.1.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= @@ -51,8 +51,8 @@ github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 h1:2lhSR8N3T6I30q096DT7 github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ= github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770 h1:2uX8QRLkkxn2EpAQ6I3KhA79BkdRZfvugJUzJadiJwk= github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU= -github.com/shirou/gopsutil/v3 v3.23.10 h1:/N42opWlYzegYaVkWejXWJpbzKv2JDy3mrgGzKsh9hM= -github.com/shirou/gopsutil/v3 v3.23.10/go.mod h1:JIE26kpucQi+innVlAUnIEOSBhBUkirr5b44yr55+WE= +github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= +github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= @@ -89,15 +89,15 @@ go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= gocv.io/x/gocv v0.35.0 h1:Qaxb5KdVyy8Spl4S4K0SMZ6CVmKtbfoSGQAxRD3FZlw= gocv.io/x/gocv v0.35.0/go.mod h1:oc6FvfYqfBp99p+yOEzs9tbYF9gOrAQSeL/dyIPefJU= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= -golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= -golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= +golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -105,9 +105,9 @@ golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/internal/action/waypoint.go b/internal/action/waypoint.go index 69ad76bfb..85af839c7 100644 --- a/internal/action/waypoint.go +++ b/internal/action/waypoint.go @@ -7,7 +7,6 @@ import ( "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" "go.uber.org/zap" - "gocv.io/x/gocv" ) const ( @@ -63,19 +62,25 @@ func (b *Builder) openWPAndSelectTab(a area.Area, d data.Data) Action { func (b *Builder) useWP(a area.Area) *Chain { return NewChain(func(d data.Data) (actions []Action) { - sc := helper.Screenshot() - nextAvailableWP := area.WPAddresses[a] + currentWP := a traverseAreas := make([]area.Area, 0) for { - //tm := b.tf.FindInArea("ui_discovered_wp", sc, wpTabStartX, wpListStartY+(wpAreaBtnHeight*(nextAvailableWP.Row-1)), wpTabStartX+60, wpListStartY+(wpAreaBtnHeight*nextAvailableWP.Row)) - tm := b.tf.MatchColorInArea(sc, gocv.NewScalar(3, 230, 230, 0), gocv.NewScalar(140, 255, 255, 0), wpTabStartX, wpListStartY+(wpAreaBtnHeight*(nextAvailableWP.Row-1)), wpTabStartX+9, wpListStartY+(wpAreaBtnHeight*nextAvailableWP.Row)) - if !tm.Found && nextAvailableWP.Row != 1 { - traverseAreas = append(nextAvailableWP.LinkedFrom, traverseAreas...) - nextAvailableWP = area.WPAddresses[nextAvailableWP.LinkedFrom[0]] - continue + found := false + for _, wp := range d.PlayerUnit.AvailableWaypoints { + if wp == currentWP { + found = true + break + } + } + + if found || nextAvailableWP.Row == 1 { + break } - break + + traverseAreas = append(nextAvailableWP.LinkedFrom, traverseAreas...) + a = nextAvailableWP.LinkedFrom[0] + nextAvailableWP = area.WPAddresses[currentWP] } // First use the previous available waypoint that we have discovered From 7432f815e06225b3fdbba2541164260a26618fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Gim=C3=A9nez?= Date: Sat, 3 Feb 2024 16:44:39 +0900 Subject: [PATCH 005/548] Mem injection (#68) --- .github/workflows/build.yml | 21 -- README.md | 11 +- assets/quests/a1_1.webp | Bin 3562 -> 0 bytes assets/quests/a1_2.webp | Bin 3616 -> 0 bytes assets/quests/a1_3.webp | Bin 3602 -> 0 bytes assets/quests/a1_4.webp | Bin 3352 -> 0 bytes assets/quests/a1_5.webp | Bin 3928 -> 0 bytes assets/quests/a1_6.webp | Bin 3612 -> 0 bytes assets/quests/a2_1.webp | Bin 3410 -> 0 bytes assets/quests/a2_2.webp | Bin 3754 -> 0 bytes assets/quests/a2_3.webp | Bin 3652 -> 0 bytes assets/quests/a2_4.webp | Bin 3886 -> 0 bytes assets/quests/a2_5.webp | Bin 3596 -> 0 bytes assets/quests/a2_6.webp | Bin 3814 -> 0 bytes assets/quests/a3_1.webp | Bin 3858 -> 0 bytes assets/quests/a3_2.webp | Bin 3696 -> 0 bytes assets/quests/a3_3.webp | Bin 3732 -> 0 bytes assets/quests/a3_4.webp | Bin 3860 -> 0 bytes assets/quests/a3_5.webp | Bin 3778 -> 0 bytes assets/quests/a3_6.webp | Bin 3838 -> 0 bytes assets/quests/a4_1.webp | Bin 3616 -> 0 bytes assets/quests/a4_2.webp | Bin 3448 -> 0 bytes assets/quests/a4_3.webp | Bin 3732 -> 0 bytes assets/quests/a5_1.webp | Bin 3816 -> 0 bytes assets/quests/a5_2.webp | Bin 4076 -> 0 bytes assets/quests/a5_3.webp | Bin 3474 -> 0 bytes assets/quests/a5_4.webp | Bin 4066 -> 0 bytes assets/quests/a5_5.webp | Bin 4064 -> 0 bytes assets/quests/a5_6.webp | Bin 3898 -> 0 bytes assets/skills/102.webp | Bin 3014 -> 0 bytes assets/skills/106.webp | Bin 3178 -> 0 bytes assets/skills/112.webp | Bin 2966 -> 0 bytes assets/skills/113.webp | Bin 2988 -> 0 bytes assets/skills/115.webp | Bin 2952 -> 0 bytes assets/skills/117.webp | Bin 3012 -> 0 bytes assets/skills/220.webp | Bin 3270 -> 0 bytes assets/skills/36.webp | Bin 3204 -> 0 bytes assets/skills/37.webp | Bin 1480 -> 0 bytes assets/skills/38.webp | Bin 1456 -> 0 bytes assets/skills/39.webp | Bin 1478 -> 0 bytes assets/skills/40.webp | Bin 2986 -> 0 bytes assets/skills/41.webp | Bin 1424 -> 0 bytes assets/skills/42.webp | Bin 3048 -> 0 bytes assets/skills/43.webp | Bin 1374 -> 0 bytes assets/skills/44.webp | Bin 1518 -> 0 bytes assets/skills/45.webp | Bin 3182 -> 0 bytes assets/skills/46.webp | Bin 1518 -> 0 bytes assets/skills/47.webp | Bin 3254 -> 0 bytes assets/skills/48.webp | Bin 1472 -> 0 bytes assets/skills/49.webp | Bin 1342 -> 0 bytes assets/skills/50.webp | Bin 1508 -> 0 bytes assets/skills/51.webp | Bin 1396 -> 0 bytes assets/skills/52.webp | Bin 1406 -> 0 bytes assets/skills/53.webp | Bin 1416 -> 0 bytes assets/skills/54.webp | Bin 3028 -> 0 bytes assets/skills/55.webp | Bin 1352 -> 0 bytes assets/skills/56.webp | Bin 1556 -> 0 bytes assets/skills/57.webp | Bin 1432 -> 0 bytes assets/skills/58.webp | Bin 1410 -> 0 bytes assets/skills/59.webp | Bin 3118 -> 0 bytes assets/skills/60.webp | Bin 1440 -> 0 bytes assets/skills/61.webp | Bin 1464 -> 0 bytes assets/skills/62.webp | Bin 1550 -> 0 bytes assets/skills/63.webp | Bin 1344 -> 0 bytes assets/skills/64.webp | Bin 1498 -> 0 bytes assets/skills/65.webp | Bin 1514 -> 0 bytes assets/skills/98.webp | Bin 3002 -> 0 bytes assets/skills/merc_104.webp | Bin 4678 -> 0 bytes assets/skills/merc_99.webp | Bin 1582 -> 0 bytes assets/ui/config_gear.webp | Bin 1960 -> 0 bytes assets/ui/discovered_wp.webp | Bin 1954 -> 0 bytes assets/ui/undiscovered_wp.webp | Bin 972 -> 0 bytes build.bat | 2 - cmd/koolo/main.go | 52 ++--- cmd/memory/main.go | 57 ++--- cmd/pickup/main.go | 17 +- go.mod | 28 +-- go.sum | 81 +------ internal/action/action_builder.go | 5 +- internal/action/buff.go | 8 +- internal/action/character.go | 7 +- internal/action/clear_level.go | 3 +- internal/action/gambling.go | 3 +- internal/action/horadric_cube.go | 29 +-- internal/action/identify.go | 7 +- internal/action/leveling_tools.go | 189 ++++++++++------ internal/action/move.go | 3 +- internal/action/pre_run.go | 1 + internal/action/recover_corpse.go | 5 +- internal/action/repair.go | 3 +- internal/action/stash.go | 31 ++- internal/action/step/attack.go | 9 +- internal/action/step/interact_entrance.go | 4 +- internal/action/step/interact_npc.go | 5 +- internal/action/step/interact_object.go | 9 +- internal/action/step/move_to.go | 2 +- internal/action/step/open_portal.go | 2 +- internal/action/step/pickup_item.go | 11 +- internal/action/waypoint.go | 13 +- internal/bot.go | 8 +- internal/character/blizzard_sorceress.go | 4 +- internal/character/hammerdin.go | 4 +- internal/character/lightning_sorceress.go | 4 +- internal/character/paladin_leveling.go | 30 ++- internal/character/sorceress_leveling.go | 26 +-- internal/event/listener.go | 6 +- internal/helper/game_manager.go | 48 ++--- internal/helper/screenshot.go | 87 +++++++- internal/helper/tcp/const.go | 35 --- internal/helper/tcp/error.go | 5 - internal/helper/tcp/game.go | 45 ---- internal/helper/tcp/helper.go | 38 ---- internal/helper/winproc/gdi32.go | 13 ++ internal/helper/winproc/kernel32.go | 13 ++ internal/helper/winproc/user32.go | 9 + internal/hid/keyboard.go | 54 ++++- internal/hid/mouse.go | 71 ++++-- internal/memory/hooks_asm.go | 145 +++++++++++++ internal/pather/path_finder.go | 24 +-- .../remote/discord/discord_event_handler.go | 7 +- internal/run/diablo.go | 7 +- internal/run/leveling.go | 4 +- internal/run/leveling_act1.go | 16 +- internal/run/leveling_act2.go | 35 +-- internal/run/leveling_act3.go | 33 +-- internal/run/leveling_act4.go | 5 +- internal/run/leveling_act5.go | 12 +- internal/run/nihlathak.go | 6 +- internal/supervisor.go | 13 +- internal/town/shop_manager.go | 20 +- internal/ui/coordinates.go | 18 +- internal/ui/template_finder.go | 203 ------------------ prepare_env.bat | 7 - 133 files changed, 744 insertions(+), 929 deletions(-) delete mode 100644 assets/quests/a1_1.webp delete mode 100644 assets/quests/a1_2.webp delete mode 100644 assets/quests/a1_3.webp delete mode 100644 assets/quests/a1_4.webp delete mode 100644 assets/quests/a1_5.webp delete mode 100644 assets/quests/a1_6.webp delete mode 100644 assets/quests/a2_1.webp delete mode 100644 assets/quests/a2_2.webp delete mode 100644 assets/quests/a2_3.webp delete mode 100644 assets/quests/a2_4.webp delete mode 100644 assets/quests/a2_5.webp delete mode 100644 assets/quests/a2_6.webp delete mode 100644 assets/quests/a3_1.webp delete mode 100644 assets/quests/a3_2.webp delete mode 100644 assets/quests/a3_3.webp delete mode 100644 assets/quests/a3_4.webp delete mode 100644 assets/quests/a3_5.webp delete mode 100644 assets/quests/a3_6.webp delete mode 100644 assets/quests/a4_1.webp delete mode 100644 assets/quests/a4_2.webp delete mode 100644 assets/quests/a4_3.webp delete mode 100644 assets/quests/a5_1.webp delete mode 100644 assets/quests/a5_2.webp delete mode 100644 assets/quests/a5_3.webp delete mode 100644 assets/quests/a5_4.webp delete mode 100644 assets/quests/a5_5.webp delete mode 100644 assets/quests/a5_6.webp delete mode 100644 assets/skills/102.webp delete mode 100644 assets/skills/106.webp delete mode 100644 assets/skills/112.webp delete mode 100644 assets/skills/113.webp delete mode 100644 assets/skills/115.webp delete mode 100644 assets/skills/117.webp delete mode 100644 assets/skills/220.webp delete mode 100644 assets/skills/36.webp delete mode 100644 assets/skills/37.webp delete mode 100644 assets/skills/38.webp delete mode 100644 assets/skills/39.webp delete mode 100644 assets/skills/40.webp delete mode 100644 assets/skills/41.webp delete mode 100644 assets/skills/42.webp delete mode 100644 assets/skills/43.webp delete mode 100644 assets/skills/44.webp delete mode 100644 assets/skills/45.webp delete mode 100644 assets/skills/46.webp delete mode 100644 assets/skills/47.webp delete mode 100644 assets/skills/48.webp delete mode 100644 assets/skills/49.webp delete mode 100644 assets/skills/50.webp delete mode 100644 assets/skills/51.webp delete mode 100644 assets/skills/52.webp delete mode 100644 assets/skills/53.webp delete mode 100644 assets/skills/54.webp delete mode 100644 assets/skills/55.webp delete mode 100644 assets/skills/56.webp delete mode 100644 assets/skills/57.webp delete mode 100644 assets/skills/58.webp delete mode 100644 assets/skills/59.webp delete mode 100644 assets/skills/60.webp delete mode 100644 assets/skills/61.webp delete mode 100644 assets/skills/62.webp delete mode 100644 assets/skills/63.webp delete mode 100644 assets/skills/64.webp delete mode 100644 assets/skills/65.webp delete mode 100644 assets/skills/98.webp delete mode 100644 assets/skills/merc_104.webp delete mode 100644 assets/skills/merc_99.webp delete mode 100644 assets/ui/config_gear.webp delete mode 100644 assets/ui/discovered_wp.webp delete mode 100644 assets/ui/undiscovered_wp.webp delete mode 100644 internal/helper/tcp/const.go delete mode 100644 internal/helper/tcp/error.go delete mode 100644 internal/helper/tcp/game.go delete mode 100644 internal/helper/tcp/helper.go create mode 100644 internal/helper/winproc/gdi32.go create mode 100644 internal/helper/winproc/kernel32.go create mode 100644 internal/helper/winproc/user32.go create mode 100644 internal/memory/hooks_asm.go delete mode 100644 internal/ui/template_finder.go delete mode 100644 prepare_env.bat diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 106256da6..5c0d14eec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,33 +9,12 @@ jobs: name: "Build Koolo binary" runs-on: windows-2022 steps: - # Remove this once Windows image get fixed - - name: Remove Strawberry Perl from PATH - run: | - $env:PATH = $env:PATH -replace "C:\\Strawberry\\c\\bin;", "" - "PATH=$env:PATH" | Out-File -FilePath $env:GITHUB_ENV -Append - rm C:\mingw64 -force -r - - name: "Install CMake" - run: | - choco install -y --force cmake 7zip.install wget - - name: "Install MinGW" - run: | - wget -nv https://download.qt.io/development_releases/prebuilt/mingw_64/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z - 7z x -aoa -oC: x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z - "C:\mingw64\bin" >> $env:GITHUB_PATH - name: "Checkout" uses: actions/checkout@v4 - name: "Setup Go" uses: actions/setup-go@v4 with: go-version: '1.21' - - name: "Prepare env" - run: mkdir C:\go\pkg - - name: "Building OpenCV" - continue-on-error: true - env: - GOPATH: C:\go - run: .\prepare_env.bat - name: "Building Koolo artifacts" env: GOPATH: C:\go diff --git a/README.md b/README.md index 36c8f4a8a..7231829fa 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,6 @@ not aware of any ban for using it. I'm not responsible for any ban or any other - Diablo II: LOD 1.13c (required by https://github.com/blacha/diablo2/tree/master/packages/map) ## Quick Start -Koolo will be clicking, moving the mouse, pressing keys... Basically this makes the computer unusable while running the -bot. It's recommended to run it on a [virtual machine](https://github.com/jamesstringerparsec/Easy-GPU-PV). - - If you haven't done yet, install **Diablo II: LOD 1.13c** - [Download](https://github.com/hectorgimenez/koolo/releases) the latest Koolo release, or alternatively you can [build it from source](#development-environment) - Extract the zip file in a directory of your choice. @@ -44,10 +41,9 @@ bot. It's recommended to run it on a [virtual machine](https://github.com/jamess - Open Diablo II: Resurrected and ensure the game resolution is set to windowed mode and 1280x720 or 1920x1080 in HiDPI mode. - Enter the game with your character. - Run `koolo.exe`. -- It should start the configured runs. You can pause/resume execution with ```,``` or stop it with ```.``` keys ## How it works -Koolo reads game memory and interacts with the game simulating clicks/keystrokes. +Koolo reads game memory and interacts with the game injecting clicks/keystrokes to the game window. It uses the following third party libraries: - https://github.com/hectorgimenez/d2go @@ -60,10 +56,6 @@ It uses the following third party libraries: Setting the development environment is pretty straightforward, but the following dependencies are **required** to build the project. ### Dependencies -- [Download MingGW](https://sourceforge.net/projects/mingw-w64/files/) ```x86_64-posix-seh``` should be fine, extract it - and add it to the system PATH on Windows environment variables. For example if extracted in ```C:\mingw64``` add - ```C:\mingw64\bin``` to the PATH. [Robotgo](https://github.com/go-vgo/robotgo) and [GoCV](https://github.com/hybridgroup/gocv#windows) dependencies requires MinGW to build. -- [Download CMake](https://cmake.org/download/) select add it to the user path during the installation process. - [Download Go >= 1.21](https://go.dev/dl/) - [Install git](https://gitforwindows.org/) @@ -72,7 +64,6 @@ Open the terminal and run the following commands in project root directory: ```shell git clone https://github.com/hectorgimenez/koolo.git cd koolo -prepare_env.bat build.bat ``` This will produce the "build" directory with the executable file and all the required assets. diff --git a/assets/quests/a1_1.webp b/assets/quests/a1_1.webp deleted file mode 100644 index 00c596bb3aa53cc041a623f9dabcd55aacad2e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3562 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 E17e>W+5i9m diff --git a/assets/quests/a1_2.webp b/assets/quests/a1_2.webp deleted file mode 100644 index a754f3462ca4fc87659732e5abf813513ea629ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3616 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 diff --git a/assets/quests/a1_4.webp b/assets/quests/a1_4.webp deleted file mode 100644 index 6494586cc499db0bc0aa1be49b062483ead76903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3352 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 DDE%^@ diff --git a/assets/quests/a2_1.webp b/assets/quests/a2_1.webp deleted file mode 100644 index cfb5e28b2b26587eb33452c2e1313989fb6c27ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3410 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 JKR$7Se*tZVvTFbU diff --git a/assets/quests/a2_2.webp b/assets/quests/a2_2.webp deleted file mode 100644 index 95b4272340a56ab0731ef0dce8a70c657bbde425..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3754 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 diff --git a/assets/quests/a2_4.webp b/assets/quests/a2_4.webp deleted file mode 100644 index da6b2103949be5143e77c02c6a0aba26e22363b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3886 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 PfZq{784wjZYNOmHb>o$~- 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 Brj-By diff --git a/assets/quests/a3_1.webp b/assets/quests/a3_1.webp deleted file mode 100644 index 80025721a7d4e2f56dd6d6a8c84b1112e667e1b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3858 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 diff --git a/assets/quests/a3_3.webp b/assets/quests/a3_3.webp deleted file mode 100644 index 84b2b47392e369cd0f461e1d7431969dd72f95a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3732 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 diff --git a/assets/quests/a3_5.webp b/assets/quests/a3_5.webp deleted file mode 100644 index 19669de760b840143c582a554d9918367ed2489b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3778 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 L6C+{fG~j;#|CLym diff --git a/assets/quests/a3_6.webp b/assets/quests/a3_6.webp deleted file mode 100644 index a708b78c097ee47210f2062e528998aa6abfc975..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3838 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 WYDvq2%eKCx<9gXh25kN@&uv)006)# zL-zNjsiLC)hMMvSsNXo*;vYa20l+)EyBXY2hMSt1!|CP#4S-RG2tcB3AGqoosv8|= z|M%D)1XRZ>B(dYY{(H{9s!UkB2etrE!6_MvwytjO6txmcscI z7ImW>kix^qI_7U)I%fOd{JSW2HzNZTN^R^E9d7?0jQJ0?z3Yaj3)&eU2ILMfI(a!m{A!Qb%jC0@y&;+_bpVC$g@Bj|L3Ah6>%Ir*09smQ% zy7IsHxqtihDJ~4fA{aKhs6zEReW*FnY*07jHv>2w0{;w1pW_LRLX|D|qv zisAqI_W$PmZ~rKNu8zS;0K{b#Pl49C@;E`Y@NugnE1cXekH(nr!Rpio>nA*qJ<7i$ z#lI9kCeb$d;(DRMd9_S~Thy#i*i~ceU7>6m@W8Lo24Y(;R5>~z1D7NyfuUs(l$g12 zNdul50{OMu{57rv)g&=@)jqjo&Sc<8;bM#LrEdy!v+h%)4`+0CsE&?~90e+PXXXyt zck*0nWmBlN-a>>j?v%D)FzKAgncl81v&vo{h;kfCEy{*Wu1iRg`iLvjU80*fm#>^j zpNW*veBn2RS3MG$X4)|}mN(r?(%OkC@E@>to+`3!9fQT72)3=!Wwp!r70 zffteThcQUP)P9e(N$dOfuyDNp4;PrG+)vYHM`G1#53s7W3%Q6kfT^w8j^?S9p0 zQl(eT&V~t!Ac`+>3@S&?_tuF4WmwM@Y;J1s4& zh_!{41 z%f#r{mz#nUJ2K@+v3v3&T`@E@;=1nRpi3^7Fj@0(#SlgAZU=5c|fjUFA(D zqf;zjL0JJ#v8hU=%oEvckHe6r;X)>9X`JPI6*1l`J+tEe=zt)QQQpTson99^S+v4pA z-}YZ)(wkqj-Y4Ej6%+US`S8e7PmshAbr)&zJe8l81%iGXxc~O(K;HhZ;BRS%#DeY%QzoH&IFCbWsyG4T=zc&>>6Ye08fHI>3&66@##0aP zu2m`ctY@r_s05S8y-_>CYOQ@aqg~`*vVmV)%a_;kp)lV%sVwd&qYL%Zs*`gqwy@f@ z+Ia}7;Nz&LHjtb7dW3&|$zC-42`H5IX%4FA=|-68K7Qg kXopl1R4$U1P&nh}{tYtn!pg4U zZB|XoX(F>xajg%7ldz+FLsW`~tI5t|sD?$FB|q0o=k$WR0fSfS1PFs~&6bhg7z4=g z_8(}gkqiB9`X-Dr#`)JD`Q!p>o`vuG=dHdbxP{nk?iQuH*UWTn4t-2@c`Cs&DgLXG zW_)Z>4)>-iFM4n{Aw4EP?L3d$7}p+h$6oJZ6Y z#$Gkzlo8!(T4+f`d0&=u-D}D$aa{ILs2AlL+?||{4?+YcUvBFdy#8Iq?mA=t%Xy=w zd}1`)A_uGhql6f$kw8jL-CDVKsXv5;iPy@DCAri=0!t8fd|!^RdVwcupCA743i)Zh zdyLcRF>RdZw=i;2SFM}BH|KEV7{W#ipD@Sv=LA92^Lu6ju~Me0`sYm-T7=j>d05vQ zTG)~B68XhAA<&Z@1TCwr&4f=@RZCtq^?Wzya2`8WD{!=?e)d|5#TO^`md8>ulcTe* zvPjj>jpPvUKiek`F5ron$3;f>7)GL=ew0?!s~~q04ZKnvF6LFd?%$iF#Xx# z-3<@cI`sZ18>iQMx5297MHoD-n)8tzzCF`keio6crG8Pd{`DWyU-Xo#d~Kuf=em}o zA?l;gqC1rVBQ@O_M$Qp59mcItp}!-{o?j_KB)Yg~dVDQ3rm~`#Ht6h&ITt-v$;F&Z z$s9kHAmY!Gtw(=3rlI(>P+WUiswDCyZ53sXD(=Yb3hvJza{EjlY@aX&(?@gDs(jq3&DLohPB{ zsEwNL>Lc=B-*+`EdOgY6xaXB@78!TE)|*R5)Fo4RMoPW5ZPO07hy2!xZXSNGJKQXL z)o+TaI}PpF?$nDRxPN!t%&m8`m^1Mn7GyAWTtjSFU z{`*sP-Y~9D%X$*@?w5mjx}OHxYFeDKmRHHoFw(u!Y@C&RHx*`W{=&R+w`q%GYJbIL z>7imTL_#P5wz?qlwT1sn&Z0T7u`A(%9l>lfX05av4pgfQrk4gKFAE3pUMjS~6<0mrmdNV1URs;U zRqluj8#(y%EN6p7s3bBBd$8Mn>x@U_&qo32?Da$-gS-cDOKrg!UZi5i^EZsQ?HW!r zq&4Qk1hiuC?jB$IyCM@rp%7(wB6wp?3vPUZDM&ThgviT~MBp@sKb5u@m`|&Y>5JuK zn?&E?=`mtaqY&uDnw2ZX!Q5t?Ids~thMI9}X9)74IgbLscSL@Eb-WW)f#+(Bt(f@f z(qVo|xcvsQ=76p8@CHPCcDu zuJwaYn zp5&B|-`gN~n_}rs%@Ex4iWvhV=N9_(_N-l82|}7}PhTc7Ro2whRVjV0ijaN9wIJ^~ z|6Rkv+Pa~SQIQ_`Q;zNWTx4bRITm3-Hjzczn{xXrc_Jp{a0iYv1yq;{tT2z`%KXB` z0eiVjnkO_T+a(h9u1i-m!O?;x!3|bcV#~ppTu#pN9bLvytV-<_=OOz>(_{lah^mbQ z8{=|0oFCqo<$%0%-(GYMLA7&OBVB5s<@g~{x^&Qd{%A@{jMQshXX!}l&vG!!$}P29 Huz>szRtH6p diff --git a/assets/quests/a4_2.webp b/assets/quests/a4_2.webp deleted file mode 100644 index 7afc413a2693939dd6991070a35fea7125ed51eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3448 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 diff --git a/assets/quests/a4_3.webp b/assets/quests/a4_3.webp deleted file mode 100644 index 31d22ef05e09613d49cee4ca0dad50a25931de79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3732 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 v%XgT}?paFD%KB=ts01I3J8u$TG((FM}e1QRJ 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 DJ&p^o diff --git a/assets/quests/a5_3.webp b/assets/quests/a5_3.webp deleted file mode 100644 index ecd198c536c1a023e2773d7c22caeb1e1aad132e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3474 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 Wo4waFDD&Iv>Y*-;W_vXxUhqE~7`GV! diff --git a/assets/quests/a5_4.webp b/assets/quests/a5_4.webp deleted file mode 100644 index f92c405b6559656d3da196c6f92f11883498469a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4066 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 diff --git a/assets/quests/a5_5.webp b/assets/quests/a5_5.webp deleted file mode 100644 index e91abd5bdecf2566bca18c953039de43adab3d37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4064 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 diff --git a/assets/quests/a5_6.webp b/assets/quests/a5_6.webp deleted file mode 100644 index 377cd71b2ff2f3cfbb2c2ae68c1bd9cfcf6d0be5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3898 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 diff --git a/assets/skills/102.webp b/assets/skills/102.webp deleted file mode 100644 index 91cd3d21da9eeaab9ce787d6fb832eab65abf0f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3014 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 fwRH$6i*TS|7|}k2Pk diff --git a/assets/skills/106.webp b/assets/skills/106.webp deleted file mode 100644 index ea70c3aaee1a2d2390d46db22aac3286b29a50d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3178 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 diff --git a/assets/skills/113.webp b/assets/skills/113.webp deleted file mode 100644 index 4c9b5812c79e315ffc31f3a20857ef9100ca5f63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2988 zcmaKqc|26>AIG1BP+FL}p)O@)Eqk_P%QDH5eMwnEwrK{5a5I#>F?J0zLQ+OZwi_yp zxHUwY5Na%AFXI|9nBU?4Ucc@i_x`@G^PJ~>KF{~_oag&J#|mL&RJSr4n1_#> zC&c9t%b}nHLi}k< z3R>6y7r*ef-x6}ULoQ$70XfcrAP@lDw*6r18$dZw{Om3IsJskvtZP{Y%|E zkl}xQ`@cE=?H}~#UKoK~^3u9|`}w7Oej^HfF<#rn^o*ZkbJ|2Nw2?{1^;OR3FV#8H zRlRd~94g~IybM?C0vfLD0qcwV6p(l$96XbqMVVtBP%#vkLwhH?iXd?5r!M%WMaK$P zY>KL5^u!T~Gv9?ciP0$pGq$Ab^&gd3y~QI)b62;rto74v`c}Ax7XAlE_MRXgGvvd1 z)Kn!iiaG{Kp*G_Cfv>;YxwVlmu${0%NF+p5yKuCMm}2uu98@Lb;*ZK@&}S^9npy z`B^R$LRW|TD%_&s$~U@m8U+7v3>~cg^UH{DbW9KeCx^iKC*>Hv`>gzWHY%cm%_gy$ z8pkFBugT0gvskbX`O5Nb$Nn96A(d{KSy*53=9Q#GbPF1#WFX@8@0VC>}vg9%y zEFrEqFZ5<&QchCxVGPFv^NRdODl?l9ed@{xD$(z(B#jf9r`dN~MJm-D2;>oCIfy|W zE6<-`s3lSQ`89_#{SKR296E0a=dCPOK7qv+AFIq5VbWI%6h^y!T58P6)JpdTS;LoS zm&;#Cmpg`y$=uN2Z{TD~^{-YVq%eeMjfH+IzBV53Xd746{~@EZZ?3-eo`$)l+d#Qb zWJ*#7>5yH1S{3=2+Rz>UdY$Q!c0%+m)W>E=QrGi_%8Sx>A9}ezEsTE?4v9ve)+ohOPls=t=xhs^5c2UBPUsF)izaVYV7y+50e$r zQN`l6ndR%rr@qCp*S|_^X3e(MIYkk=)odeV`|B2QPh5(|5K=YWeqTf^M@{A4tF(kx z9DUJbJ(AuZxTdi(YOmwnPdjWM8OPPB_CfMx!x_75da=}nyjkV?Pm#XPEd$JZpPzfN znCLNvwvvPQ)HCaOE1q+cD)gCH$*M&1*ud(1oyASt74e(YA8XbX?$Sfv2fwrjr4J)v zaDyxReYzO=G`#=Ww-!dDrDs$__G_o7i&XX&gzeLUqE|86p!E-rGwL$$8;a^%1r>_VC6 zz2=6~5e|4KwR%^{U6_+5erzX-;Z0I)gUY-q*r1n7rQy*WK>*sI!?f|{hI5&2ou!qq3-^o)rcns z4QCW4-Fm8GETmx zHSO>0@RZP?KCzb_X;^r0ygp_=csJRf-kZ79fbvax*DIq=cNBSu1cEJ^w7@}DPv zw3Q%m8L7Ak4f$8}7KBwRPwf8jw&!-Axhs6?zG~P|o$=-n|FlUdne+(nisu;bDD5AR zhjU%QTrN%YxUcnIA*altR3(@8^-e}=3b%S5ZxTjAbaiiMjDt4mg}3j)7jm~~e7qcw zwVrX4asu524P{PI7>HL#o34@Pgf-u7(%uiP8ETpp_pWkUF){@@Xue_d-`pAl^0ikl znoQhcbe>6-{NrW5BwevG2RsUktb zHx@2m%V}nHt+AbybC*lm8VOJjGcGKBqwLm6h`gMo@14sEEq?dWIdqN5=|0eosW9ph(dGQ1=E>| z^@)+SR(ZM(pR*~3Z6n)l7L72|IjDVkmAfQVkEz>25g1nW z^(tGCKPl<*r-;;*tBy5hM?BSD2ruv6Vfo1c(F^xnY{@(M^b{-6+6qYq=%>v8Ihr`bui~n$d zX22I*nEl;PYgA-xcYjnx#61~TgAz36_R;tRS*-!-BKRV8IodnCZqm^sNGoZ+Vc0aG z;qjlJ3VZKx+DoKkg?3|Ae>p^}7cH%(7Ka={xs9&r7Qv1sC@Es=8RUXxh5=>TJ=X*S zp9V5slRP=x8J0T)wepI?Ss|2pf{VST=4-uJ+Xq;gf~lwK@UnCnLA1QcPHO|pl6oJnU_&wC-d-10q2o7uQ@pp&n4*ko0;FL%{IW&ZD-mZ0W Ao&W#< diff --git a/assets/skills/115.webp b/assets/skills/115.webp deleted file mode 100644 index e3617b466ea362db3832a5604ca0401830cd3d52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2952 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 Wme;~kFZjvg0P&_QJL}XG4E`q@Mci}% diff --git a/assets/skills/117.webp b/assets/skills/117.webp deleted file mode 100644 index 3b7a1931ea27f81941024e1563ac2f0d3c67dea8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3012 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 ad8b`L;pKyvskjm+mBLt=viq+evi%3J0nLm6 diff --git a/assets/skills/220.webp b/assets/skills/220.webp deleted file mode 100644 index 568eb4e8fcad24eae3960816fc7b08d12178f524..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3270 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 Z#BqUj{{d~zVzC)tsa9-;<3VAj{{R-aUE=@% diff --git a/assets/skills/36.webp b/assets/skills/36.webp deleted file mode 100644 index 7957697db0963720789dd7111637a0c0f3744319..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3204 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 NN;-8l)3eYG{|7-I=DGj? diff --git a/assets/skills/39.webp b/assets/skills/39.webp deleted file mode 100644 index 0f1915bdfd3c0a17f09572aef67425b268b4af02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1478 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 diff --git a/assets/skills/44.webp b/assets/skills/44.webp deleted file mode 100644 index 80ef7ccef52eaaceddccd01d72a0ee63bf25cd29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1518 zcmaKqe^gUt7{{NDAHyZG2_4V_Y;wS4425L{(gECLKmrcLF+d&c2OGg)j&W2JK{S75 zN=W<&*g!J;g<>YDlz>uJ2+|M%WeI99f)MbqK$*99vlITIz30C7{oL>KeBb*%&%IHh zZ1$i9Kui#m!{zw!hydV)rn~71WwAJwc=QPP%2c5&!#of`mZnrh1v9C<*f=U-2naw1 zYw&>;iNXwd_l{R+U$@{mAt}&S6C=j$WYEol;bLr zrJ?=tyq7F8@=hbmQZv!nOv6~=d~w=_^=NfP(-DFp6vBZ6R1iQWBtt4F!4s`%NXdXG z6lcD{zu4sGAeR8Sl0k?ZYaktDkZAIQ@f)BVH0FAnk@POZB;n>W0W5yUu%~VSgku1P zd<=VDg<*!{0A_svO=)xf^hyAqDWvDmX|8Gjo4o+_EpwWn7~s4801mzKL`9jd~T<22lDXz)}g?d*d7GwnB#g`u4v$|MqWn z7$?LQnQ)|qq!((g*xhAmQ~5Z7vUC;)=&z=lqce_V|5%U*Z;fH5U71m5_^lR1iW9>O@!(@@AF?>}y>vU1X6hGBo%JYy!L5ogef$^o+RI)oRu0_imlp zVKM9#t#IuO{F-5}RNV)7f&KX4YVNv-sS`yMmy*veu3Ki`QdW1Ka%@}i{^5inuZ3na zJ2bX-#M;`KCLR5QN9xPXvv+}7<5165d?-%%aTX zGS71P>C@G5{Nwnk$zSC|ZrNV5GFEZng`WnxCgNi{2>v(EHhTngU0GG(^w&VpAdXyi zJriermhN%JH}3Yj;H=W^w+8xV&b2jps-$pDyF|ljB(1vPh!5g=uYE|7=~}Ou6T}Pr zbsT(pxu&QnqB6eDaVsN_^|*J%7Mq+C@z<{JXzX{A5G{vB22Oq+&(}#L?FZwx5CtrZzWm9ed3c<${6N0z9qchthgj- zv6*%^cPF3Bs}IjFn4~>9IRAiciK~Xpc@)%BLN0 zJ5x?|r?ye)r7Hbl?MKSBPHoF+yT``9IT07=>|4Bti?20?p=P&h46otO?sd-S0 ZM_ZAN9cJqs=0XrXVJ8IU#ws}g{{YYO2Ydhk diff --git a/assets/skills/45.webp b/assets/skills/45.webp deleted file mode 100644 index d4bfbd7afbc73c2c46d81eefa1fedc20e6df2b5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3182 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 Zal@qQ?7G|vt9Tb`w`7gjv0g?7_!p^83UL4c diff --git a/assets/skills/47.webp b/assets/skills/47.webp deleted file mode 100644 index a146b30b5e00fed38281b4663081715dba860b1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3254 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 b&wJw~g5~e-{y@^~x@VI!(Sq}GvH<=8gb($l diff --git a/assets/skills/49.webp b/assets/skills/49.webp deleted file mode 100644 index 7b7bd1808afa7369f5ae791f44037287a7db3dd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1342 zcmWIYbaOLfWnc(*bqWXzu!!JdU|=u+VofmebaoC{zy#znFfGVQ&MjtfU|`72D=7+c zcT$Lmj8b5K&cMzf$iT~B!Jwa*TwLHA>=pu2jU9Zu#=r=YxvUE^3%eSeqP!`o#mNi| zj0!*%4#@>YB|vrpkZo38QUGGl0J24rGZIsP>@`5PP7%<7K=uugcoKyD2E#7;tDCubDp0@auR)u^Q8<^j!Tih!_FKg91YmLn%WhLk>d;gD#NH1Bw(g1OerpaOjr;>kk0xN&@Q2 zWJm_;aAC-2$Yn?b>t_JP0ZH*+$hK);pzc8}F@(NVECuV3K*YQ2#8Mnl%i zx1kqZF7!SB;;>VuHT|II>eVOj%S`$pG==T!M1HP6-(B=0%Y=^kNM8Nf^|gWF-~Z`< zEmK>69?XHYQb|KcTzV$OYa)iUh)`#gJ{SZB3g|Lu<5p95~1|2;8jp;5~u+hr%1*UP@y zw&KdAD<1ZLRyi9e*uC4tQ8LFNKdiZ2w%uF9$A9KucQ>7`r&rQucs%G_e6Nq;bHeI? z$}iKi?|E9*PZe(I)t}R^oj5b<=e3TrKF50I?N$(v`86#tzi)?I_r68P?aC_ka$Yr9 zv`+3x$=}>;G-3MyZv1t7N&Hkk zw%z43&n;W08Mk(Jr=9Wo`3DMYn=B8_m9Z*a7UN^Sy5N@nbb4d+MZ8fTVYZ0>T9ZZc@HE^f4|Ik+scW7r=*TluRQS5K&yknYlVCHQE#?&+o8z*{Fv$lj3Uy$RU+Vdf{yiWKlr&IXi2VDtEB zeU-ou%vNxsf_c&V(B70oQK1fp@9&3Z0=id#J9vUO(7+6sun+b?G>Bj=n)yf(0v*LE z3;0cxej0Kyk!ugIkYfwP01p^SKPb)s<)AU&TVaIldZmQXp#Z2qmCL0T02;Xf?@!3( z?~3K}_ay+Ty#P)8d4Eh1fa4_6Pt0qCLIAyFfS+6EHRfr6x)gxr-LVV-L-`$5^i+w6 z02nU=&k2g{hXK$*@-t}s~eLUeiIrvys`X!&vma$-5AN0+b*}}Bh8pc#o{dw! z((FDaH)Lkx*{VK+sOhZk3#L|ieytmRx-x#RZ(4%aIu(&y8C}-$Xeg?=F2$HW$e9}+ z)AEo?aoljHjvJ|(Q7tzJ@ds;Z!>jGL$=?#b?oq=GA2KStvgk+i)%8a#L^cLFE?059 zLKT-8Sf4T7^K_ZXUB*$D>inQh7#l13OkeQ+yqdw01ar>DOxI2S1Y&j5CRB67`gcmg z7m=+Gj$V>33eWjYT%UL-X}8RzZg^S2&GO@IC6VT2q9f;Mum(QRVrV3^QZifl8->(< z`cEIz#ua_nO^WuHHr{?wU09Kp&hX=v1HeCM-8XTOw2NMOcRxQuOc+B}8pW+o`E`%8e z+yf8o3A=A(kIT)6+Amsf-TR{Ch$ZuR!erZkv_dl}LnxCq%bpBmZhu&6XPipP)sr63 zE>l}v?48o#WqBrm|MF@~>+`i8SzNogFgZTGv#o+^`F`o*bTPvt@}BINtiVg!X4CKV z;(^OD*J+7P;^hOD78x`5^RbsP+%o2Fe-o>1roUXHzR78_1moNFCr2Y)XDGS%doC_v zM+$V>uoC&-nXCL)lJQN>v*`xToAIM>THU+$gM;`T?xn~PKc}0m=WMUG^Fl*8sqd9$ zRE=r1c!E1CG)!MtZhYs^*~5En>Ehq7cUr3uZL356NQeqf`l0GBUC@3!EVMvp+==8H QDoS}NiP>d-fKvqUFW40V(*OVf diff --git a/assets/skills/51.webp b/assets/skills/51.webp deleted file mode 100644 index 76fbddda0c88bcaa94b65236d19bacabb5225fbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmaKqdo-J89LIkN8jOQtXsZju(coxlB~ywpwT-sbTmu~G^^q@LwTGq~G zD~+vnJEL2%ZfC?;QI{H1TFOi}n@f+PZHmaA#Lo1O+H>CbeLnB^_xnEY^ZPw-h@ZDN zTMgjw`(!GON{Y|~fW7G6qrCh)J*nkb^a|K=Hj^VzbqC;Zh5Qg7GCm?Q3Xhux9O!{I zkieeK6r@l>y~7mQZyqlm07elRv{S70=A126?Rb`e34p<)40mPv;}O>)w&kM@A|6rbj18VsaH5ixMH%qJLOfAz21v&zzQ&B#n3=@qpq%|E$0DA? zMeAcDHaK3vXB5m~i_qSbLs6j?iyIz_W(#!h0w3@L3Qz$L3=lywut5lRXyzhC03j$& z-on2_>8BzW1G$oci5y0Z6!;eqK2M={eFbZE6-}06LifjqRHn<1>J!YyjhjDRe$v`5hJX#3m#F zEZzjrjs(!}2hfb(=o^YD;!rUR5Qcgc&47D<*i74VA5ZqhnPGZf-t!q8m&8`JJd14Gnfdbmpnj>A z#X?2q@uks$dPf&R0ny0q*-q?FWHZ{4$VrXIuK?ENLE&DOwRt$oiFb3NGix3Ncm?+i z)EeB*m9V4C<950}SatA^%rShzQ|r!f&NhA;Ts=q@FApq>@`H*ZyRO-XOLgx%O$Xi) z-JCT^rwrMq{W*8HSIpB?F(}RpJ|AX|HIkX$azD}3*O|~aHsR)y&^_j;Ut`OWclnUk zWcX;gji6c>E3@S#xk(EJ+%uvnlM(%Dd0RH&ucz^6vpyP4&BhdT-|aWQAltS~6z;Du znazl~;acmGmt|+?Nt3lX@k()w7q9aBS`V5X{n^-}wq2z6o-d?@E(H8|?AGWtUD5BB z+rH{}9(-Gx=zGs=L{+5KDxGpZ>a1wAWgF7ZV=vp{Y^lRNfeR+Kr+aqnA-#SBRB|ng GB=8U6Qo-B+ diff --git a/assets/skills/52.webp b/assets/skills/52.webp deleted file mode 100644 index 1eeb685363b1e04506f7cc0291aca2cfea95542d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 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 WCTmU}wejj&%I?9js`fy1Xa5D#B+lCa diff --git a/assets/skills/59.webp b/assets/skills/59.webp deleted file mode 100644 index b5d267e3d10e30bc5713c01cfef952cf6317e03a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3118 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 W=$5G%skvO7bT*$9wkRJ)g8u*!XWy^@ diff --git a/assets/skills/60.webp b/assets/skills/60.webp deleted file mode 100644 index 364283657a0f0ee84d8123e51961c886c72e816e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1440 zcmaKqe=yr;9LGONC@on@6-5csm|Tms4m&@lF`{j(SrPlZb7U#y%yy0`Z7nEGzIzh8=^wS{zR&l0eczwY`}sc4=Xux% zLPF$*0Fl9TRs_q3w*>$^Px!#?#p-N0hl=1;^WRwxe7fUh_$0GL1&JgQZ zj@W{q9G8H&5%F#bS|H-zbb9<6&+1s9XZ@xuBwTh7+M5N^$%3~y{w?MwON1!L6Xj46 zgd#LQp0~ycIzFLeVOl0yo4)CGXqqSr=b({-x*ag!0E7Vx$Pf>ikOFCt0ejFWLW&gF zC{EwNZ=?6KkSiX!Qh<*fA456_Ax`fH-5H=9)YfY&P1?6tFX2q-0ES~2wy+Dp=rVxj zB8IJ2W0@qJ^flRr+5 zM~rB??PXr3cg@B1>CL{Pp(AbKOB!)Cwe=LE*C{WJeYO?d7%lc_$wZYc^P4xF9B>-W zIiAA_rHmAJ5ZNNUOtxLsy6^GhmdWjI%K34R+rxaOxF(pG7qxZi4^ouXsYo@pV%NxN z^iLxxm{&`%*X8wpx4L#M?>yG)5<|+*{xh~aO3<_a>tgwG0#>VU2HRrk8Nxi@tzsf&MvjEE7W;<>%C!SY7bBNk5{YL2>bH1#aq+ zdza_9$(2P#Opq-X<5hS&yB9{o!2pZVWWSi@`vQ4`q)}1St{(l;T}x**FzQRp20nV~ z`&sh*aw_qe3Ut2%2_&kN^g z8vEL`n^O$;@hkb?{bZPPt5j)~`<`%QP|?voLT$TuedI=kazNhOg*i-~KSaaMkMm*3LOBm52Q0nA!Jf&o}KZVcxmw!RYX&N3NT0ueJzwG{#zQ zb~|m#hKjzmo+2jg1q`Qz>wH^t!R(+>xWOz+Ha zjuPy4)LpZ8AUWk5+!aIK4%%Fl0G_X_+p5D(Mqz u?}>?99@lFG&2nvq)nS^sUxPmPAFz>T1rFCxLDS0RI4>u-zU2 diff --git a/assets/skills/61.webp b/assets/skills/61.webp deleted file mode 100644 index 3617f06fbf8746be98dcf81baaf6dd89e9291ce3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1464 zcmaKqdr%Ws6vj^yVjwkXR4h?>L_r+Dj0lJstAK<@Q=(>&R}_If2#-kuP0%tRC5}W! zXvI=TK;BAK3J3#K3#A1IDT*U#Q7e>3#X(|<11JKTknK(E6#vlP+1>lw@0{=MJ?CyP zCm^7K2oUb?%M0VNBFF&Xif$*<#bL8~6?pUt_zI~=rZn>bkjYaN!GXSv2>t;EX#z;F z0w}$0|htI0nk_5hW{95XT_){4yok z$c2b4MezbL;#$O;6=;Kq9~pJwTb?v>oQX|ESt>$;*{C*4q%-2)Vc|P0idV=`jt9zd z5XkC6jFeRW;s%n z5RBr!AMmd=`FY4CM6Lu7A%`C%feZvDKN!yd<)E?DTcyO^%_QNL`vMS0Fzn?<0Md5= zi>EP6SBYVZ=K%;q03Grre^Lbi>lM;ZFKG_t03T-oT)nZR2@3$OWdqO$k_8HZ={p4U z#7iUqFD?O4_yDW!0+0{B?Hh_2<8a{*fDqIx?j3-la{!KUXzj=k)NPIo|Ml&EbN=n$ zZZ7Y$Rmg;+t)v;s!(yE_IChjwlk6PzI6!|jqZb`FjS8hWXJ>E*udSb)WS?KZe#LLV zAec3(_LfvsdowMz;n$^~bsBa0dS%<0bgZT`cx(%bITfiAfhuJu~# z1U)s>Z{x6EdSCynRaP*!_;Dha>IP+{I~osQTAx5xcgFq5GyT^HMI|Q{I)ePCT#F~1 z?yVWJ=WiaU#XU5u3D;<>a=cT|AI&(1qRRgkPse%_n-^_C7NPIgcdF-*_(6YidYGQ$`i&&djJJQg=n!?wP zZ1>)0yYT!^8iA8zb?O<1w64{Qfn_d}d#4%d_cs1aj>04p`r6d*g~u*pbGb@(ux@uk zy+Pl3Co&Y}&YvNynm5-Dk2_gyh%A*h98U`47yh`}uw#p^f>^B;JpKK6O_pnU zex9l^_S?%p*pBwzZHX?r-OHgQOfB#>4&t1dSXuOV*0aCpb;T~5a2iefulUs&XG?ru zE?hb4IeV{>w|Y^`mYn;it|+XF>N%?6eJ`xoAUx92 TKi;YI_Ze>dh?Tj$fC2vi{j}>z diff --git a/assets/skills/62.webp b/assets/skills/62.webp deleted file mode 100644 index 5f7366165d1db77c68c084b411cade0e1623f13b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1550 zcmaKsdr(q&6vq$ZB3V9(4XG4UF)c>3G^ciarsSqYD3&3sf}$2Ef@Nb)T3gv;@|~!W zuS(s)Y?mH3Iu@DOlt!67XIo2idTCpmMGwWhKWJy|kLow~-rwhb&-woD@0@$*vcp0{ z2?T(3AwjHYmhXCV0PsYooAC$>4rbMwpj$Ah6$!*L(*OW*TBelE45F=%*+4UU3T9vf z7T^mW2?CiUA~H0}kp1+3n+R4o#dWC8#j4P^ufB+^X8@rZr0G9?DC zKs-~Bl8}hF8Sz3X+92Y42A%(zM-7~8WMfe?rBUo)RNG9X(~`en{ueArk&02y5|rbd zC{9D`o2>uLi3ZLwuvoMi?aeq070yUX<3ys_8J%;031JWcET91&HbW|iAQKp9PD6?e z*eD+K4L{ZBXCW6Kxl%!Z94jCl#E@Y0gW(;Z95kkSD-$mEGD^4^K>$AtVAz-ofLSSk zz6is{>o81T4}gCFpiZ0er`H1bzC(J^l;&ImV6_Y2Y}b^=mjkrs15oZu5~K;n=it%R zL?{G!(+FS@134({N$=*RuR^^T4tg=rBD zZ>q{$U8%_1)fC8{rt2NkWK&Z+KaFBhoWyxK%4feSES8k|y;<-!OaD+3H+e86$f;u?`x-fBPj?9r{dBc~`H>9%QFW(<{)?{li+kBFty z1sS&hCb4=_U+G3mrzU&-EKaq@(G^X?Vm%grGghdvJT|2L5K=R&Sm`Ck6AD^=GOLEe z9UJIJkMFl%6z=a#lPs~Q=7#6B@E93?Mz{GCk;gE~1xm|k*aN0wji^d-sa#Mpn#1)A zAj<_lXXQj&*SFZjp1bDpZq@X#eo8$jq5mXdpy&O>dG#@ylTViqsIdpC3hmlrvkCqU zjc@2H8|`GQWkSKD>h584eK zF6-%BEw=3q)^8)MA{1tvA`EFBFS|n~7nk4b>T<8X_GWuzpV(sk4+T?pxYUpbT6PD>#*>|b|9Xm%#%Co`R1eC-R<=Mvni4_qCw7yvhhF zIsKS;iytx0T&Rz@(%o>7$1Zcware(54!%Dz61z;P89LOG+@L0Qc9nVCHa4?No8K(# zyKHmVvk|j(Y?{=w`xVnwkt=&j27h~jC(rO|0QCX$;nHGarZhT@N?|*IEyu6tCCaNu$R7#h?$oX*$yE17sTYF|7*YJb; E7eT8N{r~^~ diff --git a/assets/skills/63.webp b/assets/skills/63.webp deleted file mode 100644 index e5a84c1878e7db9ee660a91dd557853dd71ec2e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1344 zcmaKqc~DbV6vj_NY-Cd@6gyxc0){OVgp`TE6a)d0#gsKDP?7*46appzv{j(3Gt{*p zwV@h>(izr@kxg*etfE*7Bb$I_DN@W(F+?Zwd*3MS-ARn_BP5~}h@b=7 zKm%JQTae-(#rV-Ww0n8HUJL_DO_S?fHbWR8keMd|T_13ge}dPpa6-eA@n%#Pgv5<=kY~(lq$&dt0l^>L6fO62-=&c~m!CocdwA=xuq-^wD|N;0!epyW_)q+?DNr{+qv=gFGOfZPHkgtYcB}Y ztO-%Df?HpWGrGGw&aXY1$)2~L6L|VQcu;X*Mi`GW-p%-M`C0hw26u0!rs;)D2haaBmkZL?^ znZ~|(A=4t99hWJvrXaNkm(|=Ri4kjrBR3`r38o#}S1`<^Ng|P2=o&Rn-SWG6r!LGa zI(xSI+{wHMs!t7d#3+wgD(rSN)xB!UGrdaL^)I;SsF5J9;zO4)O1kSjDVp*(T3 ziRyQm)Tv)QFct6}@n(HUpLKlD=dyvz0oEUQ3qNbI@E>-pkRGeJ?GmY9ntm~zV*Oh& zv!U@FhAg9F?P#RJo#X4x37%=!Be#S31G?dm!6 HKLGv#QOvwP diff --git a/assets/skills/64.webp b/assets/skills/64.webp deleted file mode 100644 index ebfc7ba97fb9cd7acca6f0f6bab8cc09e15f5bf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1498 zcmaKqdo+}39LImdift2Va*!C7aoiG>o!Vv=KoT(WCJw_SA6?wpg+B1|}LGyBZ6XZ1(+Iq&;EpZELweV_OF{hrs$)!F%x z5`dqR1I3p@plt+zUFbHIU#?^_rAz_6f34p<&3_E5lhlltmV%tPstc))r z#xld{EW~w)EjVa{h=*i4<2_HvI84s+qOcsQ7a7%tMLI6*17>`{%y14H?+Zkuf_e9_>v&WEE}-iT3eEvk|&=!3A8w9VmbU2E;=IL;(*h(HxBwE_k81 z!#aK)xu1eu4CIOcCUQ7J46uPN_k-*VP!1Yvz2%1PwvkJiO%4D`FQrnkF@W+pfYm&y zbh%tAU9A96d=AhNz2=W810c*HJ#S4jDg{u>1ZeA8(-;>31g8MBhGXd*y8Jte=&2AI z3NTv@pz05>br4`>hoQ9t*Qr|t8UE|r|K|MLKYKUI z!L7)IQP)tHl=_C48sa;Ory@>6(LC-li_b? z;x-vd{LEY^A%*Men;+@0EkZvwHD-j+qnkTfAMopg_GttwieNp3F z>$~bXn%P;vt^8J`t4$Oh+}q?a9I-Uw^VFZKP2Fny<1DrpBvMfd4?po{r9V>ne05}@ zK)IgbQfs{@-4j!{%zrH)p2;y-oF@!jj#*k_Zm-=irNp1yotjZ8@#I-eoHR%>iFl0R zHvTrWdO@e1_1EPx@jJRkX3InqzuWlf7@6YIlhF3r?oM(dE4@BjG|t}N_lng2=d#7; zY6DyNhK^^g$>AkmtpsHocw`1FYiv1Q?vvHJy+%y0O!b=-B^G<7@*JMKc|&7#$_ z@~iG%FHEpGw?fcbIbdAl;$)h$xSC%+TCk5kCqDa>MAiL8A;z+Y68PnUfFL#F8{s+mMy~+_r_yQj-GF&F~v@=0&}iDka*tJ0kts+T&ih#p%I*K@$QG&k|gb$;Sw#SnuemjyjTpyv@k$r#{K6QTe9@;Z6R@S_?v-mX_DTQ zn(LusSESWg8{uN^J#n0t-KEkg@49Zck<^e)Z$^u>j2cdCxMGl8AKyGs`s|_Gcro@c zHimS=_5M=p!q@u#N9#(4D)GIy3Iu1qu=UFQ=5TJc55d@h8uV$E$F10&c0GIdDWa)v zv5lsusF6=h_DreBPPnIkhimcTYKq6(9ao)v-9!hh2}`4C&d&l90$WcXQByRZ)}y{Y G2LAwwRr)>v diff --git a/assets/skills/65.webp b/assets/skills/65.webp deleted file mode 100644 index ba2158fdcd45b574f90e8c0ab613eb192a12c1b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1514 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 R*zFcG&#G^xl`%NLe*mDv54`{Y diff --git a/assets/skills/merc_104.webp b/assets/skills/merc_104.webp deleted file mode 100644 index b61cde4fd397a4a522d840b946d35b02b7b6919c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4678 zcmeHKjZ+lo8GnI9gSn_Fm@=a6x`1NM-tFyuaJ%)Cj}u|!;(0(IO=8*G-GhbO+jDo} z4o#Y1j6mu{O*0{&M*N60eo$#f448~sow3nKOgb?nP#ko`VpC&OYCD8p-(3zc9c}-B z^3L7uv(Ni`e(&@A-sj!9b?0VhFZmGwMawc>PrGcz(*OX;@EfOna;e^i|MB;W5DCYhFqP~6my`tAPRwqbS5Av&@O?tHK+ts`)z2)Gi5Xj?Ss&MQi2IWyIb{pM(uA@yHvBaqT;0j zcNVNI9{Q2edu-1=Hd7`E5MzdzWLEG){^;USn^o->R9o;>!rZi>R;c6rh57KR3ONTX z2f4rrTmS(cPziY80}8<4)ek)~aKrh`2gJ|T;$1Mx1EYArzz7ErfdFVN9;kZ&F>p+1 zD|=0Z=8Do~0`PEOID9(=fT_O$U}Q@;JiIF$9@z~*OfLW@{1fqFGXSYn1puZ!JE|L;Q|G~+F99fk zTIHPwps@*n`K6Hixd+t!2n-n4?Z09o`oYf4tASf;h&%BRxOT+~dfKDXa|Smf}vfkvNiyuR=jmYG_YJMosJR%e!XP>69(H6;Y{!hxqOj znQxY?(iJDS{%~RAR$u1eP5Gr4uD)~e+>UDJMW&kd;50hYAoH2?Ba6j(5~#j+!N#h-{$eQ1ARM&m23zkQ=^ zWBNd+&vG~*4XyiS$uXHsN;q|dm|fgvS~@bkFq_YK>J#V3JyWQ!s(#wvGCkJv$NJWb zmp_MPM_u5@ z3l2UvrFVKqhdm)?Q_1>Qel=s?sn4E>1;tJmazh8e;-#Sg%~Ws-;^9hpza9Pd*l`r$ zSvy)}apKNE7FWjStd+R@wNDi=YbzL%MVBr?7Kf;i5D++pMnZzmFH<2qO0%MeqoA$2 z4Je{PlnOhlE|n!p9Aeg+^*FXH#8(k0LWiSMTL4DAq7o}2z zkt9h2P8bLRg9uEn_A7J<^UFzN3=a6XmH2?di+)69q&;G#Vn^ZnqlpOtr*oXxFYC25 z^^7POLUh1j)Z+$0P_xz0va+lS21nAkFIq0B4sZrHCySL5!!4`g{7TYT`0`w*Ydl&l zqLdc`S{YES@kLl>922ONeA+zA7&sp%Kr$KTWE{sTymvyDALOIXXz7nF4wo3`{Q+{U zP8A5npd2Dosjigku%l{%6e}`3OO2W)#%%GJjTlbYY?zr&!!eRh^I~Zxqt|FLc}Oqo z8RNv>3GHJUhvT75M*CVB*z=^TU5RLHOeGZ}!Md A<^TWy diff --git a/assets/skills/merc_99.webp b/assets/skills/merc_99.webp deleted file mode 100644 index d34fedaa948913e4142891e01ff0eefd59915b0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1582 zcmaJ5IN-NQ%>j zaw?j9RI662v4`Yq;)qaVY&cVGQYn&;X75aU(jT?I_r33Z?sK2#-uwH#mrfy*i3R{6 zYkg@OY3@uT0KlPUrhO@^SJU!!(GYa=c^tlYhBp9T5G$hl`Qn(Nn{b$?fI*KA%mhm| zM=T5oA~Q7VugB;^q(t$+L9^D^HQ!`SBDab;06I9N@a70bu?UAFyfQvksKI9t#&Wi? zBN3J&Y%f9wM7T@CM|{GA8XTp?+N7`|27NWk4U2eO)E7A73(VOj;v>y+q#;D|1!#R; z<|iDf!Min>&x=E6(}pHPD&1o4t-j*tgndJv$ZcAASg4RA9Rz`R??7O}Pa=%KGJmkTg_ z3BV*2U7S_`Bi5(7p*hVwT<8Q~pjuJo06Dn;#3;0O*f;VvM263G`(Mp}^+Pw88jkjH zGOL~eCQEpa4emCY+l*W5TmOzbPsH2d_3D$UkBH4OMY(ttc1334je{djycN|hy+Q29 z6($~P(k;7jYg*ZsYDmB7v-~RBda~xrFyWVJ7TWo;wNv^!Rm9V)n@X)EMJZ12?%ShwpNO(%hO8+b}~B& zyFLiAjp_@?c*S8AIBghy;)<`yJTJ|>P)SN^ARk@XnSK4Fxb%)H?86%dZZ}?sd~E#- z=WL-rJ%N;ZyOcz-I%bTjx`$~aCk``~@nz>6Hmle+&GEZT z=V7m7WKZS~xO$HI2lTfV%vEi_mY&+iT2V%N_{#A(fhAX5jcDA_jw`O+x)V}=HMALnI@MVg3No!w&TZrf2LVLe_SxxMsu;a5-Euks1<66!-n})-0 zAxW2$?DNWfUmr1e*6W>o)wD*Oe{Yea)3ZG{#+nF8Dv?K&y?F{Nv)yo z;25i{N3{aJowBekp{p+@c3o*lpab^y^NGv2K>c^Ldb^J{Q}g4?_SI$O3C!a6*M^Hn)kT>$X(1j9nLcDz?zqmq zxOhIzxyIIC>2>FjsSDHY=s$^)nD{Ha6CJFyo=bkVNB3ji2QKJqbMHD>`{Vne1kR+} zqX#{m%U#c|SG?TX9~Ow8cz(ZW|LhX-%FsxgrAL-^7rhw&Ss|UXNXo?zzHD-A9T;}C z`*Zk`>941K?7wpxAkWe(sybB^n8ix>txXA|NMvqR)U}T8Sj+*#7>iE z=~-$_M~e+(WISba_^(MFIQ^u~a6a diff --git a/assets/ui/config_gear.webp b/assets/ui/config_gear.webp deleted file mode 100644 index 2d833664319b0fdb5b16b910b9dba76cbf5f2cf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1960 zcmaKqc~}$Y7RFBkG=QOmrGiRnf=NqQQxQa{CMG08Kn#n>W+e-231Zl^jY8O=v_eJM zv;tzIEP_BlE?C6{t_X+=R*UQfD+nqINC9&vc%N(ksP{b2H{WmGbKY;}oEdi~7ONNo zu$xKecyVmK)d2vHtTh0708R`Brx=ag0=hVyFN{*A0SF_aMef__cyAwHJmv|gfhH({ z2~fEFsK^~2EKf!CKgZkyKq)f!%oS(-bIk`;4MAWO9{`0%Dro#jQ8dB<2;0O(M=CfU zVO@R*SAcLO!e%1m1rdIz(0T9pnSz5?c%>;_k*7NY=}i~W@xgy%-rtxXA`&7s8<85K zKp26XkM@4Y0tJf|EDVo9-fblm9by9`c6lH>5m^SX9h_hXaFDU`AO=Dq9HPM-*&`4o z3fz%A{R95BD}D~*;vue3;3EzP*at%3uJ}Rm4Uifn-p@8F$ZErigu>DRR0iboS0n(; zQGn%axqPuiE?+JMP*NCS8G?M`uuD{oKc>s-R0Q!$2xgze$ zbCi%PIw%NWMhc+e1EA9bpzil>Zb(j%htt0Scp|fM=>jMy1o%7{IotmOeXAmd|IO|H z*8F#V$e-)-yE1^~nky=xK}jc)UAtb?z1f7#NKJpclXm#3jHA=O3$+Dq(g;MSZk%{d z`dvbcEQXlX=jiUa(0;MAC2ro~f{^IsX5W4yUKG6LbbOE8n6?nAIYkK1&|!0Pd~|ay zN(7iE$(Vh(Fi|{RccQc^C9g)QrpN!5_|o11>TD*3l>CRC@y}?NqNfD%;D&41o*bc{ ztiSTo?WQBA@(T*0f`T$XA@fvwQQ?x#XPsV}hl7w1M^A70uDaHb(AXgCjd`$jx7i^p zD?X~TiZb5)IMGiufzE&Ab^UJIeE0G7PCu>Rtkruj>O|e9$CC7(7w%$}>V(dww#~84 zR-(z5(u0R`=qCr)s@ARcV{6bd^=IEud5tAMtczQW*?%W=xx7|7Ysj}R*JORKRFP*O zG@`!s@qbMn=wRtpc<1L+qTK>=KH?K3D7*(GnRR(3(3tUqPu3*u9BUg$9-i(j2~%#i zq1iAqfBd2_oOwm4O zDX1$b_OYk8f23gzu>Ks2f9)^1zv=R?-M01J&!y(d?W-p%sFu9O@z}gL>ALQ;M8{Pf z#{2{H%49-d_AWd5NNa|@@#}M|L)SyV`S^Z^*r87sW{N)3$6s$vzhP#YIo@_hO*ODk zY#$pZ)KGR&`__%xw&b_*oQ1U(Q-vaC9bTBYaMp-!u#q+Wnn~DdAe$K;7`dbR zV2m=erDa;XvU%;Tet)NEWn9^|*rtThvWDKS#p65dQMuVa`w%^KP=Nco@<%zR%Sg}l z@*dG>!ERhSN>`n^hh9-$*+*@dI{HiPfdc(529xBVm${*3!H{`=VrlFA$j!a?_^48b ztA{yB?b$j+2>_~mqH2(S(qkm7U zX3A^`NOGAb@mzMl5oP1+%p}wi<+_M%qr7P#TzAoVEAfE+Um0Y%in%H zeDrK!&7cYC&45i??Cp=O^Tr6T2KN@ZyQ6F+kpgVyODSkxs?OS5nwc?7psb{Q-Vf3tAXJZyCkyvOv J(%cb``VaaL%+3G+ diff --git a/assets/ui/discovered_wp.webp b/assets/ui/discovered_wp.webp deleted file mode 100644 index 552e9205e9e6d970b1128feb7d177f954898679c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1954 zcmaKqdpwkB8^9I{HzG+H?a@a%_+s z6Ec;C?2iigz+@>WOPLyb1UcL4kXEP~LG$xLRug0zz+Uix1As?*6b45i8e$;0paU6+3 zTK$eJ@)B*w43jx*yf9M+$lg8m+j{tm;UU~fiP+S6F8j0-v^(X39LJa@w z+yBk^Z~u@#*Q-YkV5@nmJj|cuqz+4HchWM7pw1TGKn=cr@sVTU(12QEV&dECoYBKg z-p(ULRHP0iU4X(pXjgbe%WP8;VNN`{O0~bUYkYCjuBRQHjgMFM*UP9tM~;aFVV13y!Z;b`g=1rOb` z^Y$m%T=kysTe6(jx4w_)?php+DLLxwVnB%}CzRX$>Eu}y^de%u-6KGz-byBP@`OcJ zd8E*xs>nEVb3RdMG=@9-a~u7_AHVNPACY%2x)$TsB1DU24m0Y+byWX~7`N@oRsTU1 zACIprww8}O6_|?_p|$O} z&bWzb)G+4AYt~K_hT>D6McURq{-MAA-Lj(OebU)+w~%MzA;n6Ho5A+@DOO6_=(ueeRn0!vjIxlFhNk z`HT$Rfp_=lRjj$@aS=6pG?G2aqUq8P)C`4gN?u5wj9r>Rhj?Wk=4+#H`cCUEayckM zWiM+jhUDEV*Z8g7`FI-PS<}g+-sWK=>S5!tbMr3FvF5dbUfPaRW5fUMl)J6`QYSdI zVRrhto*AzE)(VlMB5N4-gJ3Lw^0@oHqNt%m(aVZ?bBc@gda?uks_k7n*6~El@iUpd z!oY&jFOo>pPY)`JE@3mCcg^s5QJY9-J`+Wa67pXSDNNtSRO8gg`erN+&Gj#d#zyCe3Nwf~}Qu^Bdceht<1vJomIsG>GrTBtCaAK3#k5 z_=>5>rsFraz^EU`0=ailtSW&m~nATiGMTOi|oO&aDVcL|y8**5~w@iR$3D z9+eBX%|mj7f9KY09qejnE=I1!={soDmGud@ywW)$hFr9E@;>X>y7SpsGrO7VJGz3; zTX_B0Ztlq~D)fqI8Tj*|QNd1@C;JpG*d&J(_qkbeXx0R8U*SM)O4n@g>?S2cUxPIJ z^ai^@tbBKxOY2I1(vt6MYgc#d4IbglHrC}|JX3;V)u$-{=4U diff --git a/assets/ui/undiscovered_wp.webp b/assets/ui/undiscovered_wp.webp deleted file mode 100644 index e4c8a897f3d40cafaf42236e85c5cf8c71bebecc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 972 zcmaKqZ%9*77{;H?Oecz9`(Pn8YW6|=gK4JyL7Alvri?kwxvaK3r^YttHj{K1K|}gd zW`7)M2Rp%2 zF=k_aVUC3yQ*LGej(`+djL~EvK1-ZdXECzePRwU2RT|=6 z;&>Aska&j8t2cOs&n?+t4a-)R z^}1R*n?KkJ!^;gtg)|Fk#2^=9krRihSF(7}QPnhlgOLq_YOE&RLuekr-s^~q4MWDB4ZOQ?EiW4pZg6Dm{pRqv54Zz#%^R3_Y`MmdlpgCaJ5b#%b z1LY~EOu5lFT4UGI z^AV6!uO#C@$1Pxg1?_!mi@HO}@V9UO)%@un-CT*6Oi6qM!{*Fu;fsfwMr=JDZ^vTl zwT<2f%GkYYnH=$b(UjZTsk!ZF8MYdxZC1zmiQq#^AAZ%ZyS%P%>$ASLf_6uun`ufP z>6%aN|9WT1<4V|mb@7>9Vy}B2)uI?JJ@$0qai{R~bZlZ@*}0*)nHpWn&Af|GYHOkx zW$4)CtXM5n@s2Qc&g53PD6S#H)1clL-}B;8t4l6kaf%M+_e<)0{5Mx3+(*Z`hdsi+ z NUL || goto :error echo Building Koolo binary... -set PATH=%PATH%;C:\Program Files (x86)\CMake\bin;C:\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin;C:\opencv\build\install\x64\mingw\bin go build -trimpath -tags static --ldflags -extldflags="-static" -o build/koolo.exe ./cmd/koolo/main.go > NUL || goto :error echo Copying assets... @@ -13,7 +12,6 @@ mkdir build\config > NUL || goto :error copy config\config.yaml.dist build\config\config.yaml > NUL || goto :error xcopy /q /E /I /y config\pickit build\config\pickit > NUL || goto :error xcopy /q /E /I /y config\pickit_leveling build\config\pickit_leveling > NUL || goto :error -xcopy /q /E /I /y assets build\assets > NUL || goto :error xcopy /q /y koolo-map.exe build > NUL || goto :error xcopy /q /y README.md build > NUL || goto :error diff --git a/cmd/koolo/main.go b/cmd/koolo/main.go index d5ffb8929..14f9412b6 100644 --- a/cmd/koolo/main.go +++ b/cmd/koolo/main.go @@ -2,17 +2,7 @@ package main import ( "context" - "golang.org/x/sync/errgroup" - "log" - "os" - "os/signal" - "syscall" - "github.com/hectorgimenez/d2go/pkg/memory" - "github.com/hectorgimenez/koolo/internal/run" - "github.com/hectorgimenez/koolo/internal/ui" - hook "github.com/robotn/gohook" - zapLogger "github.com/hectorgimenez/koolo/cmd/koolo/log" koolo "github.com/hectorgimenez/koolo/internal" "github.com/hectorgimenez/koolo/internal/action" @@ -21,11 +11,19 @@ import ( "github.com/hectorgimenez/koolo/internal/event" "github.com/hectorgimenez/koolo/internal/health" "github.com/hectorgimenez/koolo/internal/helper" + "github.com/hectorgimenez/koolo/internal/helper/winproc" + asm "github.com/hectorgimenez/koolo/internal/memory" "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/remote/discord" "github.com/hectorgimenez/koolo/internal/remote/telegram" + "github.com/hectorgimenez/koolo/internal/run" "github.com/hectorgimenez/koolo/internal/town" "go.uber.org/zap" + "golang.org/x/sync/errgroup" + "log" + "os" + "os/signal" + "syscall" ) func main() { @@ -56,18 +54,21 @@ func main() { if err != nil { logger.Fatal("Error finding D2R.exe process", zap.Error(err)) } + err = asm.ASMInjectorInit(uint32(process.GetPID())) + if err != nil { + logger.Fatal("Error initializing ASMInjector", zap.Error(err)) + } + defer asm.ASMInjectorUnload() + + // Prevent screen from turning off + winproc.SetThreadExecutionState.Call(winproc.EXECUTION_STATE_ES_DISPLAY_REQUIRED | winproc.EXECUTION_STATE_ES_CONTINUOUS) gr := &reader.GameReader{ GameReader: memory.NewGameReader(process), } - tf, err := ui.NewTemplateFinder(logger, "assets") - if err != nil { - logger.Fatal("Error creating template finder", zap.Error(err)) - } - bm := health.NewBeltManager(logger) - gm := helper.NewGameManager(gr, tf) + gm := helper.NewGameManager(gr) hm := health.NewHealthManager(logger, bm, gm) sm := town.NewShopManager(logger, bm) char, err := character.BuildCharacter(logger) @@ -75,7 +76,7 @@ func main() { logger.Fatal("Error creating character", zap.Error(err)) } - ab := action.NewBuilder(logger, sm, bm, gr, char, tf) + ab := action.NewBuilder(logger, sm, bm, gr, char) bot := koolo.NewBot(logger, hm, ab, gr) var supervisor koolo.Supervisor @@ -123,25 +124,8 @@ func main() { return eventListener.Listen(ctx) }) - registerKeyboardHooks(supervisor) - err = g.Wait() if err != nil { logger.Fatal("Error running Koolo", zap.Error(err)) } } - -func registerKeyboardHooks(s koolo.Supervisor) { - // TogglePause Hook - hook.Register(hook.KeyDown, []string{"."}, func(e hook.Event) { - s.Stop() - }) - - // TogglePause Hook - hook.Register(hook.KeyDown, []string{","}, func(e hook.Event) { - s.TogglePause() - }) - - evt := hook.Start() - <-hook.Process(evt) -} diff --git a/cmd/memory/main.go b/cmd/memory/main.go index 270eea581..fe16d30f2 100644 --- a/cmd/memory/main.go +++ b/cmd/memory/main.go @@ -2,37 +2,44 @@ package main import ( "fmt" + "github.com/hectorgimenez/koolo/internal/helper" + memory2 "github.com/hectorgimenez/koolo/internal/memory" "log" + "syscall" "time" - "github.com/go-vgo/robotgo" "github.com/hectorgimenez/d2go/pkg/memory" + "github.com/hectorgimenez/koolo/internal/config" - "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/reader" - "github.com/hectorgimenez/koolo/internal/ui" "github.com/lxn/win" - "go.uber.org/zap" ) func main() { - window := robotgo.FindWindow("Diablo II: Resurrected") + ptr, err := syscall.UTF16PtrFromString("Diablo II: Resurrected") + if err != nil { + panic(err) + } + window := win.FindWindow(nil, ptr) if window == win.HWND_TOP { panic("Diablo II: Resurrected window not found") } - win.SetForegroundWindow(window) + memory2.HWND = window - // Exclude border offsets - // TODO: Improve this, maybe getting window content coordinates? pos := win.WINDOWPLACEMENT{} + point := win.POINT{} + win.ClientToScreen(window, &point) win.GetWindowPlacement(window, &pos) - hid.WindowLeftX = int(pos.RcNormalPosition.Left) + 8 - hid.WindowTopY = int(pos.RcNormalPosition.Top) + 31 - hid.GameAreaSizeX = int(pos.RcNormalPosition.Right) - hid.WindowLeftX - 10 - hid.GameAreaSizeY = int(pos.RcNormalPosition.Bottom) - hid.WindowTopY - 10 - err := config.Load() + hid.WindowLeftX = int(point.X) + hid.WindowTopY = int(point.Y) + hid.GameAreaSizeX = int(pos.RcNormalPosition.Right) - hid.WindowLeftX - 9 + hid.GameAreaSizeY = int(pos.RcNormalPosition.Bottom) - hid.WindowTopY - 9 + + helper.Screenshot() + + err = config.Load() config.Config.Debug.RenderMap = true if err != nil { log.Fatalf("Error loading configuration: %s", err.Error()) @@ -49,8 +56,6 @@ func main() { start := time.Now() gr.GetData(true) - logger, _ := zap.NewDevelopment() - tf, err := ui.NewTemplateFinder(logger, "assets") if err != nil { panic(err) } @@ -58,28 +63,6 @@ func main() { for true { d := gr.GetData(false) - tf.Find("59", helper.Screenshot()) - //screenshot := helper.Screenshot() - //matScreen, _ := gocv.ImageToMatRGB(screenshot) - // - //skillMat := gocv.IMRead("assets/skills/blizzard.png", gocv.IMReadUnchanged) - // - //rgb := skillMat.Clone() - //gocv.CvtColor(skillMat, &rgb, gocv.ColorBGRAToBGR) - // - //res := gocv.NewMat() - //gocv.MatchTemplate(matScreen, rgb, &res, gocv.TmCcoeffNormed, gocv.NewMat()) - // - //_, maxVal, _, maxPos := gocv.MinMaxLoc(res) - - //rs := gcv.FindAllImg(img1, skill, 0.4) - - //fmt.Println(res, maxVal, maxPos) - //f, _ := os.Create("data.bin") - //enc := gob.NewEncoder(f) - //err := enc.Encode(&d) - //fmt.Println(err) - //f.Close() d.Roster.FindByName("Ayuso") fmt.Println(d.PlayerUnit.HPPercent()) time.Sleep(time.Millisecond * 500) diff --git a/cmd/pickup/main.go b/cmd/pickup/main.go index 9b4070ca8..48083f3fb 100644 --- a/cmd/pickup/main.go +++ b/cmd/pickup/main.go @@ -2,8 +2,8 @@ package main import ( "log" + "syscall" - "github.com/go-vgo/robotgo" "github.com/hectorgimenez/d2go/pkg/memory" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/character" @@ -13,7 +13,6 @@ import ( "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/town" - "github.com/hectorgimenez/koolo/internal/ui" "github.com/lxn/win" "go.uber.org/zap" ) @@ -26,11 +25,11 @@ func main() { logger, _ := zap.NewDevelopment() - window := robotgo.FindWindow("Diablo II: Resurrected") - if window == win.HWND_TOP { - panic(err) + ptr, err := syscall.UTF16PtrFromString("Diablo II: Resurrected") + if err != nil { + log.Fatalf(err.Error()) } - win.SetForegroundWindow(window) + window := win.FindWindow(nil, ptr) pos := win.WINDOWPLACEMENT{} point := win.POINT{} @@ -56,12 +55,8 @@ func main() { if err != nil { panic(err) } - tf, err := ui.NewTemplateFinder(logger, "assets") - if err != nil { - panic(err) - } - b := action.NewBuilder(logger, sm, bm, gr, char, tf) + b := action.NewBuilder(logger, sm, bm, gr, char) a := b.ItemPickup(true, -1) gr.GetData(true) diff --git a/go.mod b/go.mod index 289d3d596..3a01fbb1d 100644 --- a/go.mod +++ b/go.mod @@ -6,40 +6,18 @@ require ( github.com/beefsack/go-astar v0.0.0-20200827232313-4ecf9e304482 github.com/bwmarrin/discordgo v0.27.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 - github.com/go-vgo/robotgo v0.110.0 - github.com/hectorgimenez/d2go v0.0.0-20240119130048-f06c587c7a10 + github.com/hectorgimenez/d2go v0.0.0-20240202111944-db8fc7d6db77 github.com/lxn/win v0.0.0-20210218163916-a377121e959e - github.com/robotn/gohook v0.41.0 + github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9 go.uber.org/zap v1.26.0 - gocv.io/x/gocv v0.35.0 golang.org/x/sync v0.6.0 golang.org/x/sys v0.16.0 gopkg.in/yaml.v3 v3.0.1 ) require ( - github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7 // indirect - github.com/go-ole/go-ole v1.3.0 // indirect github.com/gorilla/websocket v1.5.1 // indirect - github.com/jezek/xgb v1.1.0 // indirect - github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237 // indirect - github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a // indirect - github.com/otiai10/gosseract v2.2.1+incompatible // indirect - github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect - github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 // indirect - github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770 // indirect - github.com/shirou/gopsutil/v3 v3.23.12 // indirect - github.com/shoenig/go-m1cpu v0.1.6 // indirect - github.com/tklauser/go-sysconf v0.3.12 // indirect - github.com/tklauser/numcpus v0.6.1 // indirect - github.com/vcaesar/gops v0.30.2 // indirect - github.com/vcaesar/imgo v0.40.0 // indirect - github.com/vcaesar/keycode v0.10.1 // indirect - github.com/vcaesar/tt v0.20.0 // indirect - github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9 // indirect - github.com/yusufpapurcu/wmi v1.2.3 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.18.0 // indirect - golang.org/x/image v0.15.0 // indirect - golang.org/x/net v0.18.0 // indirect + golang.org/x/net v0.20.0 // indirect ) diff --git a/go.sum b/go.sum index 4f76baf85..b11f8aeba 100644 --- a/go.sum +++ b/go.sum @@ -1,119 +1,46 @@ -github.com/BurntSushi/freetype-go v0.0.0-20160129220410-b763ddbfe298/go.mod h1:D+QujdIlUNfa0igpNMk6UIvlb6C252URs4yupRUV4lQ= -github.com/BurntSushi/graphics-go v0.0.0-20160129215708-b43f31a4a966/go.mod h1:Mid70uvE93zn9wgF92A/r5ixgnvX8Lh68fxp9KQBaI0= github.com/beefsack/go-astar v0.0.0-20200827232313-4ecf9e304482 h1:p4g4uok3+r6Tg6fxXEQUAcMAX/WdK6WhkQW9s0jaT7k= github.com/beefsack/go-astar v0.0.0-20200827232313-4ecf9e304482/go.mod h1:Cu3t5VeqE8kXjUBeNXWQprfuaP5UCIc5ggGjgMx9KFc= github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY= github.com/bwmarrin/discordgo v0.27.1/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7 h1:VLEKvjGJYAMCXw0/32r9io61tEXnMWDRxMk+peyRVFc= -github.com/gen2brain/shm v0.0.0-20230802011745-f2460f5984f7/go.mod h1:uF6rMu/1nvu+5DpiRLwusA6xB8zlkNoGzKn8lmYONUo= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= -github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGiUaOtXxdrINDz1b0J1w0SzqDc= github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= -github.com/go-vgo/robotgo v0.110.0 h1:655fmWO4yD5dn/y70Z50wdxnqg2LvmRD+MZ1iOXuGI0= -github.com/go-vgo/robotgo v0.110.0/go.mod h1:DdJUdi6mEU8ttHMbow6hKD1TjgsfgJC/H+4dusok8Uw= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/hectorgimenez/d2go v0.0.0-20240119130048-f06c587c7a10 h1:D5P2UEd1bZtuDuduevQ/1dP6ZJsMiHZjAjdmEE3MXMQ= -github.com/hectorgimenez/d2go v0.0.0-20240119130048-f06c587c7a10/go.mod h1:HANIsWVCTQeNdEC6whvHegpOlRckU2TPqXr+nEXvoc8= -github.com/hybridgroup/mjpeg v0.0.0-20140228234708-4680f319790e/go.mod h1:eagM805MRKrioHYuU7iKLUyFPVKqVV6um5DAvCkUtXs= -github.com/jezek/xgb v1.1.0 h1:wnpxJzP1+rkbGclEkmwpVFQWpuE2PUGNUzP8SbfFobk= -github.com/jezek/xgb v1.1.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= -github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237 h1:YOp8St+CM/AQ9Vp4XYm4272E77MptJDHkwypQHIRl9Q= -github.com/kbinani/screenshot v0.0.0-20230812210009-b87d31814237/go.mod h1:e7qQlOY68wOz4b82D7n+DdaptZAi+SHW0+yKiWZzEYE= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a h1:N9zuLhTvBSRt0gWSiJswwQ2HqDmtX/ZCDJURnKUt1Ik= -github.com/lufia/plan9stats v0.0.0-20230326075908-cb1d2100619a/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= +github.com/hectorgimenez/d2go v0.0.0-20240202111944-db8fc7d6db77 h1:HZBioMz0Ez5oeNnXcOPJ2/o1UMqqhqEQZC1XLR7kMjk= +github.com/hectorgimenez/d2go v0.0.0-20240202111944-db8fc7d6db77/go.mod h1:QXuKJYL7/gh0dnwHu/f8bqEWDAOy1QP51RV1I0mjUKM= github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc= github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= -github.com/otiai10/gosseract v2.2.1+incompatible h1:Ry5ltVdpdp4LAa2bMjsSJH34XHVOV7XMi41HtzL8X2I= -github.com/otiai10/gosseract v2.2.1+incompatible/go.mod h1:XrzWItCzCpFRZ35n3YtVTgq5bLAhFIkascoRo8G32QE= -github.com/otiai10/mint v1.3.0 h1:Ady6MKVezQwHBkGzLFbrsywyp09Ah7rkmfjV3Bcr5uc= -github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig= -github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/robotn/gohook v0.41.0 h1:h1vK3w/UQpq0YkIiGnxm9Awv85W54esL0/NUYGueggo= -github.com/robotn/gohook v0.41.0/go.mod h1:FedpuAkVqzM5t67L5fcf3hSSCUDO9cM5YkWCw1U+nuc= -github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934 h1:2lhSR8N3T6I30q096DT7/5AKEIcf1vvnnWAmS0wfnNY= -github.com/robotn/xgb v0.0.0-20190912153532-2cb92d044934/go.mod h1:SxQhJskUJ4rleVU44YvnrdvxQr0tKy5SRSigBrCgyyQ= -github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770 h1:2uX8QRLkkxn2EpAQ6I3KhA79BkdRZfvugJUzJadiJwk= -github.com/robotn/xgbutil v0.0.0-20190912154524-c861d6f87770/go.mod h1:svkDXUDQjUiWzLrA0OZgHc4lbOts3C+uRfP6/yjwYnU= -github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4= -github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM= -github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= -github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= -github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= -github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= -github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= -github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/vcaesar/gops v0.30.2 h1:fANyUGCjLkfcYmJRVnXv+QZhT8cL2e0GWpRFZe58p/4= -github.com/vcaesar/gops v0.30.2/go.mod h1:2NSA2Q9M1irGnGD9tWdo0Z+MwKjUj4Q4EgUDukN/Vsk= -github.com/vcaesar/imgo v0.40.0 h1:okI1eonRAfGLzjqgTIBkUwhm4j/rH19qGno4eFOBQsc= -github.com/vcaesar/imgo v0.40.0/go.mod h1:E5uI53XkEfbI20VvcIZ/19G2hHidPfH9h4NtQooEY+8= -github.com/vcaesar/keycode v0.10.1 h1:0DesGmMAPWpYTCYddOFiCMKCDKgNnwiQa2QXindVUHw= -github.com/vcaesar/keycode v0.10.1/go.mod h1:JNlY7xbKsh+LAGfY2j4M3znVrGEm5W1R8s/Uv6BJcfQ= -github.com/vcaesar/tt v0.20.0 h1:9t2Ycb9RNHcP0WgQgIaRKJBB+FrRdejuaL6uWIHuoBA= -github.com/vcaesar/tt v0.20.0/go.mod h1:GHPxQYhn+7OgKakRusH7KJ0M5MhywoeLb8Fcffs/Gtg= github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9 h1:U8aCPFEMnxAEyj9IonhMVV1gSL4nzelh8uvoXp0hrq0= github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9/go.mod h1:N51TYkG9JGR5sytj0EoPl31Xg2kuB507lxEmrwSNvfQ= -github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= -gocv.io/x/gocv v0.35.0 h1:Qaxb5KdVyy8Spl4S4K0SMZ6CVmKtbfoSGQAxRD3FZlw= -gocv.io/x/gocv v0.35.0/go.mod h1:oc6FvfYqfBp99p+yOEzs9tbYF9gOrAQSeL/dyIPefJU= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= -golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/action/action_builder.go b/internal/action/action_builder.go index 24e85274b..f7e3981c2 100644 --- a/internal/action/action_builder.go +++ b/internal/action/action_builder.go @@ -4,7 +4,6 @@ import ( "github.com/hectorgimenez/koolo/internal/health" "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/town" - "github.com/hectorgimenez/koolo/internal/ui" "go.uber.org/zap" ) @@ -14,16 +13,14 @@ type Builder struct { bm health.BeltManager gr *reader.GameReader ch Character - tf *ui.TemplateFinder } -func NewBuilder(logger *zap.Logger, sm town.ShopManager, bm health.BeltManager, gr *reader.GameReader, ch Character, tf *ui.TemplateFinder) *Builder { +func NewBuilder(logger *zap.Logger, sm town.ShopManager, bm health.BeltManager, gr *reader.GameReader, ch Character) *Builder { return &Builder{ logger: logger, sm: sm, bm: bm, gr: gr, ch: ch, - tf: tf, } } diff --git a/internal/action/buff.go b/internal/action/buff.go index f7e5e7d2b..2cb6118aa 100644 --- a/internal/action/buff.go +++ b/internal/action/buff.go @@ -32,7 +32,7 @@ func (b *Builder) Buff() *StepChainAction { steps = append(steps, b.buffCTA(d)...) - keys := []string{} + keys := make([]string, 0) for buff, kb := range b.ch.BuffSkills() { if _, found := d.PlayerUnit.Skills[buff]; !found { return nil @@ -52,7 +52,7 @@ func (b *Builder) Buff() *StepChainAction { helper.Sleep(200) hid.PressKey(kb) helper.Sleep(300) - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, 300, 300) helper.Sleep(300) } return nil @@ -107,11 +107,11 @@ func (b *Builder) buffCTA(d data.Data) (steps []step.Step) { step.SyncStep(func(d data.Data) error { hid.PressKey(config.Config.Bindings.CTABattleCommand) helper.Sleep(100) - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, 300, 300) helper.Sleep(300) hid.PressKey(config.Config.Bindings.CTABattleOrders) helper.Sleep(100) - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, 300, 300) helper.Sleep(100) return nil diff --git a/internal/action/character.go b/internal/action/character.go index 3d5074ffd..492952804 100644 --- a/internal/action/character.go +++ b/internal/action/character.go @@ -8,7 +8,7 @@ import ( ) type Character interface { - BuffSkills() map[skill.Skill]string + BuffSkills() map[skill.ID]string KillCountess() Action KillAndariel() Action KillSummoner() Action @@ -31,9 +31,8 @@ type LevelingCharacter interface { Character // StatPoints Stats will be assigned in the order they are returned by this function. StatPoints(data.Data) map[stat.ID]int - SkillPoints(data.Data) []skill.Skill - GetKeyBindings(data.Data) map[skill.Skill]string + SkillPoints(data.Data) []skill.ID + GetKeyBindings(data.Data) map[skill.ID]string ShouldResetSkills(data.Data) bool KillAncients() Action - GetSkillTree() skill.Tree } diff --git a/internal/action/clear_level.go b/internal/action/clear_level.go index a9c5c61d4..816f7884f 100644 --- a/internal/action/clear_level.go +++ b/internal/action/clear_level.go @@ -1,6 +1,7 @@ package action import ( + "github.com/hectorgimenez/koolo/internal/config" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -29,7 +30,7 @@ func (b *Builder) ClearArea(openChests bool, filter data.MonsterFilter) *Chain { if isLevelingChar { _, healingPotsFound := d.Items.Belt.GetFirstPotion(data.HealingPotion) _, manaPotsFound := d.Items.Belt.GetFirstPotion(data.ManaPotion) - if (!healingPotsFound || !manaPotsFound) && d.PlayerUnit.TotalGold() > 1000 { + if ((!healingPotsFound && config.Config.Inventory.BeltColumns.Healing > 0) || (!manaPotsFound && config.Config.Inventory.BeltColumns.Mana > 0)) && d.PlayerUnit.TotalGold() > 1000 { return b.InRunReturnTownRoutine() } } diff --git a/internal/action/gambling.go b/internal/action/gambling.go index fe1edd694..5e2338b4e 100644 --- a/internal/action/gambling.go +++ b/internal/action/gambling.go @@ -112,8 +112,7 @@ func (b *Builder) gambleItems() *StepChainAction { b.logger.Debug("Item not found in gambling window, refreshing...", zap.String("item", string(itmName))) return []step.Step{step.SyncStep(func(d data.Data) error { - hid.MovePointer(ui.GambleRefreshButtonX, ui.GambleRefreshButtonY) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, ui.GambleRefreshButtonX, ui.GambleRefreshButtonY) return nil }), step.Wait(time.Millisecond * 500), diff --git a/internal/action/horadric_cube.go b/internal/action/horadric_cube.go index 77031a83a..caebdc3a8 100644 --- a/internal/action/horadric_cube.go +++ b/internal/action/horadric_cube.go @@ -38,13 +38,7 @@ func (b *Builder) CubeAddItems(items ...data.Item) *Chain { b.logger.Debug("Item found on the stash, picking it up", zap.String("Item", string(nwIt.Name))) actions = append(actions, NewStepChain(func(d data.Data) []step.Step { screenPos := ui.GetScreenCoordsForItem(nwIt) - hid.MovePointer(screenPos.X, screenPos.Y) - - hid.KeyDown("control") - helper.Sleep(300) - hid.Click(hid.LeftButton) - helper.Sleep(200) - hid.KeyUp("control") + hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) helper.Sleep(300) return nil @@ -60,13 +54,7 @@ func (b *Builder) CubeAddItems(items ...data.Item) *Chain { if nwIt.UnitID == updatedItem.UnitID { b.logger.Debug("Moving Item to the Horadric Cube", zap.String("Item", string(nwIt.Name))) screenPos := ui.GetScreenCoordsForItem(updatedItem) - hid.MovePointer(screenPos.X, screenPos.Y) - - hid.KeyDown("control") - helper.Sleep(300) - hid.Click(hid.LeftButton) - helper.Sleep(200) - hid.KeyUp("control") + hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) helper.Sleep(300) } } @@ -91,18 +79,12 @@ func (b *Builder) CubeTransmute() *Chain { actions = append(actions, NewStepChain(func(d data.Data) []step.Step { b.logger.Debug("Transmuting items in the Horadric Cube") - hid.MovePointer(ui.CubeTransmuteBtnX, ui.CubeTransmuteBtnY) helper.Sleep(150) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, ui.CubeTransmuteBtnX, ui.CubeTransmuteBtnY) helper.Sleep(3000) // Move the Item back to the inventory - hid.MovePointer(238, 262) - hid.KeyDown("control") - helper.Sleep(300) - hid.Click(hid.LeftButton) - helper.Sleep(200) - hid.KeyUp("control") + hid.ClickWithModifier(hid.LeftButton, 238, 262, hid.CtrlKey) helper.Sleep(300) return []step.Step{ @@ -129,9 +111,8 @@ func (b *Builder) ensureCubeIsOpen(cube data.Item) Action { return []step.Step{ step.SyncStepWithCheck(func(d data.Data) error { screenPos := ui.GetScreenCoordsForItem(cube) - hid.MovePointer(screenPos.X, screenPos.Y) helper.Sleep(300) - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, screenPos.X, screenPos.Y) helper.Sleep(200) return nil }, func(d data.Data) step.Status { diff --git a/internal/action/identify.go b/internal/action/identify.go index cb4b87b8b..28a8efd6f 100644 --- a/internal/action/identify.go +++ b/internal/action/identify.go @@ -77,14 +77,11 @@ func (b *Builder) itemsToIdentify(d data.Data) (items []data.Item) { func identifyItem(idTome data.Item, i data.Item) { screenPos := ui.GetScreenCoordsForItem(idTome) - hid.MovePointer(screenPos.X, screenPos.Y) helper.Sleep(500) - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, screenPos.X, screenPos.Y) helper.Sleep(1000) screenPos = ui.GetScreenCoordsForItem(i) - hid.MovePointer(screenPos.X, screenPos.Y) - helper.Sleep(1000) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, screenPos.X, screenPos.Y) helper.Sleep(350) } diff --git a/internal/action/leveling_tools.go b/internal/action/leveling_tools.go index 9b8b84ca7..e724ae0a3 100644 --- a/internal/action/leveling_tools.go +++ b/internal/action/leveling_tools.go @@ -1,7 +1,7 @@ package action import ( - "fmt" + "slices" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -26,10 +26,10 @@ var uiStatButtonPosition = map[stat.ID]data.Position{ stat.Energy: {X: 240, Y: 430}, } -var uiSkillTabPosition = []data.Position{ - {X: 910, Y: 140}, - {X: 1010, Y: 140}, +var uiSkillPagePosition = [3]data.Position{ {X: 1100, Y: 140}, + {X: 1010, Y: 140}, + {X: 910, Y: 140}, } var uiSkillRowPosition = [6]int{190, 250, 310, 365, 430, 490} @@ -73,8 +73,7 @@ func (b *Builder) EnsureStatPoints() *StepChainAction { return []step.Step{ step.SyncStep(func(_ data.Data) error { helper.Sleep(100) - hid.MovePointer(statBtnPosition.X, statBtnPosition.Y) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, statBtnPosition.X, statBtnPosition.Y) helper.Sleep(500) return nil }), @@ -103,8 +102,7 @@ func (b *Builder) EnsureSkillPoints() *StepChainAction { return nil } - skillTree := char.GetSkillTree() - assignedPoints := make(map[skill.Skill]int) + assignedPoints := make(map[skill.ID]int) for _, sk := range char.SkillPoints(d) { currentPoints, found := assignedPoints[sk] if !found { @@ -114,8 +112,8 @@ func (b *Builder) EnsureSkillPoints() *StepChainAction { assignedPoints[sk] = currentPoints + 1 characterPoints, found := d.PlayerUnit.Skills[sk] - if !found || characterPoints < assignedPoints[sk] { - position, skFound := skillTree[sk] + if !found || int(characterPoints.Level) < assignedPoints[sk] { + skillDesc, skFound := skill.Desc[sk] if !skFound { b.logger.Error("skill not found for character", zap.Any("skill", sk)) return nil @@ -134,11 +132,9 @@ func (b *Builder) EnsureSkillPoints() *StepChainAction { step.SyncStep(func(_ data.Data) error { assignAttempts++ helper.Sleep(100) - hid.MovePointer(uiSkillTabPosition[position.Tab].X, uiSkillTabPosition[position.Tab].Y) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, uiSkillPagePosition[skillDesc.Page-1].X, uiSkillPagePosition[skillDesc.Page-1].Y) helper.Sleep(200) - hid.MovePointer(uiSkillColumnPosition[position.Column], uiSkillRowPosition[position.Row]) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, uiSkillColumnPosition[skillDesc.Column-1], uiSkillRowPosition[skillDesc.Row-1]) helper.Sleep(500) return nil }), @@ -150,6 +146,26 @@ func (b *Builder) EnsureSkillPoints() *StepChainAction { }, RepeatUntilNoSteps()) } +func (b *Builder) UpdateQuestLog() *StepChainAction { + return NewStepChain(func(d data.Data) []step.Step { + if _, isLevelingChar := b.ch.(LevelingCharacter); !isLevelingChar { + return nil + } + + return []step.Step{ + step.SyncStep(func(_ data.Data) error { + hid.PressKey(config.Config.Bindings.OpenQuestLog) + return nil + }), + step.Wait(time.Second), + step.SyncStep(func(_ data.Data) error { + hid.PressKey(config.Config.Bindings.OpenQuestLog) + return nil + }), + } + }) +} + func (b *Builder) EnsureSkillBindings() *StepChainAction { return NewStepChain(func(d data.Data) []step.Step { if _, isLevelingChar := b.ch.(LevelingCharacter); !isLevelingChar { @@ -161,23 +177,24 @@ func (b *Builder) EnsureSkillBindings() *StepChainAction { if len(skillBindings) > 0 && len(d.PlayerUnit.Skills) != previousTotalSkillNumber { return []step.Step{ - step.SyncStep(func(_ data.Data) error { - hid.MovePointer(ui.SecondarySkillButtonX, ui.SecondarySkillButtonY) - hid.Click(hid.LeftButton) + // Right click skill bindings + step.SyncStep(func(d data.Data) error { + hid.Click(hid.LeftButton, ui.SecondarySkillButtonX, ui.SecondarySkillButtonY) helper.Sleep(300) hid.MovePointer(10, 10) helper.Sleep(300) - sc := helper.Screenshot() for sk, binding := range skillBindings { if binding == "" { continue } - tm := b.tf.Find(fmt.Sprintf("skills_%d", sk), sc) - if !tm.Found { + + skillPosition, found := b.calculateSkillPositionInUI(d, false, sk) + if !found { continue } - hid.MovePointer(tm.PositionX+10, tm.PositionY+10) + + hid.MovePointer(skillPosition.X, skillPosition.Y) helper.Sleep(100) hid.PressKey(binding) helper.Sleep(300) @@ -186,25 +203,24 @@ func (b *Builder) EnsureSkillBindings() *StepChainAction { previousTotalSkillNumber = len(d.PlayerUnit.Skills) return nil }), + + // Set main left click skill step.SyncStep(func(_ data.Data) error { for sk, binding := range skillBindings { if binding != "" { continue } - hid.MovePointer(ui.MainSkillButtonX, ui.MainSkillButtonY) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, ui.MainSkillButtonX, ui.MainSkillButtonY) helper.Sleep(300) hid.MovePointer(10, 10) helper.Sleep(300) - sc := helper.Screenshot() - tm := b.tf.Find(fmt.Sprintf("skills_%d", sk), sc) - if !tm.Found { - continue + skillPosition, found := b.calculateSkillPositionInUI(d, false, sk) + if !found { + return nil } - hid.MovePointer(tm.PositionX+10, tm.PositionY+10) helper.Sleep(100) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, skillPosition.X, skillPosition.Y) } return nil }), @@ -215,26 +231,76 @@ func (b *Builder) EnsureSkillBindings() *StepChainAction { }, RepeatUntilNoSteps()) } -func (b *Builder) GetCompletedQuests(act int) []bool { - hid.PressKey(config.Config.Bindings.OpenQuestLog) - hid.MovePointer(ui.QuestFirstTabX+(act-1)*ui.QuestTabXInterval, ui.QuestFirstTabY) - helper.Sleep(200) - hid.Click(hid.LeftButton) - helper.Sleep(3000) +func (b *Builder) calculateSkillPositionInUI(d data.Data, mainSkill bool, skillID skill.ID) (data.Position, bool) { + var scrolls = []skill.ID{ + skill.TomeOfTownPortal, skill.ScrollOfTownPortal, skill.TomeOfIdentify, skill.ScrollOfIdentify, + } + + if _, found := d.PlayerUnit.Skills[skillID]; !found { + return data.Position{}, false + } + + targetSkill := skill.Skills[skillID] + descs := make(map[skill.ID]skill.Skill) + row := 0 + totalRows := make([]int, 0) + column := 0 + skillsWithCharges := 0 + for skID, points := range d.PlayerUnit.Skills { + sk := skill.Skills[skID] + // Skip skills that can not be bind + if sk.Desc().ListRow < 0 { + continue + } + + // Skip skills that can not be bind to current mouse button + if (mainSkill == true && !sk.LeftSkill) || (mainSkill == false && !sk.RightSkill) { + continue + } + + if points.Charges > 0 { + skillsWithCharges++ + continue + } + + if slices.Contains(scrolls, sk.ID) { + continue + } + descs[skID] = sk + + if skID != targetSkill.ID && sk.Desc().ListRow == targetSkill.Desc().ListRow && targetSkill.ID < skID { + column++ + } - quests := make([]bool, 6) - if act == 4 { - quests = make([]bool, 3) + totalRows = append(totalRows, sk.Desc().ListRow) + if row == targetSkill.Desc().ListRow { + continue + } + + row++ } - sc := helper.Screenshot() - for i := 0; i < len(quests); i++ { - tm := b.tf.Find(fmt.Sprintf("quests_a%d_%d", act, i+1), sc) - quests[i] = tm.Found + slices.Sort(totalRows) + totalRows = slices.Compact(totalRows) + + // Scrolls and charges are not in the same list + if slices.Contains(scrolls, skillID) { + column = skillsWithCharges + row = len(totalRows) + for _, skID := range scrolls { + if d.PlayerUnit.Skills[skID].Quantity > 0 { + if skID == skillID { + break + } + column++ + } + } } - hid.PressKey("esc") - return quests + return data.Position{ + X: ui.SkillListFirstSkillX + ui.SkillListSkillOffset*column, + Y: ui.SkillListFirstSkillY - ui.SkillListSkillOffset*row, + }, true } func (b *Builder) HireMerc() *Chain { @@ -244,33 +310,22 @@ func (b *Builder) HireMerc() *Chain { // Hire the merc if we don't have one, we have enough gold, and we are in act 2. We assume that ReviveMerc was called before this. if config.Config.Game.Difficulty == difficulty.Normal && d.MercHPPercent() <= 0 && d.PlayerUnit.TotalGold() > 30000 && d.PlayerUnit.Area == area.LutGholein { b.logger.Info("Hiring merc...") + // TODO: Hire Holy Freeze merc if available, if not, hire Defiance merc. actions = append(actions, - b.InteractNPC(town.GetTownByArea(d.PlayerUnit.Area).MercContractorNPC(), step.KeySequence("home", "down", "enter")), - NewStepChain(func(d data.Data) []step.Step { - sc := helper.Screenshot() - tm := b.tf.Find(fmt.Sprintf("skills_merc_%d", skill.Defiance), sc) - if !tm.Found { - return nil - } - - return []step.Step{ - step.SyncStep(func(d data.Data) error { - hid.MovePointer(tm.PositionX-100, tm.PositionY) - hid.Click(hid.LeftButton) - hid.Click(hid.LeftButton) + b.InteractNPC( + town.GetTownByArea(d.PlayerUnit.Area).MercContractorNPC(), + step.KeySequence("home", "down", "enter"), + step.Wait(time.Second*2), + step.SyncStep(func(d data.Data) error { + hid.Click(hid.LeftButton, ui.FirstMercFromContractorListX, ui.FirstMercFromContractorListY) + helper.Sleep(300) + hid.Click(hid.LeftButton, ui.FirstMercFromContractorListX, ui.FirstMercFromContractorListY) - return nil - }), - } - }), + return nil + }), + ), ) } - - // We will change the Defiance merc to the holy freeze, much better to avoid being hit. - if config.Config.Game.Difficulty == difficulty.Nightmare && d.MercHPPercent() > 0 && d.PlayerUnit.TotalGold() > 50000 && d.PlayerUnit.Area == area.KurastDocks && d.PlayerUnit.Skills[skill.Defiance] > 0 { - b.logger.Info("Changing Defiance merc by Holy Freeze...") - // Remove merc items - } } return diff --git a/internal/action/move.go b/internal/action/move.go index 6f3fa0516..2cdf5918b 100644 --- a/internal/action/move.go +++ b/internal/action/move.go @@ -2,6 +2,7 @@ package action import ( "fmt" + "github.com/hectorgimenez/koolo/internal/config" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -127,7 +128,7 @@ func (b *Builder) MoveTo(toFunc func(d data.Data) (data.Position, bool), opts .. if isLevelingChar && !d.PlayerUnit.Area.IsTown() { _, healingPotsFound := d.Items.Belt.GetFirstPotion(data.HealingPotion) _, manaPotsFound := d.Items.Belt.GetFirstPotion(data.ManaPotion) - if (!healingPotsFound || !manaPotsFound) && d.PlayerUnit.TotalGold() > 1000 { + if ((!healingPotsFound && config.Config.Inventory.BeltColumns.Healing > 0) || (!manaPotsFound && config.Config.Inventory.BeltColumns.Mana > 0)) && d.PlayerUnit.TotalGold() > 1000 { return []Action{NewChain(func(d data.Data) []Action { return b.InRunReturnTownRoutine() })} diff --git a/internal/action/pre_run.go b/internal/action/pre_run.go index 59cd1e327..3bc236a2f 100644 --- a/internal/action/pre_run.go +++ b/internal/action/pre_run.go @@ -11,6 +11,7 @@ func (b *Builder) PreRun(firstRun bool) []Action { } return []Action{ + b.UpdateQuestLog(), b.ResetStats(), b.EnsureStatPoints(), b.EnsureSkillPoints(), diff --git a/internal/action/recover_corpse.go b/internal/action/recover_corpse.go index f4ab1a356..e2abdd2bd 100644 --- a/internal/action/recover_corpse.go +++ b/internal/action/recover_corpse.go @@ -3,7 +3,6 @@ package action import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -21,9 +20,7 @@ func (b *Builder) RecoverCorpse() *StepChainAction { d.Corpse.Position.X, d.Corpse.Position.Y, ) - hid.MovePointer(x, y) - helper.Sleep(300) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, x, y) return nil }, func(d data.Data) step.Status { diff --git a/internal/action/repair.go b/internal/action/repair.go index 534dbe3a5..6c4f3b77e 100644 --- a/internal/action/repair.go +++ b/internal/action/repair.go @@ -34,8 +34,7 @@ func (b *Builder) Repair() *Chain { step.KeySequence(keys...), step.SyncStep(func(_ data.Data) error { helper.Sleep(100) - hid.MovePointer(390, 515) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, 390, 515) helper.Sleep(500) return nil }), diff --git a/internal/action/stash.go b/internal/action/stash.go index c131fbca8..477844f9e 100644 --- a/internal/action/stash.go +++ b/internal/action/stash.go @@ -2,6 +2,7 @@ package action import ( "fmt" + "go.uber.org/zap" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" @@ -18,9 +19,11 @@ import ( ) const ( - maxGoldPerStashTab = 2500000 - stashGoldBtnX = 966 - stashGoldBtnY = 526 + maxGoldPerStashTab = 2500000 + stashGoldBtnX = 966 + stashGoldBtnY = 526 + stashGoldBtnConfirmX = 547 + stashGoldBtnConfirmY = 388 ) func (b *Builder) Stash(forceStash bool) *Chain { @@ -64,9 +67,8 @@ func (b *Builder) orderInventoryPotions(d data.Data) { continue } screenPos := ui.GetScreenCoordsForItem(i) - hid.MovePointer(screenPos.X, screenPos.Y) helper.Sleep(100) - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, screenPos.X, screenPos.Y) helper.Sleep(200) } } @@ -92,6 +94,8 @@ func (b *Builder) stashGold(d data.Data) { return } + b.logger.Info("Stashing gold...", zap.Int("gold", gold)) + if d.PlayerUnit.Stats[stat.StashGold] < maxGoldPerStashTab { switchTab(1) clickStashGoldBtn() @@ -158,11 +162,7 @@ func (b *Builder) stashItemAction(i data.Item, forceStash bool) bool { helper.Sleep(170) screenshot := helper.Screenshot() helper.Sleep(150) - hid.KeyDown("control") - helper.Sleep(700) - hid.Click(hid.LeftButton) - helper.Sleep(700) - hid.KeyUp("control") + hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) helper.Sleep(500) d := b.gr.GetData(false) @@ -180,11 +180,10 @@ func (b *Builder) stashItemAction(i data.Item, forceStash bool) bool { } func clickStashGoldBtn() { - hid.MovePointer(stashGoldBtnX, stashGoldBtnY) helper.Sleep(170) - hid.Click(hid.LeftButton) - helper.Sleep(500) - hid.PressKey("enter") + hid.Click(hid.LeftButton, stashGoldBtnX, stashGoldBtnY) + helper.Sleep(1000) + hid.Click(hid.LeftButton, stashGoldBtnConfirmX, stashGoldBtnConfirmY) helper.Sleep(700) } @@ -194,8 +193,6 @@ func switchTab(tab int) { tabSize := 82 x = x + tabSize*tab - tabSize/2 - hid.MovePointer(x, y) - helper.Sleep(400) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, x, y) helper.Sleep(500) } diff --git a/internal/action/step/attack.go b/internal/action/step/attack.go index e4971254a..d5e03a85f 100644 --- a/internal/action/step/attack.go +++ b/internal/action/step/attack.go @@ -127,15 +127,12 @@ func (p *AttackStep) Run(d data.Data) error { p.tryTransitionStatus(StatusInProgress) if time.Since(p.lastRun) > config.Config.Runtime.CastDuration && p.numOfAttacksRemaining > 0 { hid.KeyDown(p.standStillBinding) - if !p.aoe { - x, y := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, monster.Position.X, monster.Position.Y) - hid.MovePointer(x, y) - } + x, y := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, monster.Position.X, monster.Position.Y) if p.primaryAttack { - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, x, y) } else { - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, x, y) } helper.Sleep(20) hid.KeyUp(p.standStillBinding) diff --git a/internal/action/step/interact_entrance.go b/internal/action/step/interact_entrance.go index 422b7b4f6..054a5729c 100644 --- a/internal/action/step/interact_entrance.go +++ b/internal/action/step/interact_entrance.go @@ -59,12 +59,12 @@ func (m *InteractEntranceStep) Run(d data.Data) error { } if l.IsEntrance { + lx, ly := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, l.Position.X-2, l.Position.Y-2) if d.HoverData.UnitType == 5 || d.HoverData.UnitType == 2 && d.HoverData.IsHovered { - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, lx, ly) m.waitingForInteraction = true } - lx, ly := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, l.Position.X-2, l.Position.Y-2) x, y := helper.Spiral(m.mouseOverAttempts) hid.MovePointer(lx+x, ly+y) m.mouseOverAttempts++ diff --git a/internal/action/step/interact_npc.go b/internal/action/step/interact_npc.go index 754e58ae4..3c98c881b 100644 --- a/internal/action/step/interact_npc.go +++ b/internal/action/step/interact_npc.go @@ -60,8 +60,9 @@ func (i *InteractNPCStep) Run(d data.Data) error { i.lastRun = time.Now() m, found := d.Monsters.FindOne(i.NPC, data.MonsterTypeNone) if found { + x, y := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, m.Position.X, m.Position.Y) if m.IsHovered { - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, x, y) i.waitingForInteraction = true return nil } @@ -71,8 +72,6 @@ func (i *InteractNPCStep) Run(d data.Data) error { return fmt.Errorf("NPC is too far away: %d. Current distance: %d", i.NPC, distance) } - x, y := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, m.Position.X, m.Position.Y) - // Act 4 Tyrael has a super weird hitbox if i.NPC == npc.Tyrael2 { hid.MovePointer(x, y-20) diff --git a/internal/action/step/interact_object.go b/internal/action/step/interact_object.go index 034d7d39b..e838321f4 100644 --- a/internal/action/step/interact_object.go +++ b/internal/action/step/interact_object.go @@ -59,8 +59,11 @@ func (i *InteractObjectStep) Run(d data.Data) error { i.lastRun = time.Now() if o, found := d.Objects.FindOne(i.objectName); found { + objectX := o.Position.X - 2 + objectY := o.Position.Y - 2 + mX, mY := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, objectX, objectY) if o.IsHovered { - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, mX, mY) i.waitingForInteraction = true return nil } else { @@ -69,10 +72,6 @@ func (i *InteractObjectStep) Run(d data.Data) error { return fmt.Errorf("object is too far away: %d. Current distance: %d", o.Name, distance) } - objectX := o.Position.X - 2 - objectY := o.Position.Y - 2 - mX, mY := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, objectX, objectY) - // In order to avoid the spiral (super slow and shitty) let's try to point the mouse to the top of the portal directly if i.mouseOverAttempts == 2 && i.objectName == object.TownPortal { mX, mY = pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, objectX-4, objectY-4) diff --git a/internal/action/step/move_to.go b/internal/action/step/move_to.go index 0009489e4..2d892800e 100644 --- a/internal/action/step/move_to.go +++ b/internal/action/step/move_to.go @@ -74,7 +74,7 @@ func (m *MoveToStep) Run(d data.Data) error { if d.PlayerUnit.RightSkill != skill.Teleport { hid.PressKey(config.Config.Bindings.Teleport) } - } else if d.PlayerUnit.Skills[skill.Vigor] > 0 && config.Config.Bindings.Paladin.Vigor != "" { + } else if d.PlayerUnit.Skills[skill.Vigor].Level > 0 && config.Config.Bindings.Paladin.Vigor != "" { if d.PlayerUnit.RightSkill != skill.Vigor { hid.PressKey(config.Config.Bindings.Paladin.Vigor) } diff --git a/internal/action/step/open_portal.go b/internal/action/step/open_portal.go index 7a884670e..65cad867e 100644 --- a/internal/action/step/open_portal.go +++ b/internal/action/step/open_portal.go @@ -43,7 +43,7 @@ func (s *OpenPortalStep) Run(_ data.Data) error { hid.PressKey(config.Config.Bindings.TP) helper.Sleep(250) - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, 300, 300) s.lastRun = time.Now() return nil diff --git a/internal/action/step/pickup_item.go b/internal/action/step/pickup_item.go index cd6bd0107..7a037bab7 100644 --- a/internal/action/step/pickup_item.go +++ b/internal/action/step/pickup_item.go @@ -75,8 +75,12 @@ func (p *PickupItemStep) Run(d data.Data) error { p.lastRun = time.Now() for _, i := range d.Items.ByLocation(item.LocationGround) { if i.UnitID == p.item.UnitID { + objectX := i.Position.X - 1 + objectY := i.Position.Y - 1 + mX, mY := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, objectX, objectY) + if i.IsHovered { - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, mX, mY) if p.waitingForInteraction.IsZero() { p.waitingForInteraction = time.Now() } @@ -85,7 +89,7 @@ func (p *PickupItemStep) Run(d data.Data) error { // Sometimes we got stuck because mouse is hovering a chest and item is in behind, it usually happens a lot // on Andariel, so we open it if p.isChestHovered(d) { - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, mX, mY) } distance := pather.DistanceFromMe(d, i.Position) @@ -94,9 +98,6 @@ func (p *PickupItemStep) Run(d data.Data) error { return fmt.Errorf("item is too far away: %s", p.item.Name) } - objectX := i.Position.X - 1 - objectY := i.Position.Y - 1 - mX, mY := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, objectX, objectY) x, y := helper.Spiral(p.mouseOverAttempts) hid.MovePointer(mX+x, mY+y) p.mouseOverAttempts++ diff --git a/internal/action/waypoint.go b/internal/action/waypoint.go index 85af839c7..b00f8705e 100644 --- a/internal/action/waypoint.go +++ b/internal/action/waypoint.go @@ -46,9 +46,7 @@ func (b *Builder) openWPAndSelectTab(a area.Area, d data.Data) Action { step.SyncStep(func(d data.Data) error { actTabX := wpTabStartX + (wpCoords.Tab-1)*wpTabSizeX + (wpTabSizeX / 2) - hid.MovePointer(actTabX, wpTabStartY) - helper.Sleep(200) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, actTabX, wpTabStartY) helper.Sleep(200) return nil @@ -63,12 +61,11 @@ func (b *Builder) openWPAndSelectTab(a area.Area, d data.Data) Action { func (b *Builder) useWP(a area.Area) *Chain { return NewChain(func(d data.Data) (actions []Action) { nextAvailableWP := area.WPAddresses[a] - currentWP := a traverseAreas := make([]area.Area, 0) for { found := false for _, wp := range d.PlayerUnit.AvailableWaypoints { - if wp == currentWP { + if wp == a { found = true break } @@ -80,7 +77,7 @@ func (b *Builder) useWP(a area.Area) *Chain { traverseAreas = append(nextAvailableWP.LinkedFrom, traverseAreas...) a = nextAvailableWP.LinkedFrom[0] - nextAvailableWP = area.WPAddresses[currentWP] + nextAvailableWP = area.WPAddresses[nextAvailableWP.LinkedFrom[0]] } // First use the previous available waypoint that we have discovered @@ -88,9 +85,7 @@ func (b *Builder) useWP(a area.Area) *Chain { return []step.Step{ step.SyncStep(func(d data.Data) error { areaBtnY := wpListStartY + (nextAvailableWP.Row-1)*wpAreaBtnHeight + (wpAreaBtnHeight / 2) - hid.MovePointer(wpListPositionX, areaBtnY) - helper.Sleep(200) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, wpListPositionX, areaBtnY) helper.Sleep(1000) return nil diff --git a/internal/bot.go b/internal/bot.go index d086ab8f7..d7e1f5e6c 100644 --- a/internal/bot.go +++ b/internal/bot.go @@ -97,8 +97,12 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) (err error if err := b.hm.HandleHealthAndMana(d); err != nil { return err } - if err := b.maxGameLengthExceeded(gameStartedAt); err != nil { - return err + + // Check if game length is exceeded, only if it's not a leveling run + if r.Name() != run.NameLeveling { + if err := b.maxGameLengthExceeded(gameStartedAt); err != nil { + return err + } } // TODO: Maybe add some kind of "on every iteration action", something that can be executed/skipped on every iteration diff --git a/internal/character/blizzard_sorceress.go b/internal/character/blizzard_sorceress.go index d749e4f57..885d2adbb 100644 --- a/internal/character/blizzard_sorceress.go +++ b/internal/character/blizzard_sorceress.go @@ -88,8 +88,8 @@ func (s BlizzardSorceress) KillMonsterSequence( }, action.RepeatUntilNoSteps()) } -func (s BlizzardSorceress) BuffSkills() map[skill.Skill]string { - return map[skill.Skill]string{ +func (s BlizzardSorceress) BuffSkills() map[skill.ID]string { + return map[skill.ID]string{ skill.FrozenArmor: config.Config.Bindings.Sorceress.FrozenArmor, } } diff --git a/internal/character/hammerdin.go b/internal/character/hammerdin.go index 21a34f006..c32d04634 100644 --- a/internal/character/hammerdin.go +++ b/internal/character/hammerdin.go @@ -76,8 +76,8 @@ func (s Hammerdin) KillMonsterSequence( }, action.RepeatUntilNoSteps()) } -func (s Hammerdin) BuffSkills() map[skill.Skill]string { - return map[skill.Skill]string{ +func (s Hammerdin) BuffSkills() map[skill.ID]string { + return map[skill.ID]string{ skill.HolyShield: config.Config.Bindings.Paladin.HolyShield, } } diff --git a/internal/character/lightning_sorceress.go b/internal/character/lightning_sorceress.go index d079808e5..1d9b8466a 100644 --- a/internal/character/lightning_sorceress.go +++ b/internal/character/lightning_sorceress.go @@ -79,8 +79,8 @@ func (s LightningSorceress) KillMonsterSequence( }, action.RepeatUntilNoSteps()) } -func (s LightningSorceress) BuffSkills() map[skill.Skill]string { - return map[skill.Skill]string{ +func (s LightningSorceress) BuffSkills() map[skill.ID]string { + return map[skill.ID]string{ skill.FrozenArmor: config.Config.Bindings.Sorceress.FrozenArmor, skill.EnergyShield: config.Config.Bindings.Sorceress.EnergyShield, } diff --git a/internal/character/paladin_leveling.go b/internal/character/paladin_leveling.go index da079ce0a..a500f29de 100644 --- a/internal/character/paladin_leveling.go +++ b/internal/character/paladin_leveling.go @@ -19,12 +19,8 @@ type PaladinLeveling struct { BaseCharacter } -func (p PaladinLeveling) GetSkillTree() skill.Tree { - return skill.PaladinTree -} - -func (p PaladinLeveling) BuffSkills() map[skill.Skill]string { - return map[skill.Skill]string{ +func (p PaladinLeveling) BuffSkills() map[skill.ID]string { + return map[skill.ID]string{ skill.HolyShield: config.Config.Bindings.Paladin.HolyShield, } } @@ -166,7 +162,7 @@ func (p PaladinLeveling) KillMonsterSequence(monsterSelector func(d data.Data) ( m, _ := d.Monsters.FindByID(id) p.logger.Debug("ATTACKING MONSTER", zap.Any("monster", m.Name)) - if d.PlayerUnit.Skills[skill.BlessedHammer] > 0 { + if d.PlayerUnit.Skills[skill.BlessedHammer].Level > 0 { // Add a random movement, maybe hammer is not hitting the target if previousUnitID == id { steps = append(steps, @@ -180,7 +176,7 @@ func (p PaladinLeveling) KillMonsterSequence(monsterSelector func(d data.Data) ( step.PrimaryAttack(id, numOfAttacks, step.Distance(2, 7), step.EnsureAura(config.Config.Bindings.Paladin.Concentration)), ) } else { - if d.PlayerUnit.Skills[skill.Zeal] > 0 { + if d.PlayerUnit.Skills[skill.Zeal].Level > 0 { numOfAttacks = 1 } @@ -230,9 +226,9 @@ func (p PaladinLeveling) StatPoints(d data.Data) map[stat.ID]int { } } -func (p PaladinLeveling) SkillPoints(d data.Data) []skill.Skill { +func (p PaladinLeveling) SkillPoints(d data.Data) []skill.ID { if d.PlayerUnit.Stats[stat.Level] < 21 { - return []skill.Skill{ + return []skill.ID{ skill.Might, skill.Sacrifice, skill.ResistFire, @@ -259,7 +255,7 @@ func (p PaladinLeveling) SkillPoints(d data.Data) []skill.Skill { } // Hammerdin - return []skill.Skill{ + return []skill.ID{ skill.HolyBolt, skill.BlessedHammer, skill.Prayer, @@ -350,19 +346,19 @@ func (p PaladinLeveling) SkillPoints(d data.Data) []skill.Skill { } } -func (p PaladinLeveling) GetKeyBindings(d data.Data) map[skill.Skill]string { - skillBindings := map[skill.Skill]string{ +func (p PaladinLeveling) GetKeyBindings(d data.Data) map[skill.ID]string { + skillBindings := map[skill.ID]string{ skill.Vigor: config.Config.Bindings.Paladin.Vigor, skill.HolyShield: config.Config.Bindings.Paladin.HolyShield, } - if d.PlayerUnit.Skills[skill.BlessedHammer] > 0 && d.PlayerUnit.Stats[stat.Level] >= 18 { + if d.PlayerUnit.Skills[skill.BlessedHammer].Level > 0 && d.PlayerUnit.Stats[stat.Level] >= 18 { skillBindings[skill.BlessedHammer] = "" - } else if d.PlayerUnit.Skills[skill.Zeal] > 0 { + } else if d.PlayerUnit.Skills[skill.Zeal].Level > 0 { skillBindings[skill.Zeal] = "" } - if d.PlayerUnit.Skills[skill.Concentration] > 0 && d.PlayerUnit.Stats[stat.Level] >= 18 { + if d.PlayerUnit.Skills[skill.Concentration].Level > 0 && d.PlayerUnit.Stats[stat.Level] >= 18 { skillBindings[skill.Concentration] = config.Config.Bindings.Paladin.Concentration } else { if _, found := d.PlayerUnit.Skills[skill.HolyFire]; found { @@ -376,7 +372,7 @@ func (p PaladinLeveling) GetKeyBindings(d data.Data) map[skill.Skill]string { } func (p PaladinLeveling) ShouldResetSkills(d data.Data) bool { - if d.PlayerUnit.Stats[stat.Level] >= 21 && d.PlayerUnit.Skills[skill.HolyFire] > 10 { + if d.PlayerUnit.Stats[stat.Level] >= 21 && d.PlayerUnit.Skills[skill.HolyFire].Level > 10 { return true } diff --git a/internal/character/sorceress_leveling.go b/internal/character/sorceress_leveling.go index 2f2aa7e2e..6ec673852 100644 --- a/internal/character/sorceress_leveling.go +++ b/internal/character/sorceress_leveling.go @@ -19,32 +19,28 @@ type SorceressLeveling struct { BaseCharacter } -func (s SorceressLeveling) GetSkillTree() skill.Tree { - return skill.SorceressTree -} - func (s SorceressLeveling) ShouldResetSkills(d data.Data) bool { - if d.PlayerUnit.Stats[stat.Level] >= 25 && d.PlayerUnit.Skills[skill.FireBall] > 10 { + if d.PlayerUnit.Stats[stat.Level] >= 25 && d.PlayerUnit.Skills[skill.FireBall].Level > 10 { return true } return false } -func (s SorceressLeveling) GetKeyBindings(d data.Data) map[skill.Skill]string { - skillBindings := map[skill.Skill]string{ +func (s SorceressLeveling) GetKeyBindings(d data.Data) map[skill.ID]string { + skillBindings := map[skill.ID]string{ skill.FrozenArmor: config.Config.Bindings.Sorceress.FrozenArmor, skill.StaticField: config.Config.Bindings.Sorceress.StaticField, skill.Teleport: config.Config.Bindings.Teleport, skill.TomeOfTownPortal: config.Config.Bindings.TP, } - if d.PlayerUnit.Skills[skill.Blizzard] > 0 { + if d.PlayerUnit.Skills[skill.Blizzard].Level > 0 { skillBindings[skill.Blizzard] = config.Config.Bindings.Sorceress.Blizzard skillBindings[skill.GlacialSpike] = "" - } else if d.PlayerUnit.Skills[skill.FireBall] > 0 { + } else if d.PlayerUnit.Skills[skill.FireBall].Level > 0 { skillBindings[skill.FireBall] = config.Config.Bindings.Sorceress.FireBall - } else if d.PlayerUnit.Skills[skill.FireBolt] > 0 { + } else if d.PlayerUnit.Skills[skill.FireBolt].Level > 0 { skillBindings[skill.FireBolt] = config.Config.Bindings.Sorceress.FireBall } @@ -73,9 +69,9 @@ func (s SorceressLeveling) StatPoints(d data.Data) map[stat.ID]int { } } -func (s SorceressLeveling) SkillPoints(d data.Data) []skill.Skill { +func (s SorceressLeveling) SkillPoints(d data.Data) []skill.ID { if d.PlayerUnit.Stats[stat.Level] < 25 { - return []skill.Skill{ + return []skill.ID{ skill.FireBolt, skill.FrozenArmor, skill.FireBolt, @@ -112,7 +108,7 @@ func (s SorceressLeveling) SkillPoints(d data.Data) []skill.Skill { } } - return []skill.Skill{ + return []skill.ID{ skill.StaticField, skill.StaticField, skill.StaticField, @@ -472,8 +468,8 @@ func (s SorceressLeveling) killMonster(npc npc.ID, t data.MonsterType) action.Ac }, nil) } -func (s SorceressLeveling) BuffSkills() map[skill.Skill]string { - return map[skill.Skill]string{ +func (s SorceressLeveling) BuffSkills() map[skill.ID]string { + return map[skill.ID]string{ skill.FrozenArmor: config.Config.Bindings.Sorceress.FrozenArmor, } } diff --git a/internal/event/listener.go b/internal/event/listener.go index a48ac2da6..c75fef0b0 100644 --- a/internal/event/listener.go +++ b/internal/event/listener.go @@ -3,10 +3,10 @@ package event import ( "context" "fmt" + "github.com/hectorgimenez/koolo/internal/helper" "os" "time" - "github.com/go-vgo/robotgo" "go.uber.org/zap" ) @@ -39,8 +39,8 @@ func (l *Listener) Listen(ctx context.Context) error { } if e.Image != nil { - fileName := fmt.Sprintf("screenshots/error-%s.png", time.Now().Format("2006-01-02 15_04_05")) - err := robotgo.SavePng(e.Image, fileName) + fileName := fmt.Sprintf("screenshots/error-%s.jpeg", time.Now().Format("2006-01-02 15_04_05")) + err := helper.SaveImageJPEG(e.Image, fileName) if err != nil { l.logger.Error("error saving screenshot", zap.Error(err)) } diff --git a/internal/helper/game_manager.go b/internal/helper/game_manager.go index 2311af436..2d0e87a4b 100644 --- a/internal/helper/game_manager.go +++ b/internal/helper/game_manager.go @@ -3,28 +3,24 @@ package helper import ( "errors" "fmt" - "github.com/hectorgimenez/d2go/pkg/data/difficulty" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/reader" - "github.com/hectorgimenez/koolo/internal/ui" ) type GameManager struct { gr *reader.GameReader - tf *ui.TemplateFinder } -func NewGameManager(gr *reader.GameReader, tf *ui.TemplateFinder) *GameManager { - return &GameManager{gr: gr, tf: tf} +func NewGameManager(gr *reader.GameReader) *GameManager { + return &GameManager{gr: gr} } func (gm *GameManager) ExitGame() error { // First try to exit game as fast as possible, without any check, useful when chickening hid.PressKey("esc") - hid.MovePointer(hid.GameAreaSizeX/2, int(float64(hid.GameAreaSizeY)/2.2)) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, hid.GameAreaSizeX/2, int(float64(hid.GameAreaSizeY)/2.2)) for i := 0; i < 5; i++ { if !gm.gr.InGame() { @@ -37,8 +33,7 @@ func (gm *GameManager) ExitGame() error { // Probably closing the socket is more reliable, but was not working properly for me on singleplayer. for i := 0; i < 10; i++ { if gm.gr.GetData(false).OpenMenus.QuitMenu { - hid.MovePointer(hid.GameAreaSizeX/2, int(float64(hid.GameAreaSizeY)/2.2)) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, hid.GameAreaSizeX/2, int(float64(hid.GameAreaSizeY)/2.2)) for i := 0; i < 5; i++ { if !gm.gr.InGame() { @@ -60,7 +55,9 @@ func (gm *GameManager) NewGame() error { } for i := 0; i < 30; i++ { - if gm.tf.Find("ui_config_gear", Screenshot()).Found { + gm.gr.InGame() + if gm.gr.InCharacterSelectionScreen() { + Sleep(2000) // Wait for character selection screen to load break } Sleep(500) @@ -76,12 +73,9 @@ func (gm *GameManager) NewGame() error { createX := difficultyPosition[config.Config.Game.Difficulty].X createY := difficultyPosition[config.Config.Game.Difficulty].Y - hid.MovePointer(600, 650) - Sleep(250) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, 600, 650) Sleep(250) - hid.MovePointer(createX, createY) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, createX, createY) for i := 0; i < 30; i++ { if gm.gr.InGame() { @@ -95,18 +89,15 @@ func (gm *GameManager) NewGame() error { func (gm *GameManager) CreateOnlineGame(gameCounter int) (string, error) { // Enter bnet lobby - hid.MovePointer(744, 650) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, 744, 650) Sleep(1200) // Click "Create game" tab - hid.MovePointer(845, 54) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, 845, 54) Sleep(200) // Click the game name textbox, delete text and type new game name - hid.MovePointer(925, 116) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, 925, 116) hid.PressKeyCombination("lctrl", "a") gameName := config.Config.Companion.GameNameTemplate + fmt.Sprintf("%d", gameCounter) for _, ch := range gameName { @@ -114,8 +105,7 @@ func (gm *GameManager) CreateOnlineGame(gameCounter int) (string, error) { } // Same for password - hid.MovePointer(925, 161) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, 925, 161) Sleep(200) hid.PressKeyCombination("lctrl", "a") hid.PressKey("x") @@ -133,18 +123,15 @@ func (gm *GameManager) CreateOnlineGame(gameCounter int) (string, error) { func (gm *GameManager) JoinOnlineGame(gameName, password string) error { // Enter bnet lobby - hid.MovePointer(744, 650) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, 744, 650) Sleep(1200) // Click "Join game" tab - hid.MovePointer(977, 54) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, 977, 54) Sleep(200) // Click the game name textbox, delete text and type new game name - hid.MovePointer(836, 100) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, 836, 100) Sleep(200) hid.PressKeyCombination("lctrl", "a") Sleep(200) @@ -153,8 +140,7 @@ func (gm *GameManager) JoinOnlineGame(gameName, password string) error { } // Same for password - hid.MovePointer(1020, 100) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, 1020, 100) Sleep(200) hid.PressKeyCombination("lctrl", "a") Sleep(200) diff --git a/internal/helper/screenshot.go b/internal/helper/screenshot.go index f07ab3fab..3567d0083 100644 --- a/internal/helper/screenshot.go +++ b/internal/helper/screenshot.go @@ -1,20 +1,89 @@ package helper import ( - "image" - - "github.com/go-vgo/robotgo" + "github.com/hectorgimenez/koolo/internal/helper/winproc" "github.com/hectorgimenez/koolo/internal/hid" + "github.com/hectorgimenez/koolo/internal/memory" + "github.com/hectorgimenez/koolo/internal/ui" + "image" + "image/jpeg" + "os" + "unsafe" ) func Screenshot() image.Image { - scale := robotgo.ScaleF() + sizeX := int(float64(hid.GameAreaSizeX) * ui.GameWindowScale()) + sizeY := int(float64(hid.GameAreaSizeY) * ui.GameWindowScale()) + + // Create a device context compatible with the window + hdcWindow, _, _ := winproc.GetWindowDC.Call(uintptr(memory.HWND)) + hdcMem, _, _ := winproc.CreateCompatibleDC.Call(hdcWindow) + hbmMem, _, _ := winproc.CreateCompatibleBitmap.Call(hdcWindow, uintptr(sizeX), uintptr(sizeY)) + _, _, _ = winproc.SelectObject.Call(hdcMem, hbmMem) + + // Use PrintWindow to copy the window into the bitmap + winproc.PrintWindow.Call(uintptr(memory.HWND), hdcMem, 3) // use 3 to get window content only + + // map the bitmap structure + bmpInfo := struct { + BiSize uint32 + BiWidth, BiHeight int32 + BiPlanes uint16 + BiBitCount uint16 + BiCompression uint32 + BiSizeImage uint32 + BiXPelsPerMeter int32 + BiYPelsPerMeter int32 + BiClrUsed uint32 + BiClrImportant uint32 + }{ + BiSize: 40, // The size of the BITMAPINFOHEADER structure + BiWidth: int32(sizeX), + BiHeight: -int32(sizeY), // negative to indicate top-down bitmap + BiPlanes: 1, + BiBitCount: 32, // 32 bits-per-pixel + BiCompression: 0, // BI_RGB, no compression + BiSizeImage: 0, // 0 for BI_RGB + } - startX := int(float64(hid.WindowLeftX) * scale) - startY := int(float64(hid.WindowTopY) * scale) + bufSize := sizeX * sizeY * 4 + buf := make([]byte, bufSize) + winproc.GetDIBits.Call( + hdcMem, + hbmMem, + 0, + uintptr(sizeY), + uintptr(unsafe.Pointer(&buf[0])), + uintptr(unsafe.Pointer(&bmpInfo)), + 0, // DIB_RGB_COLORS + ) + + // Convert raw bytes to *image.RGBA + img := image.NewRGBA(image.Rect(0, 0, sizeX, sizeY)) + copy(img.Pix, buf) + + // Windows is using BRG instead of RGB, let's swap red and blue layers + for y := 0; y < img.Bounds().Dy(); y++ { + for x := 0; x < img.Bounds().Dx(); x++ { + idx := y*img.Stride + x*4 // Calculate index for the start of the pixel + // Swap red and blue (at idx and idx+2) + img.Pix[idx], img.Pix[idx+2] = img.Pix[idx+2], img.Pix[idx] + } + } + + // Cleanup + _, _, _ = winproc.DeleteObject.Call(hbmMem) + _, _, _ = winproc.DeleteDC.Call(hdcMem) + + return img +} - width := int(float64(hid.GameAreaSizeX) * scale) - height := int(float64(hid.GameAreaSizeY) * scale) +func SaveImageJPEG(img image.Image, path string) error { + f, err := os.Create(path) + if err != nil { + return err + } + defer f.Close() - return robotgo.CaptureImg(startX, startY, width, height) + return jpeg.Encode(f, img, &jpeg.Options{Quality: 80}) } diff --git a/internal/helper/tcp/const.go b/internal/helper/tcp/const.go deleted file mode 100644 index 705a472bd..000000000 --- a/internal/helper/tcp/const.go +++ /dev/null @@ -1,35 +0,0 @@ -package tcp - -type ( - TCP_TABLE_CLASS int32 - DWORD uint32 - ULONG uint32 - MIB_TCP_STATE int32 -) - -const ( - TCP_TABLE_BASIC_LISTENER TCP_TABLE_CLASS = iota - TCP_TABLE_BASIC_CONNECTIONS - TCP_TABLE_BASIC_ALL - TCP_TABLE_OWNER_PID_LISTENER - TCP_TABLE_OWNER_PID_CONNECTIONS - TCP_TABLE_OWNER_PID_ALL - TCP_TABLE_OWNER_MODULE_LISTENER - TCP_TABLE_OWNER_MODULE_CONNECTIONS - TCP_TABLE_OWNER_MODULE_ALL -) - -const ( - MIB_TCP_STATE_CLOSED MIB_TCP_STATE = 1 - MIB_TCP_STATE_LISTEN MIB_TCP_STATE = 2 - MIB_TCP_STATE_SYN_SENT MIB_TCP_STATE = 3 - MIB_TCP_STATE_SYN_RCVD MIB_TCP_STATE = 4 - MIB_TCP_STATE_ESTAB MIB_TCP_STATE = 5 - MIB_TCP_STATE_FIN_WAIT1 MIB_TCP_STATE = 6 - MIB_TCP_STATE_FIN_WAIT2 MIB_TCP_STATE = 7 - MIB_TCP_STATE_CLOSE_WAIT MIB_TCP_STATE = 8 - MIB_TCP_STATE_CLOSING MIB_TCP_STATE = 9 - MIB_TCP_STATE_LAST_ACK MIB_TCP_STATE = 10 - MIB_TCP_STATE_TIME_WAIT MIB_TCP_STATE = 11 - MIB_TCP_STATE_DELETE_TCB MIB_TCP_STATE = 12 -) diff --git a/internal/helper/tcp/error.go b/internal/helper/tcp/error.go deleted file mode 100644 index 0f70755d4..000000000 --- a/internal/helper/tcp/error.go +++ /dev/null @@ -1,5 +0,0 @@ -package tcp - -import "errors" - -var CloseGameSocketErr = errors.New("error closing game socket") diff --git a/internal/helper/tcp/game.go b/internal/helper/tcp/game.go deleted file mode 100644 index 0ab669fb5..000000000 --- a/internal/helper/tcp/game.go +++ /dev/null @@ -1,45 +0,0 @@ -package tcp - -import ( - "errors" - "unsafe" - - "golang.org/x/sys/windows" -) - -func CloseCurrentGameSocket(gamePID uint) error { - var lastOpenSocket []byte - var buffSize DWORD - _ = GetExtendedTCPTable(uintptr(0), &buffSize, true, 2, TCP_TABLE_OWNER_PID_ALL, 0) - var buffTable = make([]byte, int(buffSize)) - err := GetExtendedTCPTable(uintptr(unsafe.Pointer(&buffTable[0])), &buffSize, true, 2, TCP_TABLE_OWNER_PID_ALL, 0) - if !errors.Is(err, windows.DNS_ERROR_RCODE_NO_ERROR) { - return CloseGameSocketErr - } - - count := *(*uint32)(unsafe.Pointer(&buffTable[0])) - const structLen = 24 - for n, pos := uint32(0), 4; n < count && pos+structLen <= len(buffTable); n, pos = n+1, pos+structLen { - state := *(*uint32)(unsafe.Pointer(&buffTable[pos])) - if state < 1 || state > 12 { - return CloseGameSocketErr - } - pid := *(*uint32)(unsafe.Pointer(&buffTable[pos+20])) - - if uint(pid) == gamePID && state == uint32(MIB_TCP_STATE_ESTAB) { - buffTable[pos] = byte(MIB_TCP_STATE_DELETE_TCB) - lastOpenSocket = buffTable[pos : pos+24] - } - } - - if len(lastOpenSocket) == 0 { - return CloseGameSocketErr - } - - err = SetTCPEntry(uintptr(unsafe.Pointer(&lastOpenSocket[0]))) - if errors.Is(err, windows.DNS_ERROR_RCODE_NO_ERROR) { - return nil - } - - return CloseGameSocketErr -} diff --git a/internal/helper/tcp/helper.go b/internal/helper/tcp/helper.go deleted file mode 100644 index 5a95128a0..000000000 --- a/internal/helper/tcp/helper.go +++ /dev/null @@ -1,38 +0,0 @@ -package tcp - -import ( - "syscall" - "unsafe" -) - -var ( - lib = syscall.MustLoadDLL("iphlpapi.dll") - setTCPEntry = lib.MustFindProc("SetTcpEntry").Addr() - getExtendedTCPTable = lib.MustFindProc("GetExtendedTcpTable").Addr() -) - -func SetTCPEntry(ptr uintptr) error { - _, _, err := syscall.SyscallN(setTCPEntry, ptr) - - return err -} - -func GetExtendedTCPTable(tcpTablePtr uintptr, pdwSize *DWORD, bOrder bool, ulAf ULONG, tableClass TCP_TABLE_CLASS, reserved ULONG) error { - _, _, err := syscall.SyscallN(getExtendedTCPTable, - tcpTablePtr, - uintptr(unsafe.Pointer(pdwSize)), - getUintptrFromBool(bOrder), - uintptr(ulAf), - uintptr(tableClass), - uintptr(reserved)) - - return err -} - -func getUintptrFromBool(b bool) uintptr { - if b { - return 1 - } else { - return 0 - } -} diff --git a/internal/helper/winproc/gdi32.go b/internal/helper/winproc/gdi32.go new file mode 100644 index 000000000..b614df608 --- /dev/null +++ b/internal/helper/winproc/gdi32.go @@ -0,0 +1,13 @@ +package winproc + +import "golang.org/x/sys/windows" + +var ( + GDI32 = windows.NewLazySystemDLL("gdi32.dll") + CreateCompatibleDC = GDI32.NewProc("CreateCompatibleDC") + CreateCompatibleBitmap = GDI32.NewProc("CreateCompatibleBitmap") + SelectObject = GDI32.NewProc("SelectObject") + DeleteObject = GDI32.NewProc("DeleteObject") + DeleteDC = GDI32.NewProc("DeleteDC") + GetDIBits = GDI32.NewProc("GetDIBits") +) diff --git a/internal/helper/winproc/kernel32.go b/internal/helper/winproc/kernel32.go new file mode 100644 index 000000000..24dad312d --- /dev/null +++ b/internal/helper/winproc/kernel32.go @@ -0,0 +1,13 @@ +package winproc + +import "golang.org/x/sys/windows" + +const ( + EXECUTION_STATE_ES_DISPLAY_REQUIRED = 0x00000002 + EXECUTION_STATE_ES_CONTINUOUS = 0x80000000 +) + +var ( + KERNEL32 = windows.NewLazySystemDLL("kernel32.dll") + SetThreadExecutionState = KERNEL32.NewProc("SetThreadExecutionState") +) diff --git a/internal/helper/winproc/user32.go b/internal/helper/winproc/user32.go new file mode 100644 index 000000000..29b01ba65 --- /dev/null +++ b/internal/helper/winproc/user32.go @@ -0,0 +1,9 @@ +package winproc + +import "golang.org/x/sys/windows" + +var ( + USER32 = windows.NewLazySystemDLL("user32.dll") + PrintWindow = USER32.NewProc("PrintWindow") + GetWindowDC = USER32.NewProc("GetWindowDC") +) diff --git a/internal/hid/keyboard.go b/internal/hid/keyboard.go index 771324779..1a5056a29 100644 --- a/internal/hid/keyboard.go +++ b/internal/hid/keyboard.go @@ -1,10 +1,12 @@ package hid import ( + "github.com/hectorgimenez/koolo/internal/memory" "math/rand" + "strings" "time" - "github.com/go-vgo/robotgo" + "github.com/lxn/win" ) const ( @@ -14,26 +16,64 @@ const ( // PressKey toggles a key, it holds the key between keyPressMinTime and keyPressMaxTime ms randomly func PressKey(key string) { - robotgo.KeyDown(key) + asciiChar := getASCIICode(key) + win.PostMessage(memory.HWND, win.WM_KEYDOWN, asciiChar, 0) sleepTime := rand.Intn(keyPressMaxTime-keyPressMinTime) + keyPressMinTime time.Sleep(time.Duration(sleepTime) * time.Millisecond) - robotgo.KeyUp(key) + win.PostMessage(memory.HWND, win.WM_KEYUP, asciiChar, 0) } func KeyDown(key string) { - robotgo.KeyDown(key) + win.PostMessage(memory.HWND, win.WM_KEYDOWN, getASCIICode(key), 0) } func KeyUp(key string) { - robotgo.KeyUp(key) + win.PostMessage(memory.HWND, win.WM_KEYUP, getASCIICode(key), 0) } func PressKeyCombination(keys ...string) { for _, k := range keys { - robotgo.KeyDown(k) + win.PostMessage(memory.HWND, win.WM_KEYDOWN, getASCIICode(k), 0) } time.Sleep(time.Millisecond * 200) for _, k := range keys { - robotgo.KeyUp(k) + win.PostMessage(memory.HWND, win.WM_KEYUP, getASCIICode(k), 0) } } + +func getASCIICode(key string) uintptr { + if len(key) == 1 { + return uintptr(strings.ToUpper(key)[0]) + } + + return specialChars[strings.ToLower(key)] +} + +var specialChars = map[string]uintptr{ + "esc": win.VK_ESCAPE, + "enter": win.VK_RETURN, + "f1": win.VK_F1, + "f2": win.VK_F2, + "f3": win.VK_F3, + "f4": win.VK_F4, + "f5": win.VK_F5, + "f6": win.VK_F6, + "f7": win.VK_F7, + "f8": win.VK_F8, + "f9": win.VK_F9, + "f10": win.VK_F10, + "f11": win.VK_F11, + "f12": win.VK_F12, + "lctrl": win.VK_LCONTROL, + "home": win.VK_HOME, + "down": win.VK_DOWN, + "up": win.VK_UP, + "left": win.VK_LEFT, + "right": win.VK_RIGHT, + "tab": win.VK_TAB, + "space": win.VK_SPACE, + "alt": win.VK_MENU, + "lalt": win.VK_LMENU, + "ralt": win.VK_RMENU, + "shift": win.VK_LSHIFT, +} diff --git a/internal/hid/mouse.go b/internal/hid/mouse.go index 47134e4e4..cc522a8ba 100644 --- a/internal/hid/mouse.go +++ b/internal/hid/mouse.go @@ -1,7 +1,12 @@ package hid import ( - "github.com/go-vgo/robotgo" + "github.com/hectorgimenez/koolo/internal/memory" + "github.com/hectorgimenez/koolo/internal/ui" + "github.com/lxn/win" + "image/color" + "math/rand" + "time" ) var ( @@ -12,11 +17,15 @@ var ( ) const ( - RightButton MouseButton = "right" - LeftButton MouseButton = "left" + RightButton MouseButton = win.MK_RBUTTON + LeftButton MouseButton = win.MK_LBUTTON + + ShiftKey ModifierKey = win.VK_SHIFT + CtrlKey ModifierKey = win.VK_CONTROL ) -type MouseButton string +type MouseButton uint +type ModifierKey uint // MovePointer moves the mouse to the requested position, x and y should be the final position based on // pixels shown in the screen. Top-left corner is 0,0 @@ -24,18 +33,52 @@ func MovePointer(x, y int) { x = WindowLeftX + x y = WindowTopY + y - // TODO this is a workaround to prevent moving the mouse outside the game window - if x > WindowLeftX+GameAreaSizeX { - x = WindowLeftX + GameAreaSizeX - 10 - } - if y > WindowTopY+GameAreaSizeY { - y = WindowTopY + GameAreaSizeY - 10 - } + scale := ui.GameWindowScale() + x = int(float64(x) * scale) + y = int(float64(y) * scale) + + memory.InjectCursorPos(x, y) + lParam := calculateLparam(x, y) + win.SendMessage(memory.HWND, win.WM_NCHITTEST, 0, lParam) + win.SendMessage(memory.HWND, win.WM_SETCURSOR, 0x000105A8, 0x2010001) + win.PostMessage(memory.HWND, win.WM_MOUSEMOVE, 0, lParam) +} - robotgo.Move(x, y) +type Changeable interface { + Set(x, y int, c color.Color) } // Click just does a single mouse click at current pointer position -func Click(btn MouseButton) { - robotgo.Click(string(btn)) +func Click(btn MouseButton, x, y int) { + MovePointer(x, y) + x = WindowLeftX + x + y = WindowTopY + y + + scale := ui.GameWindowScale() + x = int(float64(x) * scale) + y = int(float64(y) * scale) + + lParam := calculateLparam(x, y) + buttonDown := uint32(win.WM_LBUTTONDOWN) + buttonUp := uint32(win.WM_LBUTTONUP) + if btn == RightButton { + buttonDown = win.WM_RBUTTONDOWN + buttonUp = win.WM_RBUTTONUP + } + + win.SendMessage(memory.HWND, buttonDown, 1, lParam) + sleepTime := rand.Intn(keyPressMaxTime-keyPressMinTime) + keyPressMinTime + time.Sleep(time.Duration(sleepTime) * time.Millisecond) + win.SendMessage(memory.HWND, buttonUp, 1, lParam) + memory.RestoreGetCursorPosAddr() +} + +func ClickWithModifier(btn MouseButton, x, y int, modifier ModifierKey) { + memory.OverrideGetKeyState(int(modifier)) + Click(btn, x, y) + memory.RestoreGetKeyState() +} + +func calculateLparam(x, y int) uintptr { + return uintptr(y<<16 | x) } diff --git a/internal/memory/hooks_asm.go b/internal/memory/hooks_asm.go new file mode 100644 index 000000000..9792cb8e4 --- /dev/null +++ b/internal/memory/hooks_asm.go @@ -0,0 +1,145 @@ +package memory + +import ( + "encoding/binary" + "errors" + "fmt" + "github.com/lxn/win" + "github.com/winlabs/gowin32" + "golang.org/x/sys/windows" + "strings" + "unsafe" +) + +const fullAccess = windows.PROCESS_VM_OPERATION | windows.PROCESS_VM_WRITE | windows.PROCESS_VM_READ + +var handle windows.Handle +var HWND win.HWND +var getCursorPosAddr uintptr +var getCursorPosOrigBytes [32]byte +var trackMouseEventAddr uintptr +var trackMouseEventBytes [32]byte +var getKeyStateAddr uintptr +var getKeyStateOrigBytes [18]byte + +func ASMInjectorInit(pid uint32) error { + pHandle, err := windows.OpenProcess(fullAccess, false, pid) + if err != nil { + return fmt.Errorf("error opening process: %w", err) + } + handle = pHandle + + modules, err := gowin32.GetProcessModules(pid) + if err != nil { + return fmt.Errorf("error getting process modules: %w", err) + } + + for _, module := range modules { + // GetCursorPos + if strings.EqualFold(module.ModuleName, "USER32.dll") { + getCursorPosAddr = uintptr(unsafe.Pointer(module.ModuleBaseAddress)) + 0x2A440 + err = windows.ReadProcessMemory(handle, getCursorPosAddr, &getCursorPosOrigBytes[0], uintptr(len(getCursorPosOrigBytes)), nil) + if err != nil { + return fmt.Errorf("error reading memory: %w", err) + } + + err = hookTrackMouseEvent(uintptr(unsafe.Pointer(module.ModuleBaseAddress))) + if err != nil { + return err + } + + getKeyStateAddr = uintptr(unsafe.Pointer(module.ModuleBaseAddress)) + 0x24E50 + err = windows.ReadProcessMemory(handle, getKeyStateAddr, &getKeyStateOrigBytes[0], uintptr(len(getKeyStateOrigBytes)), nil) + if err != nil { + return fmt.Errorf("error reading memory: %w", err) + } + } + } + if getCursorPosAddr == 0 || getKeyStateAddr == 0 { + return errors.New("could not find GetCursorPos address") + } + + return nil +} + +func ASMInjectorUnload() error { + err := RestoreGetCursorPosAddr() + if err != nil { + return fmt.Errorf("error writing to memory: %w", err) + } + + err = windows.WriteProcessMemory(handle, trackMouseEventAddr, &trackMouseEventBytes[0], uintptr(len(trackMouseEventBytes)), nil) + if err != nil { + return fmt.Errorf("error writing to memory: %w", err) + } + + err = RestoreGetKeyState() + if err != nil { + return err + } + + return windows.CloseHandle(handle) +} + +func InjectCursorPos(x, y int) error { + /* + push rax + mov rax, rcx + mov dword ptr [rax], 1 // X + mov dword ptr [rax+4], 2 // Y + pop rax + mov al, 1 + ret + */ + bytes := []byte{0x50, 0x48, 0x89, 0xC8, 0xC7, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC7, 0x40, 0x04, 0x02, 0x00, 0x00, 0x00, 0x58, 0xB0, 0x01, 0xC3} + + buff := make([]byte, 4) + binary.LittleEndian.PutUint32(buff, uint32(x)) + copy(bytes[6:], buff) + + binary.LittleEndian.PutUint32(buff, uint32(y)) + copy(bytes[13:], buff) + + return windows.WriteProcessMemory(handle, getCursorPosAddr, &bytes[0], uintptr(len(bytes)), nil) +} + +func OverrideGetKeyState(key int) error { + /* + cmp rcx, 0x12 + mov rax, 0x8000 + ret + */ + bytes := []byte{0x48, 0x81, 0xF9, byte(key), 0x00, 0x00, 0x00, 0x48, 0xB8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3} + return windows.WriteProcessMemory(handle, getKeyStateAddr, &bytes[0], uintptr(len(bytes)), nil) +} + +func RestoreGetKeyState() error { + return windows.WriteProcessMemory(handle, getKeyStateAddr, &getKeyStateOrigBytes[0], uintptr(len(getKeyStateOrigBytes)), nil) +} + +func RestoreGetCursorPosAddr() error { + return windows.WriteProcessMemory(handle, getCursorPosAddr, &getCursorPosOrigBytes[0], uintptr(len(getCursorPosOrigBytes)), nil) +} + +func hookTrackMouseEvent(baseAddr uintptr) error { + trackMouseEventAddr = baseAddr + 0x2EB10 + err := windows.ReadProcessMemory(handle, trackMouseEventAddr, &trackMouseEventBytes[0], uintptr(len(trackMouseEventBytes)), nil) + if err != nil { + return err + } + + // and dword ptr [rcx+4], 0xFFFFFFFD + // Modify TRACKMOUSEEVENT struct to disable mouse leave events, since we are injecting our events even if the mouse is not over the window + disableMouseLeaveRequest := []byte{0x81, 0x61, 0x04, 0xFD, 0xFF, 0xFF, 0xFF} + + // We need to move back the pointer 7 bytes to get the correct position, since we are injecting 7 bytes in front of it + num := int32(binary.LittleEndian.Uint32(trackMouseEventBytes[2:6])) + num -= 7 + numberBytes := make([]byte, 4) + binary.LittleEndian.PutUint32(numberBytes, uint32(num)) + injectBytes := append(trackMouseEventBytes[0:2], numberBytes...) + + hook := append(disableMouseLeaveRequest, injectBytes...) + + return windows.WriteProcessMemory(handle, trackMouseEventAddr, &hook[0], uintptr(len(hook)), nil) +} diff --git a/internal/pather/path_finder.go b/internal/pather/path_finder.go index e5e34531c..906b5bdc7 100644 --- a/internal/pather/path_finder.go +++ b/internal/pather/path_finder.go @@ -178,14 +178,14 @@ func GetClosestWalkablePath(d data.Data, dest data.Position, blacklistedCoords . } func MoveThroughPath(p *Pather, distance int, teleport bool) { - if len(p.AstarPather) == 0 { - if teleport { - hid.Click(hid.RightButton) - } else { - hid.PressKey(config.Config.Bindings.ForceMove) - } - return - } + //if len(p.AstarPather) == 0 { + // if teleport { + // hid.Click(hid.RightButton) + // } else { + // hid.PressKey(config.Config.Bindings.ForceMove) + // } + // return + //} moveTo := p.AstarPather[0].(*Tile) if distance > 0 && len(p.AstarPather) > distance { @@ -198,12 +198,11 @@ func MoveThroughPath(p *Pather, distance int, teleport bool) { screenY = int(float32(hid.GameAreaSizeY) / 1.21) } - hid.MovePointer(screenX, screenY) if distance > 0 { if teleport { - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, screenX, screenY) } else { - hid.PressKey(config.Config.Bindings.ForceMove) + hid.Click(hid.LeftButton, screenX, screenY) } } } @@ -237,8 +236,7 @@ func RandomMovement() { midGameY := hid.GameAreaSizeY / 2 x := midGameX + rand.Intn(midGameX) - (midGameX / 2) y := midGameY + rand.Intn(midGameY) - (midGameY / 2) - hid.MovePointer(x, y) - hid.PressKey(config.Config.Bindings.ForceMove) + hid.Click(hid.LeftButton, x, y) } func relativePosition(d data.Data, p data.Position, cgOffset data.Position) (int, int) { diff --git a/internal/remote/discord/discord_event_handler.go b/internal/remote/discord/discord_event_handler.go index 869a4cfa4..91c39df64 100644 --- a/internal/remote/discord/discord_event_handler.go +++ b/internal/remote/discord/discord_event_handler.go @@ -3,22 +3,21 @@ package discord import ( "bytes" "context" - "image/png" - "github.com/bwmarrin/discordgo" "github.com/hectorgimenez/koolo/internal/event" + "image/jpeg" ) func (b *Bot) Handle(_ context.Context, m event.Message) error { if m.Image != nil { buf := new(bytes.Buffer) - err := png.Encode(buf, m.Image) + err := jpeg.Encode(buf, m.Image, &jpeg.Options{Quality: 80}) if err != nil { return err } _, err = b.discordSession.ChannelMessageSendComplex(b.channelID, &discordgo.MessageSend{ - File: &discordgo.File{Name: "Screenshot.png", ContentType: "image/png", Reader: buf}, + File: &discordgo.File{Name: "Screenshot.jpeg", ContentType: "image/jpeg", Reader: buf}, Content: m.Message, }) diff --git a/internal/run/diablo.go b/internal/run/diablo.go index f82a79392..138477fe8 100644 --- a/internal/run/diablo.go +++ b/internal/run/diablo.go @@ -1,7 +1,6 @@ package run import ( - "fmt" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -220,13 +219,13 @@ func (a Diablo) getLessConcurredCornerAroundSeal(d data.Data, sealPosition data. } // No monsters found here, don't need to keep checking if monstersFound == 0 { - fmt.Printf("Moving to corner %d. Has no monsters.\n", i) + a.logger.Debug("Moving to corner", zap.Int("corner", i), zap.Int("monsters", monstersFound)) return corners[i] } - fmt.Printf("Corner %d. Average monster distance: %d\n", i, averageDistance) + a.logger.Debug("Corner", zap.Int("corner", i), zap.Int("monsters", monstersFound), zap.Int("distance", averageDistance)) } - fmt.Printf("Moving to corner %d. Average monster distance: %d\n", bestCorner, bestCornerDistance) + a.logger.Debug("Moving to corner", zap.Int("corner", bestCorner), zap.Int("monsters", bestCornerDistance)) return corners[bestCorner] } diff --git a/internal/run/leveling.go b/internal/run/leveling.go index 42bb948b5..68a3cc9ae 100644 --- a/internal/run/leveling.go +++ b/internal/run/leveling.go @@ -6,6 +6,8 @@ import ( "github.com/hectorgimenez/koolo/internal/reader" ) +const NameLeveling = "Leveling" + type Leveling struct { baseRun gr *reader.GameReader @@ -13,7 +15,7 @@ type Leveling struct { } func (a Leveling) Name() string { - return "Leveling" + return NameLeveling } func (a Leveling) BuildActions() []action.Action { diff --git a/internal/run/leveling_act1.go b/internal/run/leveling_act1.go index 22edc78ea..acca4c32a 100644 --- a/internal/run/leveling_act1.go +++ b/internal/run/leveling_act1.go @@ -6,6 +6,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/item" "github.com/hectorgimenez/d2go/pkg/data/npc" "github.com/hectorgimenez/d2go/pkg/data/object" + "github.com/hectorgimenez/d2go/pkg/data/quest" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" @@ -24,10 +25,8 @@ func (a Leveling) act1() action.Action { return nil } - quests := a.builder.GetCompletedQuests(1) - running = true - if !quests[0] { + if !d.Quests[quest.Act1DenOfEvil].Completed() { return a.denOfEvil() } @@ -35,7 +34,7 @@ func (a Leveling) act1() action.Action { return a.countess() } - if !a.isCainInTown(d) && !quests[2] { + if !a.isCainInTown(d) && !d.Quests[quest.Act1TheSearchForCain].Completed() { return a.deckardCain(d) } @@ -177,17 +176,14 @@ func (a Leveling) andariel(d data.Data) []action.Action { } pos := ui.GetScreenCoordsForItem(itm) - hid.MovePointer(pos.X, pos.Y) helper.Sleep(500) if x > 3 { - hid.Click(hid.LeftButton) - helper.Sleep(300) - hid.MovePointer(ui.MercAvatarPositionX, ui.MercAvatarPositionY) + hid.Click(hid.LeftButton, pos.X, pos.Y) helper.Sleep(300) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, ui.MercAvatarPositionX, ui.MercAvatarPositionY) } else { - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, pos.X, pos.Y) } x++ } diff --git a/internal/run/leveling_act2.go b/internal/run/leveling_act2.go index e43d4b242..780248902 100644 --- a/internal/run/leveling_act2.go +++ b/internal/run/leveling_act2.go @@ -6,6 +6,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/item" "github.com/hectorgimenez/d2go/pkg/data/npc" "github.com/hectorgimenez/d2go/pkg/data/object" + "github.com/hectorgimenez/d2go/pkg/data/quest" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" @@ -34,14 +35,13 @@ func (a Leveling) act2() action.Action { return a.findHoradricCube() } - quests := a.builder.GetCompletedQuests(2) - if quests[4] { + if d.Quests[quest.Act2TheSummoner].Completed() { // Try to get level 21 before moving to Duriel and Act3 if d.PlayerUnit.Stats[stat.Level] < 18 { return TalRashaTombs{a.baseRun}.BuildActions() } - return a.duriel(quests[1], d) + return a.duriel(d.Quests[quest.Act2TheHoradricStaff].Completed(), d) } _, horadricStaffFound := d.Items.Find("HoradricStaff", item.LocationInventory, item.LocationStash, item.LocationEquipped) @@ -176,13 +176,8 @@ func (a Leveling) prepareStaff() action.Action { }, step.SyncStep(func(d data.Data) error { screenPos := ui.GetScreenCoordsForItem(horadricStaff) - hid.MovePointer(screenPos.X, screenPos.Y) - hid.KeyDown("control") - helper.Sleep(300) - hid.Click(hid.LeftButton) - helper.Sleep(200) - hid.KeyUp("control") + hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) helper.Sleep(300) hid.PressKey("esc") return nil @@ -251,7 +246,7 @@ func (a Leveling) duriel(staffAlreadyUsed bool, d data.Data) (actions []action.A // If staff has not been used, then put it in the orifice and wait for the entrance to open if !staffAlreadyUsed { actions = append(actions, - a.builder.ClearAreaAroundPlayer(20), + a.builder.ClearAreaAroundPlayer(30), a.builder.InteractObject(object.HoradricOrifice, func(d data.Data) bool { return d.OpenMenus.Anvil }, @@ -259,17 +254,12 @@ func (a Leveling) duriel(staffAlreadyUsed bool, d data.Data) (actions []action.A staff, _ := d.Items.Find("HoradricStaff", item.LocationInventory) screenPos := ui.GetScreenCoordsForItem(staff) - hid.MovePointer(screenPos.X, screenPos.Y) + hid.Click(hid.LeftButton, screenPos.X, screenPos.Y) helper.Sleep(300) - hid.Click(hid.LeftButton) - hid.MovePointer(ui.AnvilCenterX, ui.AnvilCenterY) - helper.Sleep(300) - hid.Click(hid.LeftButton) - helper.Sleep(300) - hid.MovePointer(ui.AnvilBtnX, ui.AnvilBtnY) + hid.Click(hid.LeftButton, ui.AnvilCenterX, ui.AnvilCenterY) helper.Sleep(500) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, ui.AnvilBtnX, ui.AnvilBtnY) helper.Sleep(20000) return nil @@ -304,17 +294,14 @@ func (a Leveling) duriel(staffAlreadyUsed bool, d data.Data) (actions []action.A } pos := ui.GetScreenCoordsForItem(itm) - hid.MovePointer(pos.X, pos.Y) helper.Sleep(500) if x > 3 { - hid.Click(hid.LeftButton) - helper.Sleep(300) - hid.MovePointer(ui.MercAvatarPositionX, ui.MercAvatarPositionY) + hid.Click(hid.LeftButton, pos.X, pos.Y) helper.Sleep(300) - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, ui.MercAvatarPositionX, ui.MercAvatarPositionY) } else { - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, pos.X, pos.Y) } x++ } diff --git a/internal/run/leveling_act3.go b/internal/run/leveling_act3.go index 1c4838d6c..9a1887930 100644 --- a/internal/run/leveling_act3.go +++ b/internal/run/leveling_act3.go @@ -1,6 +1,8 @@ package run import ( + "github.com/hectorgimenez/d2go/pkg/data/npc" + "github.com/hectorgimenez/d2go/pkg/data/quest" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -17,21 +19,25 @@ import ( func (a Leveling) act3() action.Action { running := false - return action.NewChain(func(d data.Data) []action.Action { + return action.NewChain(func(d data.Data) (actions []action.Action) { if running || d.PlayerUnit.Area != area.KurastDocks { return nil } - quests := a.builder.GetCompletedQuests(3) + // Try to find Hratli at pier, if he's there, talk to him, so he will move to the normal position later + hratli, found := d.Monsters.FindOne(npc.Hratli, data.MonsterTypeNone) + if found { + actions = append(actions, a.builder.InteractNPC(hratli.Name)) + } running = true _, willFound := d.Items.Find("KhalimsWill", item.LocationInventory, item.LocationStash) if willFound { - return a.openMephistoStairs() + return append(actions, a.openMephistoStairs()...) } - if quests[2] { - actions := Mephisto{baseRun: a.baseRun}.BuildActions() + if d.Quests[quest.Act3KhalimsWill].Completed() { + actions = append(actions, Mephisto{baseRun: a.baseRun}.BuildActions()...) return append(actions, a.builder.ItemPickup(true, 25), a.builder.InteractObject(object.HellGate, func(d data.Data) bool { return d.PlayerUnit.Area == area.ThePandemoniumFortress @@ -40,12 +46,12 @@ func (a Leveling) act3() action.Action { } // Find KhalimsEye - _, found := d.Items.Find("KhalimsEye", item.LocationInventory, item.LocationStash) + _, found = d.Items.Find("KhalimsEye", item.LocationInventory, item.LocationStash) if found { a.logger.Info("KhalimsEye found, skipping quest") } else { a.logger.Info("KhalimsEye not found, starting quest") - return a.findKhalimsEye() + return append(actions, a.findKhalimsEye()...) } // Find KhalimsBrain @@ -54,7 +60,7 @@ func (a Leveling) act3() action.Action { a.logger.Info("KhalimsBrain found, skipping quest") } else { a.logger.Info("KhalimsBrain not found, starting quest") - return a.findKhalimsBrain() + return append(actions, a.findKhalimsBrain()...) } // Find KhalimsHeart @@ -63,11 +69,11 @@ func (a Leveling) act3() action.Action { a.logger.Info("KhalimsHeart found, skipping quest") } else { a.logger.Info("KhalimsHeart not found, starting quest") - return a.findKhalimsHeart() + return append(actions, a.findKhalimsHeart()...) } // Trav - return a.openMephistoStairs() + return append(actions, a.openMephistoStairs()...) }) } @@ -189,12 +195,7 @@ func (a Leveling) openMephistoStairs() []action.Action { helper.Sleep(1000) hid.PressKey(config.Config.Bindings.OpenInventory) screenPos := ui.GetScreenCoordsForItem(khalimsWill) - hid.MovePointer(screenPos.X, screenPos.Y) - hid.KeyDown("shift") - helper.Sleep(500) - hid.Click(hid.LeftButton) - helper.Sleep(500) - hid.KeyUp("shift") + hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.ShiftKey) helper.Sleep(300) hid.PressKey("esc") return nil diff --git a/internal/run/leveling_act4.go b/internal/run/leveling_act4.go index 32e5e9ea2..a99f08552 100644 --- a/internal/run/leveling_act4.go +++ b/internal/run/leveling_act4.go @@ -4,6 +4,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/npc" + "github.com/hectorgimenez/d2go/pkg/data/quest" "github.com/hectorgimenez/koolo/internal/action" ) @@ -14,11 +15,9 @@ func (a Leveling) act4() action.Action { return nil } - quests := a.builder.GetCompletedQuests(4) - running = true - if !quests[0] { + if !d.Quests[quest.Act4TheFallenAngel].Completed() { return a.izual() } diff --git a/internal/run/leveling_act5.go b/internal/run/leveling_act5.go index 48270fb51..6130976cf 100644 --- a/internal/run/leveling_act5.go +++ b/internal/run/leveling_act5.go @@ -6,6 +6,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/difficulty" "github.com/hectorgimenez/d2go/pkg/data/npc" "github.com/hectorgimenez/d2go/pkg/data/object" + "github.com/hectorgimenez/d2go/pkg/data/quest" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" @@ -13,6 +14,7 @@ import ( "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/ui" + "time" ) func (a Leveling) act5() action.Action { @@ -21,8 +23,7 @@ func (a Leveling) act5() action.Action { return nil } - quests := a.builder.GetCompletedQuests(5) - if quests[4] { + if d.Quests[quest.Act5RiteOfPassage].Completed() { a.logger.Info("Starting Baal run...") actions := Baal{baseRun: a.baseRun}.BuildActions() return append(actions, action.NewStepChain(func(d data.Data) []step.Step { @@ -81,15 +82,15 @@ func (a Leveling) anya() []action.Action { a.builder.UsePortalInTown(), a.builder.InteractObject(object.FrozenAnya, nil), a.builder.ReturnTown(), + a.builder.Wait(time.Second * 8), a.builder.InteractNPC(npc.Malah, step.SyncStep(func(d data.Data) error { hid.PressKey("esc") hid.PressKey(config.Config.Bindings.OpenInventory) itm, _ := d.Items.Find("ScrollOfResistance") screenPos := ui.GetScreenCoordsForItem(itm) - hid.MovePointer(screenPos.X, screenPos.Y) helper.Sleep(200) - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, screenPos.X, screenPos.Y) hid.PressKey("esc") return nil @@ -116,7 +117,7 @@ func (a Leveling) ancients() []action.Action { if len(d.Monsters.Enemies()) > 0 { return true } - hid.Click(hid.LeftButton) + hid.Click(hid.LeftButton, 300, 300) helper.Sleep(1000) return false }), @@ -125,6 +126,7 @@ func (a Leveling) ancients() []action.Action { obj, _ := d.Objects.FindOne(object.ArreatSummitDoorToWorldstone) return !obj.Selectable }), + a.builder.Wait(time.Second*5), // Wait until the door is open a.builder.MoveToArea(area.TheWorldStoneKeepLevel1), a.builder.MoveToArea(area.TheWorldStoneKeepLevel2), a.builder.DiscoverWaypoint(), diff --git a/internal/run/nihlathak.go b/internal/run/nihlathak.go index 3adfe4d15..c0ac7aebf 100644 --- a/internal/run/nihlathak.go +++ b/internal/run/nihlathak.go @@ -1,8 +1,6 @@ package run import ( - "fmt" - "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/object" @@ -73,10 +71,10 @@ func (a Nihlathak) BuildActions() (actions []action.Action) { bestCorner = i bestCornerDistance = averageDistance } - fmt.Printf("Corner %d. Average monster distance: %d\n", i, averageDistance) + a.logger.Debug("Corner", zap.Int("corner", i), zap.Int("monsters", len(d.Monsters.Enemies())), zap.Int("distance", averageDistance)) } - fmt.Printf("Moving to corner %d. Average monster distance: %d\n", bestCorner, bestCornerDistance) + a.logger.Debug("Moving to corner", zap.Int("corner", bestCorner), zap.Int("averageDistance", bestCornerDistance)) return []step.Step{step.MoveTo(corners[bestCorner])} })) diff --git a/internal/supervisor.go b/internal/supervisor.go index eb6f77dd1..58ea30d2b 100644 --- a/internal/supervisor.go +++ b/internal/supervisor.go @@ -4,10 +4,11 @@ import ( "bufio" "errors" "fmt" + "github.com/hectorgimenez/koolo/internal/memory" "os" + "syscall" "time" - "github.com/go-vgo/robotgo" "github.com/hectorgimenez/koolo/internal/event/stat" "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" @@ -95,18 +96,22 @@ func (s *baseSupervisor) updateGameStats() { } func (s *baseSupervisor) ensureProcessIsRunningAndPrepare() error { - window := robotgo.FindWindow("Diablo II: Resurrected") + ptr, err := syscall.UTF16PtrFromString("Diablo II: Resurrected") + if err != nil { + return err + } + window := win.FindWindow(nil, ptr) if window == win.HWND_TOP { return errors.New("diablo II: Resurrected window can not be found! Ensure game is open") } - win.SetForegroundWindow(window) + memory.HWND = window pos := win.WINDOWPLACEMENT{} point := win.POINT{} win.ClientToScreen(window, &point) win.GetWindowPlacement(window, &pos) - hid.WindowLeftX = int(point.X + 1) + hid.WindowLeftX = int(point.X) hid.WindowTopY = int(point.Y) hid.GameAreaSizeX = int(pos.RcNormalPosition.Right) - hid.WindowLeftX - 9 hid.GameAreaSizeY = int(pos.RcNormalPosition.Bottom) - hid.WindowTopY - 9 diff --git a/internal/town/shop_manager.go b/internal/town/shop_manager.go index b9d8072d2..02a53a93f 100644 --- a/internal/town/shop_manager.go +++ b/internal/town/shop_manager.go @@ -140,23 +140,17 @@ func (sm ShopManager) SellJunk(d data.Data) { func (sm ShopManager) SellItem(i data.Item) { screenPos := ui.GetScreenCoordsForItem(i) - hid.MovePointer(screenPos.X, screenPos.Y) - helper.Sleep(100) - hid.KeyDown("control") - helper.Sleep(50) - hid.Click(hid.LeftButton) - helper.Sleep(150) - hid.KeyUp("control") + helper.Sleep(500) + hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) helper.Sleep(500) sm.logger.Debug(fmt.Sprintf("Item %s [%d] sold", i.Name, i.Quality)) } func (sm ShopManager) BuyItem(i data.Item, quantity int) { screenPos := ui.GetScreenCoordsForItem(i) - hid.MovePointer(screenPos.X, screenPos.Y) helper.Sleep(250) for k := 0; k < quantity; k++ { - hid.Click(hid.RightButton) + hid.Click(hid.RightButton, screenPos.X, screenPos.Y) helper.Sleep(900) sm.logger.Debug(fmt.Sprintf("Purchased %s [X:%d Y:%d]", i.Name, i.Position.X, i.Position.Y)) } @@ -164,13 +158,7 @@ func (sm ShopManager) BuyItem(i data.Item, quantity int) { func (sm ShopManager) buyFullStack(i data.Item) { screenPos := ui.GetScreenCoordsForItem(i) - hid.MovePointer(screenPos.X, screenPos.Y) - helper.Sleep(250) - hid.KeyDown("shift") - helper.Sleep(100) - hid.Click(hid.RightButton) - helper.Sleep(300) - hid.KeyUp("shift") + hid.ClickWithModifier(hid.RightButton, screenPos.X, screenPos.Y, hid.ShiftKey) helper.Sleep(500) } diff --git a/internal/ui/coordinates.go b/internal/ui/coordinates.go index 8dfb7314e..a0dafdffc 100644 --- a/internal/ui/coordinates.go +++ b/internal/ui/coordinates.go @@ -3,6 +3,8 @@ package ui import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/item" + "github.com/hectorgimenez/koolo/internal/memory" + "github.com/lxn/win" ) const ( @@ -22,10 +24,6 @@ const ( AnvilBtnX = 272 AnvilBtnY = 450 - QuestFirstTabX = 138 - QuestFirstTabY = 130 - QuestTabXInterval = 68 - MainSkillButtonX = 596 MainSkillButtonY = 693 @@ -34,6 +32,13 @@ const ( GambleRefreshButtonX = 390 GambleRefreshButtonY = 515 + + SkillListFirstSkillX = 687 + SkillListFirstSkillY = 590 + SkillListSkillOffset = 45 + + FirstMercFromContractorListX = 175 + FirstMercFromContractorListY = 142 ) func GetScreenCoordsForItem(itm data.Item) data.Position { @@ -50,3 +55,8 @@ func GetScreenCoordsForItem(itm data.Item) data.Position { return data.Position{X: x, Y: y} } + +func GameWindowScale() float64 { + dpi := win.GetDpiForWindow(memory.HWND) + return float64(dpi) / 96.0 +} diff --git a/internal/ui/template_finder.go b/internal/ui/template_finder.go deleted file mode 100644 index 4fafbf894..000000000 --- a/internal/ui/template_finder.go +++ /dev/null @@ -1,203 +0,0 @@ -package ui - -import ( - "fmt" - "image" - "io/fs" - "math" - "path/filepath" - "strings" - "time" - - "go.uber.org/zap" - - "gocv.io/x/gocv" -) - -type TemplateFinder struct { - templates map[string]Template - logger *zap.Logger -} - -type Template struct { - RGB gocv.Mat - GrayScale gocv.Mat - Mask gocv.Mat -} - -type TemplateMatch struct { - Score float32 - PositionX int - PositionY int - Found bool -} - -func NewTemplateFinder(logger *zap.Logger, templatesPath string) (*TemplateFinder, error) { - templates := map[string]Template{} - logger.Debug("Loading templates...") - start := time.Now() - err := filepath.Walk(templatesPath, func(path string, info fs.FileInfo, err error) error { - if err != nil { - return err - } - fileName := info.Name() - if !strings.Contains(fileName, ".webp") { - return nil - } - - mat := gocv.IMRead(path, gocv.IMReadUnchanged) - if mat.Empty() { - return nil - } - rgb := mat.Clone() - grayScale := mat.Clone() - gocv.CvtColor(mat, &rgb, gocv.ColorBGRAToBGR) - gocv.CvtColor(mat, &grayScale, gocv.ColorBGRAToGray) - - filename := strings.ReplaceAll(path, "assets\\", "") - filename = strings.ReplaceAll(filename, "\\", "_") - sanitizedName := strings.ReplaceAll(filename, ".webp", "") - - templates[sanitizedName] = Template{ - RGB: rgb, - GrayScale: grayScale, - Mask: createMask(mat), - } - - return nil - }) - if err != nil { - return nil, fmt.Errorf("error loading templates: %w", err) - } - - logger.Debug(fmt.Sprintf( - "Found a total of %d templates, loaded in %dms", - len(templates), - time.Since(start).Milliseconds()), - ) - - return &TemplateFinder{ - templates: templates, - logger: logger, - }, nil -} - -func createMask(tpl gocv.Mat) gocv.Mat { - mask := gocv.NewMat() - if tpl.Channels() > 3 { - imgChannel := gocv.Split(tpl) - gocv.Threshold(imgChannel[3], &mask, 1, 255, gocv.ThresholdBinary) - } - - return mask -} - -func (tf *TemplateFinder) MatchColorInArea(img image.Image, lowerColor, upperColor gocv.Scalar, x0, y0, x1, y1 int) TemplateMatch { - bigmat, err := gocv.ImageToMatRGB(img) - if err != nil { - return TemplateMatch{} - } - - mat := gocv.NewMat() - gocv.Resize(bigmat, &mat, image.Point{X: 1280, Y: 720}, 0, 0, gocv.InterpolationLinear) - croppedMat := mat.Region(image.Rect(x0, y0, x1, y1)) - mat = croppedMat.Clone() - gocv.CvtColor(mat, &mat, gocv.ColorBGRToHSV) - - lower := gocv.NewMatFromScalar(lowerColor, gocv.MatTypeCV8UC3) - upper := gocv.NewMatFromScalar(upperColor, gocv.MatTypeCV8UC3) - - //img2, _ := mat.ToImage() - //f, _ := os.Create("sc_hsv.png") - //png.Encode(f, img2) - //f.Close() - //lowerImg, _ := lower.ToImage() - //f, _ = os.Create("lower.png") - //png.Encode(f, lowerImg) - //f.Close() - // - //upperImg, _ := upper.ToImage() - //f, _ = os.Create("upper.png") - //png.Encode(f, upperImg) - //f.Close() - - mask := gocv.NewMat() - gocv.InRange(mat, lower, upper, &mask) - - coloredPixels := gocv.CountNonZero(mask) - percentageColored := (float64(coloredPixels) / float64(mask.Total())) * 100.0 - - tf.logger.Debug("Color matching operation", zap.Float64("score", percentageColored)) - if percentageColored > 75 { - return TemplateMatch{ - Score: float32(percentageColored), - Found: true, - } - } - - return TemplateMatch{} -} - -func (tf *TemplateFinder) FindInArea(tplName string, img image.Image, x0, y0, x1, y1 int) TemplateMatch { - t := time.Now() - threshold := float32(0.80) - colorDiffThreshold := float64(75) - - bigmat, err := gocv.ImageToMatRGB(img) - if err != nil { - return TemplateMatch{} - } - - mat := gocv.NewMat() - gocv.Resize(bigmat, &mat, image.Point{X: 1280, Y: 720}, 0, 0, gocv.InterpolationLinear) - - if x0 > 0 && y0 > 0 && x1 > 0 && y1 > 0 { - croppedMat := mat.Region(image.Rect(x0, y0, x1, y1)) - mat = croppedMat.Clone() - //croppedImg, _ := mat.ToImage() - //f, _ := os.Create("sc.png") - //png.Encode(f, croppedImg) - //f.Close() - } - - tpl, ok := tf.templates[tplName] - if !ok { - tf.logger.Error("Template not found", zap.String("template", tplName)) - return TemplateMatch{ - Score: 0, - Found: false, - } - } - - res := gocv.NewMat() - gocv.MatchTemplate(mat, tpl.RGB, &res, gocv.TmCcoeffNormed, tpl.Mask) - _, maxVal, _, maxPos := gocv.MinMaxLoc(res) - if maxVal > threshold { - region := mat.Region(image.Rect(maxPos.X, maxPos.Y, maxPos.X+tpl.RGB.Cols(), maxPos.Y+tpl.RGB.Rows())) - regionMean := region.Mean() - tplMean := tpl.RGB.Mean() - absDiff := math.Abs((regionMean.Val1 - tplMean.Val1) + (regionMean.Val2 - tplMean.Val2) + (regionMean.Val3 - tplMean.Val3)) - if absDiff < colorDiffThreshold { - tf.logger.Debug(fmt.Sprintf( - "Found Template (%dms): %s Score: %f, ColorDiff: %f", - time.Since(t).Milliseconds(), - tplName, - maxVal, - absDiff, - )) - - return TemplateMatch{ - Score: maxVal, - PositionX: maxPos.X, - PositionY: maxPos.Y, - Found: true, - } - } - } - - return TemplateMatch{} -} - -func (tf *TemplateFinder) Find(tplName string, img image.Image) TemplateMatch { - return tf.FindInArea(tplName, img, 0, 0, 0, 0) -} diff --git a/prepare_env.bat b/prepare_env.bat deleted file mode 100644 index 28b782c93..000000000 --- a/prepare_env.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off - -echo Installing dependencies... -go mod download - -echo Building OpenCV... (this will take a while) -%GOPATH%\pkg\mod\gocv.io\x\gocv@v0.35.0\win_build_opencv.cmd static From 5b0c0bcdee1a0218b63f8e4847f28650c22856e1 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Sun, 4 Feb 2024 15:40:01 +0900 Subject: [PATCH 006/548] find dll address dynamically --- internal/memory/hooks_asm.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/internal/memory/hooks_asm.go b/internal/memory/hooks_asm.go index 9792cb8e4..b2178eb5f 100644 --- a/internal/memory/hooks_asm.go +++ b/internal/memory/hooks_asm.go @@ -8,7 +8,7 @@ import ( "github.com/winlabs/gowin32" "golang.org/x/sys/windows" "strings" - "unsafe" + "syscall" ) const fullAccess = windows.PROCESS_VM_OPERATION | windows.PROCESS_VM_WRITE | windows.PROCESS_VM_READ @@ -34,21 +34,28 @@ func ASMInjectorInit(pid uint32) error { return fmt.Errorf("error getting process modules: %w", err) } + _, err = syscall.LoadLibrary("USER32.dll") + if err != nil { + return fmt.Errorf("error loading USER32.dll: %w", err) + } + for _, module := range modules { // GetCursorPos if strings.EqualFold(module.ModuleName, "USER32.dll") { - getCursorPosAddr = uintptr(unsafe.Pointer(module.ModuleBaseAddress)) + 0x2A440 + getCursorPosAddr, err = syscall.GetProcAddress(module.ModuleHandle, "GetCursorPos") + getKeyStateAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "GetKeyState") + trackMouseEventAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "TrackMouseEvent") + err = windows.ReadProcessMemory(handle, getCursorPosAddr, &getCursorPosOrigBytes[0], uintptr(len(getCursorPosOrigBytes)), nil) if err != nil { return fmt.Errorf("error reading memory: %w", err) } - err = hookTrackMouseEvent(uintptr(unsafe.Pointer(module.ModuleBaseAddress))) + err = hookTrackMouseEvent() if err != nil { return err } - getKeyStateAddr = uintptr(unsafe.Pointer(module.ModuleBaseAddress)) + 0x24E50 err = windows.ReadProcessMemory(handle, getKeyStateAddr, &getKeyStateOrigBytes[0], uintptr(len(getKeyStateOrigBytes)), nil) if err != nil { return fmt.Errorf("error reading memory: %w", err) @@ -121,8 +128,7 @@ func RestoreGetCursorPosAddr() error { return windows.WriteProcessMemory(handle, getCursorPosAddr, &getCursorPosOrigBytes[0], uintptr(len(getCursorPosOrigBytes)), nil) } -func hookTrackMouseEvent(baseAddr uintptr) error { - trackMouseEventAddr = baseAddr + 0x2EB10 +func hookTrackMouseEvent() error { err := windows.ReadProcessMemory(handle, trackMouseEventAddr, &trackMouseEventBytes[0], uintptr(len(trackMouseEventBytes)), nil) if err != nil { return err From b9bcfd9a4313f66be073f9e3317494c62d16dfed Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Sun, 4 Feb 2024 15:40:16 +0900 Subject: [PATCH 007/548] fix quest memory positions --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 3a01fbb1d..b7f8f11b7 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/beefsack/go-astar v0.0.0-20200827232313-4ecf9e304482 github.com/bwmarrin/discordgo v0.27.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 - github.com/hectorgimenez/d2go v0.0.0-20240202111944-db8fc7d6db77 + github.com/hectorgimenez/d2go v0.0.0-20240204054823-23600ecb0a6f github.com/lxn/win v0.0.0-20210218163916-a377121e959e github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9 go.uber.org/zap v1.26.0 diff --git a/go.sum b/go.sum index b11f8aeba..99fef4231 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,8 @@ github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/hectorgimenez/d2go v0.0.0-20240202111944-db8fc7d6db77 h1:HZBioMz0Ez5oeNnXcOPJ2/o1UMqqhqEQZC1XLR7kMjk= -github.com/hectorgimenez/d2go v0.0.0-20240202111944-db8fc7d6db77/go.mod h1:QXuKJYL7/gh0dnwHu/f8bqEWDAOy1QP51RV1I0mjUKM= +github.com/hectorgimenez/d2go v0.0.0-20240204054823-23600ecb0a6f h1:AEyTnBYVnxiGQEkYUDUeufrL83+SzRaMj/GKLSPPfrE= +github.com/hectorgimenez/d2go v0.0.0-20240204054823-23600ecb0a6f/go.mod h1:QXuKJYL7/gh0dnwHu/f8bqEWDAOy1QP51RV1I0mjUKM= github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc= github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= From b81bec1454c027a723ed0539e60a2385716fb1c8 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Sun, 4 Feb 2024 21:58:56 +0900 Subject: [PATCH 008/548] use kb to move character --- internal/hid/mouse.go | 4 ++++ internal/pather/path_finder.go | 22 ++++++++++++++-------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/internal/hid/mouse.go b/internal/hid/mouse.go index cc522a8ba..fc5898f17 100644 --- a/internal/hid/mouse.go +++ b/internal/hid/mouse.go @@ -44,6 +44,10 @@ func MovePointer(x, y int) { win.PostMessage(memory.HWND, win.WM_MOUSEMOVE, 0, lParam) } +func RestoreCursorPosition() { + memory.RestoreGetCursorPosAddr() +} + type Changeable interface { Set(x, y int, c color.Color) } diff --git a/internal/pather/path_finder.go b/internal/pather/path_finder.go index 906b5bdc7..8111f3485 100644 --- a/internal/pather/path_finder.go +++ b/internal/pather/path_finder.go @@ -1,9 +1,6 @@ package pather import ( - "math" - "math/rand" - "github.com/beefsack/go-astar" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" @@ -11,6 +8,8 @@ import ( "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/reader" + "math" + "math/rand" ) func GetPath(d data.Data, to data.Position, blacklistedCoords ...[2]int) (path *Pather, distance int, found bool) { @@ -199,11 +198,18 @@ func MoveThroughPath(p *Pather, distance int, teleport bool) { } if distance > 0 { - if teleport { - hid.Click(hid.RightButton, screenX, screenY) - } else { - hid.Click(hid.LeftButton, screenX, screenY) - } + moveCharacter(teleport, screenX, screenY) + } +} + +func moveCharacter(teleport bool, x, y int) { + if teleport { + hid.Click(hid.RightButton, x, y) + } else { + hid.MovePointer(x, y) + hid.PressKey(config.Config.Bindings.ForceMove) + helper.Sleep(50) + hid.RestoreCursorPosition() } } From e4aa9289d2a7d8cf17c09e122ba51b0576dcd3cd Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Sun, 11 Feb 2024 22:06:06 +0900 Subject: [PATCH 009/548] small dll to disable some window events to propagate --- KooloDll.dll | Bin 0 -> 10752 bytes build.bat | 1 + cmd/koolo/main.go | 13 ++++- internal/helper/winproc/kernel32.go | 5 ++ internal/helper/winproc/user32.go | 7 +-- internal/hid/mouse.go | 19 +++---- internal/memory/dll_injector.go | 75 ++++++++++++++++++++++++++++ internal/memory/hooks_asm.go | 37 +------------- internal/pather/path_finder.go | 1 - 9 files changed, 105 insertions(+), 53 deletions(-) create mode 100644 KooloDll.dll create mode 100644 internal/memory/dll_injector.go diff --git a/KooloDll.dll b/KooloDll.dll new file mode 100644 index 0000000000000000000000000000000000000000..b1a623fe1d7faa71150cbc6ea12dc77c416621b2 GIT binary patch literal 10752 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 z

!+tyLk*KkWdg*qSa9wS%aG=&2m0#4`PyMPY@HZ(dLGueAq=dO6|0r$fBPkylQ zUOIVeRyN}|f}NsQiZp*W81x67et&bv?G?=pqF?kx#LG;4EZzorD&$+Lv<5hC*q!T| zT=dQQ7#yg5%eJ)#z-GrV_U(Wvo~^9xvOPMlgJHvH-^NRQ^ex(U8|fi#StaR}m3iB? zSjnDS8c(t0`=Gi<=u4NXlUX$A~o2SWzX7QRdxsKU9 zO|BEXPBD{^E>wqFO-q0DBg}zv!Q!Db2*v;A>Ms zHY;dFZOUQ=7^9#(KV-6U@YxAwHTAJflF|H-$#TmxL%Kb%rGjIYEAv7$YqFmT!GnmE zRB<6jI(WvOnZbJuyhp$rnZawoeV`vainCOCl@cAFqGrQy??bvj7PEC8zkic2&>Gxb z9}apqvHj_dqNFoi!NB%q|zB7Z{v?DBfTES$w>9C}6Pec;io8X}82qqvB#tx;| zVwv>?YIGqi1gNkd!Xl@*ExLWX7*1L8-I|8GYFw$9TTQX!4Z&yMmOs=3sW0e%sQg^H zbNBM2ZU3ylqEH*+l7Ycq=ruCbA$XA{INZd&)D_2ztjDV2Yej082B;3H&M%g z)BT>uord@XZ^wP20(d20A8H41f)@+$^#(Zo@60m1KYR}SR=^fi9(O;2<#?Z%2fPCC zY19JX&j2>z{h}CnC*b3RL-z^5e=+bez1Upchp!>gH zOxn92T+}(cZ`|j=DEkUNet2X8+URcmz-%RrTD_*D-Ouk5!x0=&RZEwbmM!JQfH&Cc z3v91ix}j-(N##;LBH?=A@#8?PTDnJ!EM0SlId`=u5)s?C`S4~(L?pnT-$5G^K!);>Y%+aW;KTGum;wxz3i#%r}CdFeCkiyOaE^t|KH=0p~C NUL || goto :error xcopy /q /E /I /y config\pickit build\config\pickit > NUL || goto :error xcopy /q /E /I /y config\pickit_leveling build\config\pickit_leveling > NUL || goto :error xcopy /q /y koolo-map.exe build > NUL || goto :error +xcopy /q /y KooloDll.dll build > NUL || goto :error xcopy /q /y README.md build > NUL || goto :error echo Done! Artifacts are in build directory. diff --git a/cmd/koolo/main.go b/cmd/koolo/main.go index 14f9412b6..7719fae7d 100644 --- a/cmd/koolo/main.go +++ b/cmd/koolo/main.go @@ -58,7 +58,18 @@ func main() { if err != nil { logger.Fatal("Error initializing ASMInjector", zap.Error(err)) } - defer asm.ASMInjectorUnload() + logger.Debug("Injecting KooloDll.dll") + err = asm.InjectDLLs() + if err != nil { + logger.Fatal("Error injecting KooloDll.dll", zap.Error(err)) + } + + defer func() { + logger.Debug("Unloading memory injector") + asm.ASMInjectorUnload() + logger.Debug("Unloading KooloDll.dll") + asm.UnloadDll(uint32(process.GetPID())) + }() // Prevent screen from turning off winproc.SetThreadExecutionState.Call(winproc.EXECUTION_STATE_ES_DISPLAY_REQUIRED | winproc.EXECUTION_STATE_ES_CONTINUOUS) diff --git a/internal/helper/winproc/kernel32.go b/internal/helper/winproc/kernel32.go index 24dad312d..cb8196be8 100644 --- a/internal/helper/winproc/kernel32.go +++ b/internal/helper/winproc/kernel32.go @@ -10,4 +10,9 @@ const ( var ( KERNEL32 = windows.NewLazySystemDLL("kernel32.dll") SetThreadExecutionState = KERNEL32.NewProc("SetThreadExecutionState") + VirtualAllocEx = KERNEL32.NewProc("VirtualAllocEx") + LoadLibraryA = KERNEL32.NewProc("LoadLibraryA") + CreateRemoteThread = KERNEL32.NewProc("CreateRemoteThread") + GetExitCodeThread = KERNEL32.NewProc("GetExitCodeThread") + FreeLibrary = KERNEL32.NewProc("FreeLibrary") ) diff --git a/internal/helper/winproc/user32.go b/internal/helper/winproc/user32.go index 29b01ba65..dbf62e01a 100644 --- a/internal/helper/winproc/user32.go +++ b/internal/helper/winproc/user32.go @@ -3,7 +3,8 @@ package winproc import "golang.org/x/sys/windows" var ( - USER32 = windows.NewLazySystemDLL("user32.dll") - PrintWindow = USER32.NewProc("PrintWindow") - GetWindowDC = USER32.NewProc("GetWindowDC") + USER32 = windows.NewLazySystemDLL("user32.dll") + PrintWindow = USER32.NewProc("PrintWindow") + GetWindowDC = USER32.NewProc("GetWindowDC") + SetWindowLongPtrW = USER32.NewProc("SetWindowLongPtrW") ) diff --git a/internal/hid/mouse.go b/internal/hid/mouse.go index fc5898f17..c9ffbc130 100644 --- a/internal/hid/mouse.go +++ b/internal/hid/mouse.go @@ -39,13 +39,9 @@ func MovePointer(x, y int) { memory.InjectCursorPos(x, y) lParam := calculateLparam(x, y) - win.SendMessage(memory.HWND, win.WM_NCHITTEST, 0, lParam) - win.SendMessage(memory.HWND, win.WM_SETCURSOR, 0x000105A8, 0x2010001) - win.PostMessage(memory.HWND, win.WM_MOUSEMOVE, 0, lParam) -} - -func RestoreCursorPosition() { - memory.RestoreGetCursorPosAddr() + win.SendMessage(memory.HWND, win.WM_NCHITTEST+1000, 0, lParam) + win.SendMessage(memory.HWND, win.WM_SETCURSOR+1000, 0x000105A8, 0x2010001) + win.PostMessage(memory.HWND, win.WM_MOUSEMOVE+1000, 0, lParam) } type Changeable interface { @@ -63,18 +59,17 @@ func Click(btn MouseButton, x, y int) { y = int(float64(y) * scale) lParam := calculateLparam(x, y) - buttonDown := uint32(win.WM_LBUTTONDOWN) - buttonUp := uint32(win.WM_LBUTTONUP) + buttonDown := uint32(win.WM_LBUTTONDOWN + 1000) + buttonUp := uint32(win.WM_LBUTTONUP + 1000) if btn == RightButton { - buttonDown = win.WM_RBUTTONDOWN - buttonUp = win.WM_RBUTTONUP + buttonDown = win.WM_RBUTTONDOWN + 1000 + buttonUp = win.WM_RBUTTONUP + 1000 } win.SendMessage(memory.HWND, buttonDown, 1, lParam) sleepTime := rand.Intn(keyPressMaxTime-keyPressMinTime) + keyPressMinTime time.Sleep(time.Duration(sleepTime) * time.Millisecond) win.SendMessage(memory.HWND, buttonUp, 1, lParam) - memory.RestoreGetCursorPosAddr() } func ClickWithModifier(btn MouseButton, x, y int, modifier ModifierKey) { diff --git a/internal/memory/dll_injector.go b/internal/memory/dll_injector.go new file mode 100644 index 000000000..a9852efb8 --- /dev/null +++ b/internal/memory/dll_injector.go @@ -0,0 +1,75 @@ +package memory + +import ( + "fmt" + "github.com/hectorgimenez/koolo/internal/helper/winproc" + "github.com/winlabs/gowin32" + "golang.org/x/sys/windows" + "os" + "strings" + "syscall" +) + +func InjectDLLs() error { + dir, _ := os.Getwd() + dllPath := dir + "\\" + "KooloDll.dll" + + lpAddress, _, err := winproc.VirtualAllocEx.Call( + uintptr(handle), + 0, + uintptr(len(dllPath))+1, + uintptr(windows.MEM_COMMIT|windows.MEM_RESERVE), + uintptr(windows.PAGE_READWRITE), + ) + if err != nil && err != syscall.Errno(0) { + return err + } + + dst := uintptr(0) + data := []byte(dllPath + "\x00") + err = windows.WriteProcessMemory(handle, lpAddress, &data[0], uintptr(len(dllPath))+1, &dst) + if err != nil { + return err + } + + threadHandle, _, err := winproc.CreateRemoteThread.Call( + uintptr(handle), + 0, + 0, + winproc.LoadLibraryA.Addr(), + lpAddress, + 0, + 0, + ) + if threadHandle == 0 { + return err + } + + return nil +} + +func UnloadDll(pid uint32) error { + modules, err := gowin32.GetProcessModules(pid) + if err != nil { + return fmt.Errorf("error getting process modules: %w", err) + } + + for _, module := range modules { + if strings.EqualFold(module.ModuleName, "KooloDll.dll") { + threadHandle, _, err := winproc.CreateRemoteThread.Call( + uintptr(handle), + 0, + 0, + winproc.FreeLibrary.Addr(), + uintptr(module.ModuleHandle), + 0, + 0, + ) + if threadHandle == 0 { + return err + } + } + } + + return nil +} diff --git a/internal/memory/hooks_asm.go b/internal/memory/hooks_asm.go index b2178eb5f..3b8851d12 100644 --- a/internal/memory/hooks_asm.go +++ b/internal/memory/hooks_asm.go @@ -17,8 +17,6 @@ var handle windows.Handle var HWND win.HWND var getCursorPosAddr uintptr var getCursorPosOrigBytes [32]byte -var trackMouseEventAddr uintptr -var trackMouseEventBytes [32]byte var getKeyStateAddr uintptr var getKeyStateOrigBytes [18]byte @@ -44,18 +42,12 @@ func ASMInjectorInit(pid uint32) error { if strings.EqualFold(module.ModuleName, "USER32.dll") { getCursorPosAddr, err = syscall.GetProcAddress(module.ModuleHandle, "GetCursorPos") getKeyStateAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "GetKeyState") - trackMouseEventAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "TrackMouseEvent") err = windows.ReadProcessMemory(handle, getCursorPosAddr, &getCursorPosOrigBytes[0], uintptr(len(getCursorPosOrigBytes)), nil) if err != nil { return fmt.Errorf("error reading memory: %w", err) } - err = hookTrackMouseEvent() - if err != nil { - return err - } - err = windows.ReadProcessMemory(handle, getKeyStateAddr, &getKeyStateOrigBytes[0], uintptr(len(getKeyStateOrigBytes)), nil) if err != nil { return fmt.Errorf("error reading memory: %w", err) @@ -75,17 +67,12 @@ func ASMInjectorUnload() error { return fmt.Errorf("error writing to memory: %w", err) } - err = windows.WriteProcessMemory(handle, trackMouseEventAddr, &trackMouseEventBytes[0], uintptr(len(trackMouseEventBytes)), nil) - if err != nil { - return fmt.Errorf("error writing to memory: %w", err) - } - err = RestoreGetKeyState() if err != nil { return err } - return windows.CloseHandle(handle) + return nil } func InjectCursorPos(x, y int) error { @@ -127,25 +114,3 @@ func RestoreGetKeyState() error { func RestoreGetCursorPosAddr() error { return windows.WriteProcessMemory(handle, getCursorPosAddr, &getCursorPosOrigBytes[0], uintptr(len(getCursorPosOrigBytes)), nil) } - -func hookTrackMouseEvent() error { - err := windows.ReadProcessMemory(handle, trackMouseEventAddr, &trackMouseEventBytes[0], uintptr(len(trackMouseEventBytes)), nil) - if err != nil { - return err - } - - // and dword ptr [rcx+4], 0xFFFFFFFD - // Modify TRACKMOUSEEVENT struct to disable mouse leave events, since we are injecting our events even if the mouse is not over the window - disableMouseLeaveRequest := []byte{0x81, 0x61, 0x04, 0xFD, 0xFF, 0xFF, 0xFF} - - // We need to move back the pointer 7 bytes to get the correct position, since we are injecting 7 bytes in front of it - num := int32(binary.LittleEndian.Uint32(trackMouseEventBytes[2:6])) - num -= 7 - numberBytes := make([]byte, 4) - binary.LittleEndian.PutUint32(numberBytes, uint32(num)) - injectBytes := append(trackMouseEventBytes[0:2], numberBytes...) - - hook := append(disableMouseLeaveRequest, injectBytes...) - - return windows.WriteProcessMemory(handle, trackMouseEventAddr, &hook[0], uintptr(len(hook)), nil) -} diff --git a/internal/pather/path_finder.go b/internal/pather/path_finder.go index 8111f3485..92be7c673 100644 --- a/internal/pather/path_finder.go +++ b/internal/pather/path_finder.go @@ -209,7 +209,6 @@ func moveCharacter(teleport bool, x, y int) { hid.MovePointer(x, y) hid.PressKey(config.Config.Bindings.ForceMove) helper.Sleep(50) - hid.RestoreCursorPosition() } } From f1feb007332fab3809027ea74431917a6e0c985f Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Mon, 12 Feb 2024 10:10:17 +0900 Subject: [PATCH 010/548] restore previous approach, more hacky but has better compatibility? --- KooloDll.dll | Bin 10752 -> 0 bytes build.bat | 1 - cmd/koolo/main.go | 18 ++--- go.mod | 8 +- go.sum | 12 +-- internal/helper/winproc/kernel32.go | 5 -- internal/helper/winproc/user32.go | 7 +- internal/hid/mouse.go | 14 ++-- internal/memory/dll_injector.go | 75 ------------------ .../memory/{hooks_asm.go => injection.go} | 43 +++++++++- 10 files changed, 67 insertions(+), 116 deletions(-) delete mode 100644 KooloDll.dll delete mode 100644 internal/memory/dll_injector.go rename internal/memory/{hooks_asm.go => injection.go} (66%) diff --git a/KooloDll.dll b/KooloDll.dll deleted file mode 100644 index b1a623fe1d7faa71150cbc6ea12dc77c416621b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10752 zcmeHN3vgRidOos!{fr_5R&c`WCdkAA>^hcVorj5>$lc-zM_mXn^+xc<0@Xe0#7}EH#^RZARCn z<>wFWZ2akXs(NoJ9p3@kKl;j;4*SMhH2V11HVwWy<^x=O%PV6+z@3e+jNc8&jlQ7C zbE9j=@7L(p#t1g}ygR7x)J*DY7;F7rChOWcB&K*%Yzd#2HvcA;56-nZ_x%Duq8aNn z(Ub5r#xe;Rq7^*Y%c*e44(sPtbC9y*Sufu`|nM~D~2QaPh7`-&y>XAH*{p&oiz+m%H z$u~2K14EbUVyuT8Q-%s(u_dT8ii5HK(vU8w%@GVuE)@)hEZC0Ha3t&nt@#AL(d2G2 z1PtKNK!ce|HKQey2yRX0R- zuXZK4w|}Fm)s`2#*dvILYWZ+y4`6NjkopVxWQhqHk~5~5q%|=mO z=Bu$_&ct69ey*wqK2_2gbH!aYzD_>vw5&f_E1y@b96A$Xrz(^7ehu^-1Y-*-Gkx>r zYsY{EjGa9T{}gwRO6y~vnxd^j!nzN(*@soD6Z=Mpb0tLp-ThK6JoWs4sp<(#RTbnR z)q0ICPym5G+J~54aS}fH48bmR4@+0OWbR|&bM4u7UGgEUx@Fs@zopQ5MGc!a>*ashm|+bNmsw6 zYY2);9mm+Av4c*V!|{?SRyA-Vn3nF>@f_ry2SHv?9)VC-zjU|qw>h9jGw`^C2RwTk zlNS=^mjRSF^BC*yk1kVg)5UqTKc=_K)cy?G2f1c+iU4Gea`n&|<*_VaU21fVG677G z$AnlVlWbTF<$`9WROpi5I6(@v@|%L3?vl+5&{?(mmdZu1Gdw?;hDel~ZDoQi*(wEj zpG|--`0D$T$I&ZO9>TK+3#0jE6P!`zICM$oZi9Yz|9-Qs?0`y{JE;!Exogp&*fB%R zGkmP-*(ESKYFF;W%#>eZ&6L-(8H*J?2tLC!&cjywsN>MjlwWHrG^Y7gPEP*4ZopM! zK+jo0J|)CA^RBp~FkX+f5wbUK(iX>2D^JOvVtKkpqm~ucCvcwa&$9Pl`~cl2)~c~j zOuK6Ynd>scM{sfOpwm`HD>GT3TC>2E$Kv212)cd(E<7gx9PUz%exa((|p zn_{XddOJEThnjtq)P9OKq5F4;DCIP^2L{g52bSiiWK?Sp&X#Uf;$mug)Ny&l@);va z%b@ud#K`2F#AXwsvTU*-C97KN(5BlknQ4EUT4ijuW?KhV!cl#n`@Upq&9qpih2v}G zPvn0SkL)uY*Iw4sx#nqqQ95h7GI_vBiY@`)Owl zkmg_p>|i1^FN8 zoVKeqi2p>Btpz?*t`l%|M!#I%`%cNDw*Xs}j7maG%*QBo`KtAMno%{_ z7d2C=wG))wFDxg#Nyig)g*v^O=$b;PO$h@NykG}zubC3;1Hy5nauoD_BMAHSP=dud z0PhbJq6v{wFMK=#@*^U#@9#~*WltkVBLaQ^_aj#%%nyUU_%1fIkl-E#4jBXDd{Hi7 z7$KHzQ{L5)H1t!P)XpB|aVWuwi$y`sC@Q1Xl!fd`PFOW071;Zy1k3a07CI0n`|@LT0nBq)EZg#+AY|Uq(tIai{bt2_cydvk)gf2c! zIrb-d@0{|aCQ7HUKF@~@`r=^?!8t!1&3c1d2yK%RqRdQv8gnjC+H@iZ9@+|Y^1aIw z)bm1T)dY4ZlgFdmW0y?3cPhVt)3I{J-ET*2u;Ypw@^L)1(l{q%tq^d1y-_vIlOw5_Nvj5fJ$Ica(6o&q6uvQS8W%kolnrjVG| z=}OEyEyN3KwX5Ee3gtha=UO!o&Xw0@rw_PR^@owzP8LtTV;>c8*id8?#P-_QUl5jy zILri0)55Yasr%^AxN-)LwU5Ftd0lTuvxL90_9BVVT5dIDI;*}94m&h1Wps^3=P4gR z0q5ccfYgL3rV`vR#FDY1BP5;F&f^V2;yIh+GfeTo`~7f=JZ@y&yEL~;8SK{HkRckgy6+JhRm=O`2g%MpERZ1U8aS9+ za9r10anS*6qExS151})84Cxa`20Fy`OGqGr0TEPdl`)b-weAFp&@*F~N!bY@T^Z00 zJbTSLPA|QQqIdmq3&sI(CyNS$(Ax@btA{i+&EGK@I6UnW~8-OmI6@%Q_EA`{r z88;6DwVb$6V2M3I9mUNrfblZ2D2reB4|>}*kv)*OHWESirV(M_m%NZSB4C0%T^#r& z$(70ICYjq0>DW;AAQu2ap&sY_z^Z?jZ34r^UXSThXD%>m}=i_&^-nW8Sw0! ze#(q-3JfS1aLkZ@!+?DTe9nL$889{8!E5#Jd@0y}y-rWefhqaN4StILpTeFpeY~>e z#`i{}LmX4Hij(=6hizki7GylD#otQ61}3ryi?T5OMCN4@o~>FB4oY9&L^150+jaJ0 z-Tp!Y&TZGy>6e(_Aj3A>pQ(}Z4f}Wl78|h4fRzR$`P8>!BoekBwb_P>3{EB0HV-&` z7Cnl#qjTEu#>)gK_o1zCP8&Wz{80;;lh&EmSqR%`YdHalC*zWlwE&;PQGbM2*Vj<@ z
!+tyLk*KkWdg*qSa9wS%aG=&2m0#4`PyMPY@HZ(dLGueAq=dO6|0r$fBPkylQ zUOIVeRyN}|f}NsQiZp*W81x67et&bv?G?=pqF?kx#LG;4EZzorD&$+Lv<5hC*q!T| zT=dQQ7#yg5%eJ)#z-GrV_U(Wvo~^9xvOPMlgJHvH-^NRQ^ex(U8|fi#StaR}m3iB? zSjnDS8c(t0`=Gi<=u4NXlUX$A~o2SWzX7QRdxsKU9 zO|BEXPBD{^E>wqFO-q0DBg}zv!Q!Db2*v;A>Ms zHY;dFZOUQ=7^9#(KV-6U@YxAwHTAJflF|H-$#TmxL%Kb%rGjIYEAv7$YqFmT!GnmE zRB<6jI(WvOnZbJuyhp$rnZawoeV`vainCOCl@cAFqGrQy??bvj7PEC8zkic2&>Gxb z9}apqvHj_dqNFoi!NB%q|zB7Z{v?DBfTES$w>9C}6Pec;io8X}82qqvB#tx;| zVwv>?YIGqi1gNkd!Xl@*ExLWX7*1L8-I|8GYFw$9TTQX!4Z&yMmOs=3sW0e%sQg^H zbNBM2ZU3ylqEH*+l7Ycq=ruCbA$XA{INZd&)D_2ztjDV2Yej082B;3H&M%g z)BT>uord@XZ^wP20(d20A8H41f)@+$^#(Zo@60m1KYR}SR=^fi9(O;2<#?Z%2fPCC zY19JX&j2>z{h}CnC*b3RL-z^5e=+bez1Upchp!>gH zOxn92T+}(cZ`|j=DEkUNet2X8+URcmz-%RrTD_*D-Ouk5!x0=&RZEwbmM!JQfH&Cc z3v91ix}j-(N##;LBH?=A@#8?PTDnJ!EM0SlId`=u5)s?C`S4~(L?pnT-$5G^K!);>Y%+aW;KTGum;wxz3i#%r}CdFeCkiyOaE^t|KH=0p~C NUL || goto :error xcopy /q /E /I /y config\pickit build\config\pickit > NUL || goto :error xcopy /q /E /I /y config\pickit_leveling build\config\pickit_leveling > NUL || goto :error xcopy /q /y koolo-map.exe build > NUL || goto :error -xcopy /q /y KooloDll.dll build > NUL || goto :error xcopy /q /y README.md build > NUL || goto :error echo Done! Artifacts are in build directory. diff --git a/cmd/koolo/main.go b/cmd/koolo/main.go index 7719fae7d..a6d217582 100644 --- a/cmd/koolo/main.go +++ b/cmd/koolo/main.go @@ -54,21 +54,17 @@ func main() { if err != nil { logger.Fatal("Error finding D2R.exe process", zap.Error(err)) } - err = asm.ASMInjectorInit(uint32(process.GetPID())) + err = asm.InjectorInit(uint32(process.GetPID())) if err != nil { - logger.Fatal("Error initializing ASMInjector", zap.Error(err)) - } - logger.Debug("Injecting KooloDll.dll") - err = asm.InjectDLLs() - if err != nil { - logger.Fatal("Error injecting KooloDll.dll", zap.Error(err)) + logger.Fatal("Error preparing memory injection", zap.Error(err)) } defer func() { - logger.Debug("Unloading memory injector") - asm.ASMInjectorUnload() - logger.Debug("Unloading KooloDll.dll") - asm.UnloadDll(uint32(process.GetPID())) + logger.Debug("Restoring game memory...") + err = asm.InjectorUnload() + if err != nil { + logger.Error("Error restoring game memory, if client didn't crash yet, consider restarting it", zap.Error(err)) + } }() // Prevent screen from turning off diff --git a/go.mod b/go.mod index b7f8f11b7..ecaa36ee2 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/hectorgimenez/koolo -go 1.21 +go 1.22 require ( github.com/beefsack/go-astar v0.0.0-20200827232313-4ecf9e304482 @@ -11,13 +11,13 @@ require ( github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9 go.uber.org/zap v1.26.0 golang.org/x/sync v0.6.0 - golang.org/x/sys v0.16.0 + golang.org/x/sys v0.17.0 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/gorilla/websocket v1.5.1 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.18.0 // indirect - golang.org/x/net v0.20.0 // indirect + golang.org/x/crypto v0.19.0 // indirect + golang.org/x/net v0.21.0 // indirect ) diff --git a/go.sum b/go.sum index 99fef4231..816459911 100644 --- a/go.sum +++ b/go.sum @@ -26,17 +26,17 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= -golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/internal/helper/winproc/kernel32.go b/internal/helper/winproc/kernel32.go index cb8196be8..24dad312d 100644 --- a/internal/helper/winproc/kernel32.go +++ b/internal/helper/winproc/kernel32.go @@ -10,9 +10,4 @@ const ( var ( KERNEL32 = windows.NewLazySystemDLL("kernel32.dll") SetThreadExecutionState = KERNEL32.NewProc("SetThreadExecutionState") - VirtualAllocEx = KERNEL32.NewProc("VirtualAllocEx") - LoadLibraryA = KERNEL32.NewProc("LoadLibraryA") - CreateRemoteThread = KERNEL32.NewProc("CreateRemoteThread") - GetExitCodeThread = KERNEL32.NewProc("GetExitCodeThread") - FreeLibrary = KERNEL32.NewProc("FreeLibrary") ) diff --git a/internal/helper/winproc/user32.go b/internal/helper/winproc/user32.go index dbf62e01a..29b01ba65 100644 --- a/internal/helper/winproc/user32.go +++ b/internal/helper/winproc/user32.go @@ -3,8 +3,7 @@ package winproc import "golang.org/x/sys/windows" var ( - USER32 = windows.NewLazySystemDLL("user32.dll") - PrintWindow = USER32.NewProc("PrintWindow") - GetWindowDC = USER32.NewProc("GetWindowDC") - SetWindowLongPtrW = USER32.NewProc("SetWindowLongPtrW") + USER32 = windows.NewLazySystemDLL("user32.dll") + PrintWindow = USER32.NewProc("PrintWindow") + GetWindowDC = USER32.NewProc("GetWindowDC") ) diff --git a/internal/hid/mouse.go b/internal/hid/mouse.go index c9ffbc130..5c8ae23d0 100644 --- a/internal/hid/mouse.go +++ b/internal/hid/mouse.go @@ -39,9 +39,9 @@ func MovePointer(x, y int) { memory.InjectCursorPos(x, y) lParam := calculateLparam(x, y) - win.SendMessage(memory.HWND, win.WM_NCHITTEST+1000, 0, lParam) - win.SendMessage(memory.HWND, win.WM_SETCURSOR+1000, 0x000105A8, 0x2010001) - win.PostMessage(memory.HWND, win.WM_MOUSEMOVE+1000, 0, lParam) + win.SendMessage(memory.HWND, win.WM_NCHITTEST, 0, lParam) + win.SendMessage(memory.HWND, win.WM_SETCURSOR, 0x000105A8, 0x2010001) + win.PostMessage(memory.HWND, win.WM_MOUSEMOVE, 0, lParam) } type Changeable interface { @@ -59,11 +59,11 @@ func Click(btn MouseButton, x, y int) { y = int(float64(y) * scale) lParam := calculateLparam(x, y) - buttonDown := uint32(win.WM_LBUTTONDOWN + 1000) - buttonUp := uint32(win.WM_LBUTTONUP + 1000) + buttonDown := uint32(win.WM_LBUTTONDOWN) + buttonUp := uint32(win.WM_LBUTTONUP) if btn == RightButton { - buttonDown = win.WM_RBUTTONDOWN + 1000 - buttonUp = win.WM_RBUTTONUP + 1000 + buttonDown = win.WM_RBUTTONDOWN + buttonUp = win.WM_RBUTTONUP } win.SendMessage(memory.HWND, buttonDown, 1, lParam) diff --git a/internal/memory/dll_injector.go b/internal/memory/dll_injector.go deleted file mode 100644 index a9852efb8..000000000 --- a/internal/memory/dll_injector.go +++ /dev/null @@ -1,75 +0,0 @@ -package memory - -import ( - "fmt" - "github.com/hectorgimenez/koolo/internal/helper/winproc" - "github.com/winlabs/gowin32" - "golang.org/x/sys/windows" - "os" - "strings" - "syscall" -) - -func InjectDLLs() error { - dir, _ := os.Getwd() - dllPath := dir + "\\" + "KooloDll.dll" - - lpAddress, _, err := winproc.VirtualAllocEx.Call( - uintptr(handle), - 0, - uintptr(len(dllPath))+1, - uintptr(windows.MEM_COMMIT|windows.MEM_RESERVE), - uintptr(windows.PAGE_READWRITE), - ) - if err != nil && err != syscall.Errno(0) { - return err - } - - dst := uintptr(0) - data := []byte(dllPath + "\x00") - err = windows.WriteProcessMemory(handle, lpAddress, &data[0], uintptr(len(dllPath))+1, &dst) - if err != nil { - return err - } - - threadHandle, _, err := winproc.CreateRemoteThread.Call( - uintptr(handle), - 0, - 0, - winproc.LoadLibraryA.Addr(), - lpAddress, - 0, - 0, - ) - if threadHandle == 0 { - return err - } - - return nil -} - -func UnloadDll(pid uint32) error { - modules, err := gowin32.GetProcessModules(pid) - if err != nil { - return fmt.Errorf("error getting process modules: %w", err) - } - - for _, module := range modules { - if strings.EqualFold(module.ModuleName, "KooloDll.dll") { - threadHandle, _, err := winproc.CreateRemoteThread.Call( - uintptr(handle), - 0, - 0, - winproc.FreeLibrary.Addr(), - uintptr(module.ModuleHandle), - 0, - 0, - ) - if threadHandle == 0 { - return err - } - } - } - - return nil -} diff --git a/internal/memory/hooks_asm.go b/internal/memory/injection.go similarity index 66% rename from internal/memory/hooks_asm.go rename to internal/memory/injection.go index 3b8851d12..3abb36e87 100644 --- a/internal/memory/hooks_asm.go +++ b/internal/memory/injection.go @@ -1,6 +1,7 @@ package memory import ( + "bytes" "encoding/binary" "errors" "fmt" @@ -17,10 +18,12 @@ var handle windows.Handle var HWND win.HWND var getCursorPosAddr uintptr var getCursorPosOrigBytes [32]byte +var trackMouseEventAddr uintptr +var trackMouseEventBytes [32]byte var getKeyStateAddr uintptr var getKeyStateOrigBytes [18]byte -func ASMInjectorInit(pid uint32) error { +func InjectorInit(pid uint32) error { pHandle, err := windows.OpenProcess(fullAccess, false, pid) if err != nil { return fmt.Errorf("error opening process: %w", err) @@ -42,12 +45,18 @@ func ASMInjectorInit(pid uint32) error { if strings.EqualFold(module.ModuleName, "USER32.dll") { getCursorPosAddr, err = syscall.GetProcAddress(module.ModuleHandle, "GetCursorPos") getKeyStateAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "GetKeyState") + trackMouseEventAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "TrackMouseEvent") err = windows.ReadProcessMemory(handle, getCursorPosAddr, &getCursorPosOrigBytes[0], uintptr(len(getCursorPosOrigBytes)), nil) if err != nil { return fmt.Errorf("error reading memory: %w", err) } + err = stopTrackingMouseLeaveEvents() + if err != nil { + return err + } + err = windows.ReadProcessMemory(handle, getKeyStateAddr, &getKeyStateOrigBytes[0], uintptr(len(getKeyStateOrigBytes)), nil) if err != nil { return fmt.Errorf("error reading memory: %w", err) @@ -61,7 +70,7 @@ func ASMInjectorInit(pid uint32) error { return nil } -func ASMInjectorUnload() error { +func InjectorUnload() error { err := RestoreGetCursorPosAddr() if err != nil { return fmt.Errorf("error writing to memory: %w", err) @@ -72,7 +81,7 @@ func ASMInjectorUnload() error { return err } - return nil + return windows.CloseHandle(handle) } func InjectCursorPos(x, y int) error { @@ -114,3 +123,31 @@ func RestoreGetKeyState() error { func RestoreGetCursorPosAddr() error { return windows.WriteProcessMemory(handle, getCursorPosAddr, &getCursorPosOrigBytes[0], uintptr(len(getCursorPosOrigBytes)), nil) } + +// This is needed in order to let the game keep processing mouse events even if the mouse is not over the window +func stopTrackingMouseLeaveEvents() error { + err := windows.ReadProcessMemory(handle, trackMouseEventAddr, &trackMouseEventBytes[0], uintptr(len(trackMouseEventBytes)), nil) + if err != nil { + return err + } + + // and dword ptr [rcx+4], 0xFFFFFFFD + // Modify TRACKMOUSEEVENT struct to disable mouse leave events, since we are injecting our events even if the mouse is not over the window + disableMouseLeaveRequest := []byte{0x81, 0x61, 0x04, 0xFD, 0xFF, 0xFF, 0xFF} + + // Already hooked + if bytes.Contains(trackMouseEventBytes[:], disableMouseLeaveRequest) { + return nil + } + + // We need to move back the pointer 7 bytes to get the correct position, since we are injecting 7 bytes in front of it + num := int32(binary.LittleEndian.Uint32(trackMouseEventBytes[2:6])) + num -= 7 + numberBytes := make([]byte, 4) + binary.LittleEndian.PutUint32(numberBytes, uint32(num)) + injectBytes := append(trackMouseEventBytes[0:2], numberBytes...) + + hook := append(disableMouseLeaveRequest, injectBytes...) + + return windows.WriteProcessMemory(handle, trackMouseEventAddr, &hook[0], uintptr(len(hook)), nil) +} From 6aa1baaccdf98ac50afdc22cffaf69ef341cafe9 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Mon, 12 Feb 2024 10:50:20 +0900 Subject: [PATCH 011/548] replace zap with slog --- .gitignore | 2 +- cmd/koolo/log/logger.go | 56 +++++++++++++++++++----- cmd/koolo/main.go | 27 +++++++----- cmd/pickup/main.go | 5 +-- config/config.yaml.dist | 2 +- go.mod | 2 - go.sum | 6 --- internal/action/action.go | 4 +- internal/action/action_builder.go | 6 +-- internal/action/action_chain.go | 4 +- internal/action/action_step_chain.go | 6 +-- internal/action/clear_area.go | 4 +- internal/action/gambling.go | 8 ++-- internal/action/horadric_cube.go | 8 ++-- internal/action/item_pickup.go | 6 +-- internal/action/leveling_tools.go | 4 +- internal/action/move.go | 6 +-- internal/action/stash.go | 5 +-- internal/action/step/pickup_item.go | 8 ++-- internal/action/vendor.go | 6 +-- internal/action/waypoint.go | 4 +- internal/action/waypoint_discover.go | 8 ++-- internal/bot.go | 10 ++--- internal/character/character.go | 8 ++-- internal/character/paladin_leveling.go | 4 +- internal/companion_supervisor.go | 4 +- internal/config/config.go | 8 ++-- internal/event/listener.go | 15 +++---- internal/health/belt_manager.go | 6 +-- internal/health/health_manager.go | 6 +-- internal/remote/telegram/telegram_bot.go | 8 ++-- internal/run/diablo.go | 22 +++++----- internal/run/nihlathak.go | 8 ++-- internal/run/run.go | 10 ++--- internal/run/terror_zone.go | 6 +-- internal/single_supervisor.go | 4 +- internal/supervisor.go | 12 ++--- internal/town/shop_manager.go | 6 +-- 38 files changed, 175 insertions(+), 149 deletions(-) diff --git a/.gitignore b/.gitignore index 472a04353..0c2956bb3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,6 @@ /build /stats /screenshots -/log.txt +/logs /config/*.yaml /config/*.yml \ No newline at end of file diff --git a/cmd/koolo/log/logger.go b/cmd/koolo/log/logger.go index 3ebfffe06..a4f7322ab 100644 --- a/cmd/koolo/log/logger.go +++ b/cmd/koolo/log/logger.go @@ -1,20 +1,52 @@ package log import ( - "go.uber.org/zap" + "errors" + "fmt" + "io" + "log/slog" + "os" + "time" ) -func NewLogger(debug bool, logFilePath string) (*zap.Logger, error) { - cfg := zap.Config{ - Level: zap.NewAtomicLevelAt(zap.DebugLevel), - Development: debug, - DisableCaller: false, - DisableStacktrace: false, - Encoding: "console", - EncoderConfig: zap.NewDevelopmentEncoderConfig(), - OutputPaths: []string{"stdout", logFilePath}, - ErrorOutputPaths: []string{"stderr", logFilePath}, +var logFileHandler *os.File + +func NewLogger(debug bool, logDir string) (*slog.Logger, error) { + if logDir == "" { + logDir = "logs" + } + + if _, err := os.Stat(logDir); errors.Is(err, os.ErrNotExist) { + err := os.MkdirAll(logDir, os.ModePerm) + if err != nil { + return nil, fmt.Errorf("error creating log directory: %w", err) + } + } + + fileName := "koolo-log-" + time.Now().Format("2006-01-02-15-04-05") + ".txt" + logFileHandler, err := os.Create(logDir + "/" + fileName) + if err != nil { + return nil, err + } + + level := slog.LevelDebug + if !debug { + level = slog.LevelInfo + } + + opts := &slog.HandlerOptions{ + Level: level, + } + + handler := slog.NewTextHandler(io.MultiWriter(os.Stdout, logFileHandler), opts) + + return slog.New(handler), nil +} + +func FlushLog() error { + if logFileHandler != nil { + return logFileHandler.Close() } - return cfg.Build() + return nil } diff --git a/cmd/koolo/main.go b/cmd/koolo/main.go index a6d217582..ef7661851 100644 --- a/cmd/koolo/main.go +++ b/cmd/koolo/main.go @@ -3,7 +3,7 @@ package main import ( "context" "github.com/hectorgimenez/d2go/pkg/memory" - zapLogger "github.com/hectorgimenez/koolo/cmd/koolo/log" + sloggger "github.com/hectorgimenez/koolo/cmd/koolo/log" koolo "github.com/hectorgimenez/koolo/internal" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/character" @@ -18,9 +18,9 @@ import ( "github.com/hectorgimenez/koolo/internal/remote/telegram" "github.com/hectorgimenez/koolo/internal/run" "github.com/hectorgimenez/koolo/internal/town" - "go.uber.org/zap" "golang.org/x/sync/errgroup" "log" + "log/slog" "os" "os/signal" "syscall" @@ -32,11 +32,11 @@ func main() { log.Fatalf("Error loading configuration: %s", err.Error()) } - logger, err := zapLogger.NewLogger(config.Config.Debug.Log, config.Config.LogFilePath) + logger, err := sloggger.NewLogger(config.Config.Debug.Log, config.Config.LogSaveDirectory) if err != nil { log.Fatalf("Error starting logger: %s", err.Error()) } - defer logger.Sync() + defer sloggger.FlushLog() ctx, cancel := context.WithCancel(context.Background()) @@ -52,18 +52,19 @@ func main() { process, err := memory.NewProcess() if err != nil { - logger.Fatal("Error finding D2R.exe process", zap.Error(err)) + logger.Error("Error finding D2R.exe process", slog.Any("error", err)) + return } err = asm.InjectorInit(uint32(process.GetPID())) if err != nil { - logger.Fatal("Error preparing memory injection", zap.Error(err)) + logger.Error("Error preparing memory injection", slog.Any("error", err)) } defer func() { logger.Debug("Restoring game memory...") err = asm.InjectorUnload() if err != nil { - logger.Error("Error restoring game memory, if client didn't crash yet, consider restarting it", zap.Error(err)) + logger.Error("Error restoring game memory, if client didn't crash yet, consider restarting it", slog.Any("error", err)) } }() @@ -80,7 +81,8 @@ func main() { sm := town.NewShopManager(logger, bm) char, err := character.BuildCharacter(logger) if err != nil { - logger.Fatal("Error creating character", zap.Error(err)) + logger.Error("Error creating character", slog.Any("error", err)) + return } ab := action.NewBuilder(logger, sm, bm, gr, char) @@ -105,7 +107,8 @@ func main() { if config.Config.Discord.Enabled { discordBot, err := discord.NewBot(config.Config.Discord.Token, config.Config.Discord.ChannelID, supervisor, companion) if err != nil { - logger.Fatal("Discord could not been initialized", zap.Error(err)) + logger.Error("Discord could not been initialized", slog.Any("error", err)) + return } eventListener.Register(discordBot.Handle) @@ -118,7 +121,8 @@ func main() { if config.Config.Telegram.Enabled { telegramBot, err := telegram.NewBot(config.Config.Telegram.Token, config.Config.Telegram.ChatID, logger, supervisor) if err != nil { - logger.Fatal("Telegram could not been initialized", zap.Error(err)) + logger.Error("Telegram could not been initialized", slog.Any("error", err)) + return } eventListener.Register(telegramBot.Handle) @@ -133,6 +137,7 @@ func main() { err = g.Wait() if err != nil { - logger.Fatal("Error running Koolo", zap.Error(err)) + logger.Error("Error running Koolo", slog.Any("error", err)) + return } } diff --git a/cmd/pickup/main.go b/cmd/pickup/main.go index 48083f3fb..357e56dd1 100644 --- a/cmd/pickup/main.go +++ b/cmd/pickup/main.go @@ -1,6 +1,7 @@ package main import ( + log2 "github.com/hectorgimenez/koolo/cmd/koolo/log" "log" "syscall" @@ -14,7 +15,6 @@ import ( "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/town" "github.com/lxn/win" - "go.uber.org/zap" ) func main() { @@ -23,8 +23,7 @@ func main() { log.Fatalf("Error loading configuration: %s", err.Error()) } - logger, _ := zap.NewDevelopment() - + logger, _ := log2.NewLogger(true, "pickup") ptr, err := syscall.UTF16PtrFromString("Diablo II: Resurrected") if err != nil { log.Fatalf(err.Error()) diff --git a/config/config.yaml.dist b/config/config.yaml.dist index cb34b6fd8..d0301e99a 100644 --- a/config/config.yaml.dist +++ b/config/config.yaml.dist @@ -2,7 +2,7 @@ debug: log: true # Prints extra log information renderMap: false # Render current map data into 'cg.png' file -logFilePath: log.txt +logSaveDirectory: logs maxGameLength: 500 # Max game length (in seconds), bot will try to quit game arrived that point D2LoDPath: 'E:\games\Diablo II' diff --git a/go.mod b/go.mod index ecaa36ee2..2fde3e96b 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,6 @@ require ( github.com/hectorgimenez/d2go v0.0.0-20240204054823-23600ecb0a6f github.com/lxn/win v0.0.0-20210218163916-a377121e959e github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9 - go.uber.org/zap v1.26.0 golang.org/x/sync v0.6.0 golang.org/x/sys v0.17.0 gopkg.in/yaml.v3 v3.0.1 @@ -17,7 +16,6 @@ require ( require ( github.com/gorilla/websocket v1.5.1 // indirect - go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.19.0 // indirect golang.org/x/net v0.21.0 // indirect ) diff --git a/go.sum b/go.sum index 816459911..fbc511907 100644 --- a/go.sum +++ b/go.sum @@ -19,12 +19,6 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9 h1:U8aCPFEMnxAEyj9IonhMVV1gSL4nzelh8uvoXp0hrq0= github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9/go.mod h1:N51TYkG9JGR5sytj0EoPl31Xg2kuB507lxEmrwSNvfQ= -go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk= -go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= diff --git a/internal/action/action.go b/internal/action/action.go index d4f65af65..5661116d3 100644 --- a/internal/action/action.go +++ b/internal/action/action.go @@ -2,9 +2,9 @@ package action import ( "errors" + "log/slog" "github.com/hectorgimenez/d2go/pkg/data" - "go.uber.org/zap" ) const maxRetries = 5 @@ -16,7 +16,7 @@ var ErrNoMoreSteps = errors.New("action finished, no more steps remaining") var ErrLogAndContinue = errors.New("error occurred, but marking action as completed") type Action interface { - NextStep(logger *zap.Logger, d data.Data) error + NextStep(logger *slog.Logger, d data.Data) error Skip() } diff --git a/internal/action/action_builder.go b/internal/action/action_builder.go index f7e3981c2..6b35e397a 100644 --- a/internal/action/action_builder.go +++ b/internal/action/action_builder.go @@ -4,18 +4,18 @@ import ( "github.com/hectorgimenez/koolo/internal/health" "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/town" - "go.uber.org/zap" + "log/slog" ) type Builder struct { - logger *zap.Logger + logger *slog.Logger sm town.ShopManager bm health.BeltManager gr *reader.GameReader ch Character } -func NewBuilder(logger *zap.Logger, sm town.ShopManager, bm health.BeltManager, gr *reader.GameReader, ch Character) *Builder { +func NewBuilder(logger *slog.Logger, sm town.ShopManager, bm health.BeltManager, gr *reader.GameReader, ch Character) *Builder { return &Builder{ logger: logger, sm: sm, diff --git a/internal/action/action_chain.go b/internal/action/action_chain.go index 983e69013..8f06e7f88 100644 --- a/internal/action/action_chain.go +++ b/internal/action/action_chain.go @@ -2,9 +2,9 @@ package action import ( "errors" + "log/slog" "github.com/hectorgimenez/d2go/pkg/data" - "go.uber.org/zap" ) type Chain struct { @@ -25,7 +25,7 @@ func NewChain(builder func(d data.Data) []Action, opts ...Option) *Chain { return a } -func (a *Chain) NextStep(logger *zap.Logger, d data.Data) error { +func (a *Chain) NextStep(logger *slog.Logger, d data.Data) error { if a.markSkipped { return ErrNoMoreSteps } diff --git a/internal/action/action_step_chain.go b/internal/action/action_step_chain.go index 1c615be88..7248e646b 100644 --- a/internal/action/action_step_chain.go +++ b/internal/action/action_step_chain.go @@ -3,11 +3,11 @@ package action import ( "errors" "fmt" + "log/slog" "reflect" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/koolo/internal/action/step" - "go.uber.org/zap" ) type StepChainAction struct { @@ -29,7 +29,7 @@ func NewStepChain(builder func(d data.Data) []step.Step, opts ...Option) *StepCh return a } -func (a *StepChainAction) NextStep(logger *zap.Logger, d data.Data) error { +func (a *StepChainAction) NextStep(logger *slog.Logger, d data.Data) error { if a.markSkipped { return ErrNoMoreSteps } @@ -44,7 +44,7 @@ func (a *StepChainAction) NextStep(logger *zap.Logger, d data.Data) error { lastRun := s.LastRun() err := s.Run(d) if s.LastRun().After(lastRun) { - //logger.Debug("Executed step", zap.String("step_name", reflect.TypeOf(s).Elem().Name())) + //logger.Debug("Executed step", slog.String("step_name", reflect.TypeOf(s).Elem().Name())) } if err != nil { a.retries++ diff --git a/internal/action/clear_area.go b/internal/action/clear_area.go index 84f881203..abc6d1e22 100644 --- a/internal/action/clear_area.go +++ b/internal/action/clear_area.go @@ -3,7 +3,7 @@ package action import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/koolo/internal/pather" - "go.uber.org/zap" + "log/slog" ) func (b *Builder) ClearAreaAroundPlayer(distance int) Action { @@ -16,7 +16,7 @@ func (b *Builder) ClearAreaAroundPlayer(distance int) Action { for _, m := range d.Monsters.Enemies() { d := pather.DistanceFromPoint(originalPosition, m.Position) if d <= distance { - b.logger.Debug("Clearing area...", zap.Int("monsterID", int(m.Name))) + b.logger.Debug("Clearing area...", slog.Int("monsterID", int(m.Name))) return m.UnitID, true } } diff --git a/internal/action/gambling.go b/internal/action/gambling.go index 5e2338b4e..c1bb8023d 100644 --- a/internal/action/gambling.go +++ b/internal/action/gambling.go @@ -1,6 +1,7 @@ package action import ( + "log/slog" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -13,7 +14,6 @@ import ( "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/town" "github.com/hectorgimenez/koolo/internal/ui" - "go.uber.org/zap" ) func (b *Builder) Gamble() *Chain { @@ -63,7 +63,7 @@ func (b *Builder) gambleItems() *StepChainAction { })} } - b.logger.Info("Finished gambling", zap.Int("currentGold", d.PlayerUnit.TotalGold())) + b.logger.Info("Finished gambling", slog.Int("currentGold", d.PlayerUnit.TotalGold())) return nil } @@ -74,7 +74,7 @@ func (b *Builder) gambleItems() *StepChainAction { if itm.UnitID == itemBought.UnitID { itemBought = itm itemBought.Location = item.LocationInventory - b.logger.Debug("Gambled for item", zap.Any("item", itemBought)) + b.logger.Debug("Gambled for item", slog.Any("item", itemBought)) break } } @@ -109,7 +109,7 @@ func (b *Builder) gambleItems() *StepChainAction { itm, found := d.Items.Find(itmName, item.LocationVendor) if !found { - b.logger.Debug("Item not found in gambling window, refreshing...", zap.String("item", string(itmName))) + b.logger.Debug("Item not found in gambling window, refreshing...", slog.String("item", string(itmName))) return []step.Step{step.SyncStep(func(d data.Data) error { hid.Click(hid.LeftButton, ui.GambleRefreshButtonX, ui.GambleRefreshButtonY) diff --git a/internal/action/horadric_cube.go b/internal/action/horadric_cube.go index caebdc3a8..951570a9e 100644 --- a/internal/action/horadric_cube.go +++ b/internal/action/horadric_cube.go @@ -8,7 +8,7 @@ import ( "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/ui" - "go.uber.org/zap" + "log/slog" ) func (b *Builder) CubeAddItems(items ...data.Item) *Chain { @@ -26,7 +26,7 @@ func (b *Builder) CubeAddItems(items ...data.Item) *Chain { })) } - b.logger.Info("Adding items to the Horadric Cube", zap.Any("items", items)) + b.logger.Info("Adding items to the Horadric Cube", slog.Any("items", items)) // If items are on the Stash, pickup them to the inventory (only personal stash is supported for now) for _, itm := range items { @@ -35,7 +35,7 @@ func (b *Builder) CubeAddItems(items ...data.Item) *Chain { continue } - b.logger.Debug("Item found on the stash, picking it up", zap.String("Item", string(nwIt.Name))) + b.logger.Debug("Item found on the stash, picking it up", slog.String("Item", string(nwIt.Name))) actions = append(actions, NewStepChain(func(d data.Data) []step.Step { screenPos := ui.GetScreenCoordsForItem(nwIt) hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) @@ -52,7 +52,7 @@ func (b *Builder) CubeAddItems(items ...data.Item) *Chain { actions = append(actions, NewStepChain(func(d data.Data) []step.Step { for _, updatedItem := range d.Items.AllItems { if nwIt.UnitID == updatedItem.UnitID { - b.logger.Debug("Moving Item to the Horadric Cube", zap.String("Item", string(nwIt.Name))) + b.logger.Debug("Moving Item to the Horadric Cube", slog.String("Item", string(nwIt.Name))) screenPos := ui.GetScreenCoordsForItem(updatedItem) hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) helper.Sleep(300) diff --git a/internal/action/item_pickup.go b/internal/action/item_pickup.go index 359de8497..4086b0b9a 100644 --- a/internal/action/item_pickup.go +++ b/internal/action/item_pickup.go @@ -2,6 +2,7 @@ package action import ( "fmt" + "log/slog" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -11,7 +12,6 @@ import ( "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/pather" - "go.uber.org/zap" ) func (b *Builder) ItemPickup(waitForDrop bool, maxDistance int) *Chain { @@ -27,7 +27,7 @@ func (b *Builder) ItemPickup(waitForDrop bool, maxDistance int) *Chain { if len(itemsToPickup) > 0 { for _, m := range d.Monsters.Enemies() { if dist := pather.DistanceFromMe(d, m.Position); dist < 7 { - b.logger.Debug("Aborting item pickup, monster nearby", zap.Any("monster", m)) + b.logger.Debug("Aborting item pickup, monster nearby", slog.Any("monster", m)) itemBeingPickedUp = -1 return []Action{b.ch.KillMonsterSequence(func(d data.Data) (data.UnitID, bool) { return m.UnitID, true @@ -66,7 +66,7 @@ func (b *Builder) ItemPickup(waitForDrop bool, maxDistance int) *Chain { // Add small delay, drop is not instant if waitForDrop && time.Since(firstCallTime) < time.Second { msToWait := time.Second - time.Since(firstCallTime) - b.logger.Debug("No items detected, waiting a bit and will try again", zap.Int("waitMs", int(msToWait.Milliseconds()))) + b.logger.Debug("No items detected, waiting a bit and will try again", slog.Int("waitMs", int(msToWait.Milliseconds()))) return []Action{b.Wait(msToWait)} } diff --git a/internal/action/leveling_tools.go b/internal/action/leveling_tools.go index e724ae0a3..e46c8d4bf 100644 --- a/internal/action/leveling_tools.go +++ b/internal/action/leveling_tools.go @@ -1,6 +1,7 @@ package action import ( + "log/slog" "slices" "time" @@ -16,7 +17,6 @@ import ( "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/town" "github.com/hectorgimenez/koolo/internal/ui" - "go.uber.org/zap" ) var uiStatButtonPosition = map[stat.ID]data.Position{ @@ -115,7 +115,7 @@ func (b *Builder) EnsureSkillPoints() *StepChainAction { if !found || int(characterPoints.Level) < assignedPoints[sk] { skillDesc, skFound := skill.Desc[sk] if !skFound { - b.logger.Error("skill not found for character", zap.Any("skill", sk)) + b.logger.Error("skill not found for character", slog.Any("skill", sk)) return nil } diff --git a/internal/action/move.go b/internal/action/move.go index 2cdf5918b..2f2b826e3 100644 --- a/internal/action/move.go +++ b/internal/action/move.go @@ -3,6 +3,7 @@ package action import ( "fmt" "github.com/hectorgimenez/koolo/internal/config" + "log/slog" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -13,7 +14,6 @@ import ( "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/pather" "github.com/hectorgimenez/koolo/internal/reader" - "go.uber.org/zap" ) func (b *Builder) MoveToArea(dst area.Area, opts ...step.MoveToStepOption) *Chain { @@ -37,7 +37,7 @@ func (b *Builder) MoveToArea(dst area.Area, opts ...step.MoveToStepOption) *Chai toFun := func(d data.Data) (data.Position, bool) { if d.PlayerUnit.Area == dst { - b.logger.Debug("Already in area", zap.Any("area", dst)) + b.logger.Debug("Already in area", slog.Any("area", dst)) return data.Position{}, false } @@ -78,7 +78,7 @@ func (b *Builder) MoveToArea(dst area.Area, opts ...step.MoveToStepOption) *Chai } } - b.logger.Debug("Destination area not found", zap.Any("area", dst)) + b.logger.Debug("Destination area not found", slog.Any("area", dst)) return data.Position{}, false } diff --git a/internal/action/stash.go b/internal/action/stash.go index 477844f9e..096179c06 100644 --- a/internal/action/stash.go +++ b/internal/action/stash.go @@ -2,8 +2,6 @@ package action import ( "fmt" - "go.uber.org/zap" - "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/item" @@ -16,6 +14,7 @@ import ( "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/ui" + "log/slog" ) const ( @@ -94,7 +93,7 @@ func (b *Builder) stashGold(d data.Data) { return } - b.logger.Info("Stashing gold...", zap.Int("gold", gold)) + b.logger.Info("Stashing gold...", slog.Int("gold", gold)) if d.PlayerUnit.Stats[stat.StashGold] < maxGoldPerStashTab { switchTab(1) diff --git a/internal/action/step/pickup_item.go b/internal/action/step/pickup_item.go index 7a037bab7..bd59db8dc 100644 --- a/internal/action/step/pickup_item.go +++ b/internal/action/step/pickup_item.go @@ -2,6 +2,7 @@ package step import ( "fmt" + "log/slog" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -9,7 +10,6 @@ import ( "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/pather" - "go.uber.org/zap" ) const maxInteractions = 45 @@ -19,11 +19,11 @@ type PickupItemStep struct { item data.Item waitingForInteraction time.Time mouseOverAttempts int - logger *zap.Logger + logger *slog.Logger startedAt time.Time } -func PickupItem(logger *zap.Logger, item data.Item) *PickupItemStep { +func PickupItem(logger *slog.Logger, item data.Item) *PickupItemStep { return &PickupItemStep{ basicStep: newBasicStep(), item: item, @@ -94,7 +94,7 @@ func (p *PickupItemStep) Run(d data.Data) error { distance := pather.DistanceFromMe(d, i.Position) if distance > 7 { - p.logger.Info("item is too far away", zap.String("item", string(p.item.Name))) + p.logger.Info("item is too far away", slog.String("item", string(p.item.Name))) return fmt.Errorf("item is too far away: %s", p.item.Name) } diff --git a/internal/action/vendor.go b/internal/action/vendor.go index 3df51721a..7e11cbae9 100644 --- a/internal/action/vendor.go +++ b/internal/action/vendor.go @@ -1,6 +1,7 @@ package action import ( + "log/slog" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -8,7 +9,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/npc" "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/town" - "go.uber.org/zap" ) func (b *Builder) VendorRefill(forceRefill, sellJunk bool) *Chain { @@ -17,7 +17,7 @@ func (b *Builder) VendorRefill(forceRefill, sellJunk bool) *Chain { return nil } - b.logger.Info("Visiting vendor...", zap.Bool("forceRefill", forceRefill)) + b.logger.Info("Visiting vendor...", slog.Bool("forceRefill", forceRefill)) openShopStep := step.KeySequence("home", "down", "enter") vendorNPC := town.GetTownByArea(d.PlayerUnit.Area).RefillNPC() @@ -72,7 +72,7 @@ func (b *Builder) BuyAtVendor(vendor npc.ID, items ...VendorItemRequest) *Chain if found { b.sm.BuyItem(itm, i.Quantity) } else { - b.logger.Warn("Item not found in vendor", zap.String("Item", string(i.Item))) + b.logger.Warn("Item not found in vendor", slog.String("Item", string(i.Item))) } } diff --git a/internal/action/waypoint.go b/internal/action/waypoint.go index b00f8705e..6d64d5b9d 100644 --- a/internal/action/waypoint.go +++ b/internal/action/waypoint.go @@ -6,7 +6,7 @@ import ( "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" - "go.uber.org/zap" + "log/slog" ) const ( @@ -96,7 +96,7 @@ func (b *Builder) useWP(a area.Area) *Chain { traverseAreas = append(traverseAreas, a) // Next keep traversing all the areas from the previous available waypoint until we reach the destination, trying to discover WPs during the way - b.logger.Info("Traversing areas to reach destination", zap.Any("areas", traverseAreas)) + b.logger.Info("Traversing areas to reach destination", slog.Any("areas", traverseAreas)) for i, dst := range traverseAreas { if !dst.IsTown() { diff --git a/internal/action/waypoint_discover.go b/internal/action/waypoint_discover.go index 1909ef2ec..fe3355e14 100644 --- a/internal/action/waypoint_discover.go +++ b/internal/action/waypoint_discover.go @@ -5,12 +5,12 @@ import ( "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" - "go.uber.org/zap" + "log/slog" ) func (b *Builder) DiscoverWaypoint() *Chain { return NewChain(func(d data.Data) []Action { - b.logger.Info("Trying to autodiscover Waypoint for current area", zap.Any("area", d.PlayerUnit.Area)) + b.logger.Info("Trying to autodiscover Waypoint for current area", slog.Any("area", d.PlayerUnit.Area)) for _, o := range d.Objects { if o.IsWaypoint() { return []Action{b.InteractObject(o.Name, @@ -18,7 +18,7 @@ func (b *Builder) DiscoverWaypoint() *Chain { return d.OpenMenus.Waypoint }, step.SyncStep(func(d data.Data) error { - b.logger.Info("Waypoint discovered", zap.Any("area", d.PlayerUnit.Area)) + b.logger.Info("Waypoint discovered", slog.Any("area", d.PlayerUnit.Area)) helper.Sleep(500) hid.PressKey("esc") return nil @@ -27,7 +27,7 @@ func (b *Builder) DiscoverWaypoint() *Chain { } } - b.logger.Info("Waypoint not found :(", zap.Any("area", d.PlayerUnit.Area)) + b.logger.Info("Waypoint not found :(", slog.Any("area", d.PlayerUnit.Area)) return nil }) } diff --git a/internal/bot.go b/internal/bot.go index d7e1f5e6c..5bbd478ec 100644 --- a/internal/bot.go +++ b/internal/bot.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "log/slog" "time" "github.com/hectorgimenez/koolo/internal/action" @@ -14,12 +15,11 @@ import ( "github.com/hectorgimenez/koolo/internal/health" "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/run" - "go.uber.org/zap" ) // Bot will be in charge of running the run loop: create games, traveling, killing bosses, repairing, picking... type Bot struct { - logger *zap.Logger + logger *slog.Logger hm health.Manager ab *action.Builder gr *reader.GameReader @@ -27,7 +27,7 @@ type Bot struct { } func NewBot( - logger *zap.Logger, + logger *slog.Logger, hm health.Manager, ab *action.Builder, gr *reader.GameReader, @@ -123,12 +123,12 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) (err error continue } if errors.Is(err, action.ErrWillBeRetried) { - b.logger.Warn("error occurred, will be retried", zap.Error(err)) + b.logger.Warn("error occurred, will be retried", slog.Any("error", err)) break } if errors.Is(err, action.ErrCanBeSkipped) { event.Events <- event.WithScreenshot(fmt.Sprintf("error occurred on action that can be skipped, game will continue: %s", err.Error())) - b.logger.Warn("error occurred on action that can be skipped, game will continue", zap.Error(err)) + b.logger.Warn("error occurred on action that can be skipped, game will continue", slog.Any("error", err)) act.Skip() break } diff --git a/internal/character/character.go b/internal/character/character.go index 72160fb6c..a6861f62f 100644 --- a/internal/character/character.go +++ b/internal/character/character.go @@ -2,16 +2,16 @@ package character import ( "fmt" + "log/slog" "strings" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/config" - "go.uber.org/zap" ) -func BuildCharacter(logger *zap.Logger) (action.Character, error) { +func BuildCharacter(logger *slog.Logger) (action.Character, error) { bc := BaseCharacter{ logger: logger, } @@ -40,7 +40,7 @@ func BuildCharacter(logger *zap.Logger) (action.Character, error) { } type BaseCharacter struct { - logger *zap.Logger + logger *slog.Logger } func (bc BaseCharacter) preBattleChecks(d data.Data, id data.UnitID, skipOnImmunities []stat.Resist) bool { @@ -50,7 +50,7 @@ func (bc BaseCharacter) preBattleChecks(d data.Data, id data.UnitID, skipOnImmun } for _, i := range skipOnImmunities { if monster.IsImmune(i) { - bc.logger.Info("Monster is immune! skipping", zap.String("immuneTo", string(i))) + bc.logger.Info("Monster is immune! skipping", slog.String("immuneTo", string(i))) return false } } diff --git a/internal/character/paladin_leveling.go b/internal/character/paladin_leveling.go index a500f29de..5415619ee 100644 --- a/internal/character/paladin_leveling.go +++ b/internal/character/paladin_leveling.go @@ -1,6 +1,7 @@ package character import ( + "log/slog" "sort" "time" @@ -12,7 +13,6 @@ import ( "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/pather" - "go.uber.org/zap" ) type PaladinLeveling struct { @@ -161,7 +161,7 @@ func (p PaladinLeveling) KillMonsterSequence(monsterSelector func(d data.Data) ( numOfAttacks := 5 m, _ := d.Monsters.FindByID(id) - p.logger.Debug("ATTACKING MONSTER", zap.Any("monster", m.Name)) + p.logger.Debug("ATTACKING MONSTER", slog.Any("monster", m.Name)) if d.PlayerUnit.Skills[skill.BlessedHammer].Level > 0 { // Add a random movement, maybe hammer is not hitting the target if previousUnitID == id { diff --git a/internal/companion_supervisor.go b/internal/companion_supervisor.go index f8eb6883a..4c369630e 100644 --- a/internal/companion_supervisor.go +++ b/internal/companion_supervisor.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "log/slog" "time" "github.com/hectorgimenez/koolo/internal/config" @@ -11,7 +12,6 @@ import ( "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/run" - "go.uber.org/zap" ) type Companion interface { @@ -32,7 +32,7 @@ func (s *CompanionSupervisor) JoinGame(gameName, password string) { s.companionCh <- CompanionGameData{GameName: gameName, Password: password} } -func NewCompanionSupervisor(logger *zap.Logger, bot *Bot, gr *reader.GameReader, gm *helper.GameManager) *CompanionSupervisor { +func NewCompanionSupervisor(logger *slog.Logger, bot *Bot, gr *reader.GameReader, gm *helper.GameManager) *CompanionSupervisor { return &CompanionSupervisor{ baseSupervisor: baseSupervisor{ logger: logger, diff --git a/internal/config/config.go b/internal/config/config.go index 6d4c0f006..bcc913cc3 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -23,10 +23,10 @@ type StructConfig struct { Log bool `yaml:"log"` RenderMap bool `yaml:"renderMap"` } `yaml:"debug"` - LogFilePath string `yaml:"logFilePath"` - MaxGameLength int `yaml:"maxGameLength"` - D2LoDPath string `yaml:"D2LoDPath"` - Discord struct { + LogSaveDirectory string `yaml:"logSaveDirectory"` + MaxGameLength int `yaml:"maxGameLength"` + D2LoDPath string `yaml:"D2LoDPath"` + Discord struct { Enabled bool `yaml:"enabled"` ChannelID string `yaml:"channelId"` Token string `yaml:"token"` diff --git a/internal/event/listener.go b/internal/event/listener.go index c75fef0b0..9e27e7d2d 100644 --- a/internal/event/listener.go +++ b/internal/event/listener.go @@ -4,20 +4,19 @@ import ( "context" "fmt" "github.com/hectorgimenez/koolo/internal/helper" + "log/slog" "os" "time" - - "go.uber.org/zap" ) type Listener struct { handlers []Handler - logger *zap.Logger + logger *slog.Logger } type Handler func(ctx context.Context, m Message) error -func NewListener(logger *zap.Logger) Listener { +func NewListener(logger *slog.Logger) Listener { return Listener{ logger: logger, } @@ -32,9 +31,9 @@ func (l *Listener) Listen(ctx context.Context) error { select { case e := <-Events: if _, err := os.Stat("screenshots"); os.IsNotExist(err) { - err = os.MkdirAll("screenshots", 0700) + err = os.MkdirAll("screenshots", os.ModePerm) if err != nil { - l.logger.Error("error creating screenshots directory", zap.Error(err)) + l.logger.Error("error creating screenshots directory", slog.Any("error", err)) } } @@ -42,13 +41,13 @@ func (l *Listener) Listen(ctx context.Context) error { fileName := fmt.Sprintf("screenshots/error-%s.jpeg", time.Now().Format("2006-01-02 15_04_05")) err := helper.SaveImageJPEG(e.Image, fileName) if err != nil { - l.logger.Error("error saving screenshot", zap.Error(err)) + l.logger.Error("error saving screenshot", slog.Any("error", err)) } } for _, h := range l.handlers { if err := h(ctx, e); err != nil { - l.logger.Error("error running event handler", zap.Error(err)) + l.logger.Error("error running event handler", slog.Any("error", err)) } } case <-ctx.Done(): diff --git a/internal/health/belt_manager.go b/internal/health/belt_manager.go index e24572aad..21ad655aa 100644 --- a/internal/health/belt_manager.go +++ b/internal/health/belt_manager.go @@ -2,20 +2,20 @@ package health import ( "fmt" + "log/slog" "strings" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/event/stat" "github.com/hectorgimenez/koolo/internal/hid" - "go.uber.org/zap" ) type BeltManager struct { - logger *zap.Logger + logger *slog.Logger } -func NewBeltManager(logger *zap.Logger) BeltManager { +func NewBeltManager(logger *slog.Logger) BeltManager { return BeltManager{ logger: logger, } diff --git a/internal/health/health_manager.go b/internal/health/health_manager.go index 559d80f65..b40aef69b 100644 --- a/internal/health/health_manager.go +++ b/internal/health/health_manager.go @@ -3,6 +3,7 @@ package health import ( "errors" "fmt" + "log/slog" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -10,7 +11,6 @@ import ( "github.com/hectorgimenez/koolo/internal/event" "github.com/hectorgimenez/koolo/internal/event/stat" "github.com/hectorgimenez/koolo/internal/helper" - "go.uber.org/zap" ) var ErrDied = errors.New("you died :(") @@ -26,7 +26,7 @@ const ( // Manager responsibility is to keep our character and mercenary alive, monitoring life and giving potions when needed type Manager struct { - logger *zap.Logger + logger *slog.Logger beltManager BeltManager gameManager *helper.GameManager lastRejuv time.Time @@ -36,7 +36,7 @@ type Manager struct { lastMercHeal time.Time } -func NewHealthManager(logger *zap.Logger, beltManager BeltManager, gm *helper.GameManager) Manager { +func NewHealthManager(logger *slog.Logger, beltManager BeltManager, gm *helper.GameManager) Manager { return Manager{ logger: logger, beltManager: beltManager, diff --git a/internal/remote/telegram/telegram_bot.go b/internal/remote/telegram/telegram_bot.go index c4f6566c3..2caad8bc0 100644 --- a/internal/remote/telegram/telegram_bot.go +++ b/internal/remote/telegram/telegram_bot.go @@ -3,22 +3,22 @@ package telegram import ( "context" "fmt" + "log/slog" "strings" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" koolo "github.com/hectorgimenez/koolo/internal" "github.com/hectorgimenez/koolo/internal/event/stat" - "go.uber.org/zap" ) type Bot struct { bot *tgbotapi.BotAPI chatID int64 - logger *zap.Logger + logger *slog.Logger sueprvisor koolo.Supervisor } -func NewBot(token string, chatID int64, logger *zap.Logger, supervisor koolo.Supervisor) (*Bot, error) { +func NewBot(token string, chatID int64, logger *slog.Logger, supervisor koolo.Supervisor) (*Bot, error) { bot, err := tgbotapi.NewBotAPI(token) if err != nil { return nil, err @@ -46,7 +46,7 @@ func (b *Bot) Start(_ context.Context) error { switch strings.ToLower(update.Message.Text) { case "stats": if err := b.publishStats(); err != nil { - b.logger.Error("error sending telegram message", zap.Error(err)) + b.logger.Error("error sending telegram message", slog.Any("error", err)) } case "start": // TODO: Implement diff --git a/internal/run/diablo.go b/internal/run/diablo.go index 138477fe8..47a672354 100644 --- a/internal/run/diablo.go +++ b/internal/run/diablo.go @@ -1,6 +1,7 @@ package run import ( + "log/slog" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -12,7 +13,6 @@ import ( "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/health" "github.com/hectorgimenez/koolo/internal/pather" - "go.uber.org/zap" ) var diabloSpawnPosition = data.Position{ @@ -53,7 +53,7 @@ func (a Diablo) BuildActions() (actions []action.Action) { actions = append(actions, action.NewChain(func(d data.Data) []action.Action { _, isLevelingChar := a.char.(action.LevelingCharacter) if isLevelingChar && (a.bm.ShouldBuyPotions(d) || (config.Config.Character.UseMerc && d.MercHPPercent() <= 0)) { - a.logger.Debug("Let's go back town to buy more pots", zap.Int("seal", sealNumber+1)) + a.logger.Debug("Let's go back town to buy more pots", slog.Int("seal", sealNumber+1)) return a.builder.InRunReturnTownRoutine() } @@ -61,18 +61,18 @@ func (a Diablo) BuildActions() (actions []action.Action) { })) actions = append(actions, a.builder.MoveTo(func(d data.Data) (data.Position, bool) { - a.logger.Debug("Moving to next seal", zap.Int("seal", sealNumber+1)) + a.logger.Debug("Moving to next seal", slog.Int("seal", sealNumber+1)) if obj, found := d.Objects.FindOne(seal); found { if d := pather.DistanceFromMe(d, obj.Position); d < 7 { - a.logger.Debug("We are close enough to the seal", zap.Int("seal", sealNumber+1)) + a.logger.Debug("We are close enough to the seal", slog.Int("seal", sealNumber+1)) return data.Position{}, false } - a.logger.Debug("Seal found, start teleporting", zap.Int("seal", sealNumber+1)) + a.logger.Debug("Seal found, start teleporting", slog.Int("seal", sealNumber+1)) return obj.Position, true } - a.logger.Debug("Seal NOT found", zap.Int("seal", sealNumber+1)) + a.logger.Debug("Seal NOT found", slog.Int("seal", sealNumber+1)) return data.Position{}, false }, step.StopAtDistance(7))) @@ -96,13 +96,13 @@ func (a Diablo) BuildActions() (actions []action.Action) { actions = append(actions, a.builder.ClearAreaAroundPlayer(15), action.NewStepChain(func(d data.Data) []step.Step { - a.logger.Debug("Trying to activate seal...", zap.Int("seal", sealNumber+1)) + a.logger.Debug("Trying to activate seal...", slog.Int("seal", sealNumber+1)) lastInteractionAt := time.Now() return []step.Step{ step.InteractObject(seal, func(d data.Data) bool { if obj, found := d.Objects.FindOne(seal); found { if !obj.Selectable { - a.logger.Debug("Seal activated, waiting for elite group to spawn", zap.Int("seal", sealNumber+1)) + a.logger.Debug("Seal activated, waiting for elite group to spawn", slog.Int("seal", sealNumber+1)) } return !obj.Selectable } @@ -219,13 +219,13 @@ func (a Diablo) getLessConcurredCornerAroundSeal(d data.Data, sealPosition data. } // No monsters found here, don't need to keep checking if monstersFound == 0 { - a.logger.Debug("Moving to corner", zap.Int("corner", i), zap.Int("monsters", monstersFound)) + a.logger.Debug("Moving to corner", slog.Int("corner", i), slog.Int("monsters", monstersFound)) return corners[i] } - a.logger.Debug("Corner", zap.Int("corner", i), zap.Int("monsters", monstersFound), zap.Int("distance", averageDistance)) + a.logger.Debug("Corner", slog.Int("corner", i), slog.Int("monsters", monstersFound), slog.Int("distance", averageDistance)) } - a.logger.Debug("Moving to corner", zap.Int("corner", bestCorner), zap.Int("monsters", bestCornerDistance)) + a.logger.Debug("Moving to corner", slog.Int("corner", bestCorner), slog.Int("monsters", bestCornerDistance)) return corners[bestCorner] } diff --git a/internal/run/nihlathak.go b/internal/run/nihlathak.go index c0ac7aebf..c479d56b3 100644 --- a/internal/run/nihlathak.go +++ b/internal/run/nihlathak.go @@ -8,7 +8,7 @@ import ( "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/pather" - "go.uber.org/zap" + "log/slog" ) type Nihlathak struct { @@ -71,10 +71,10 @@ func (a Nihlathak) BuildActions() (actions []action.Action) { bestCorner = i bestCornerDistance = averageDistance } - a.logger.Debug("Corner", zap.Int("corner", i), zap.Int("monsters", len(d.Monsters.Enemies())), zap.Int("distance", averageDistance)) + a.logger.Debug("Corner", slog.Int("corner", i), slog.Int("monsters", len(d.Monsters.Enemies())), slog.Int("distance", averageDistance)) } - a.logger.Debug("Moving to corner", zap.Int("corner", bestCorner), zap.Int("averageDistance", bestCornerDistance)) + a.logger.Debug("Moving to corner", slog.Int("corner", bestCorner), slog.Int("averageDistance", bestCornerDistance)) return []step.Step{step.MoveTo(corners[bestCorner])} })) @@ -86,7 +86,7 @@ func (a Nihlathak) BuildActions() (actions []action.Action) { actions = append(actions, a.char.KillMonsterSequence(func(d data.Data) (data.UnitID, bool) { for _, m := range d.Monsters.Enemies() { if d := pather.DistanceFromPoint(nilaO.Position, m.Position); d < 15 { - a.logger.Debug("Clearing monsters around Nihlathak position", zap.Any("monster", m)) + a.logger.Debug("Clearing monsters around Nihlathak position", slog.Any("monster", m)) return m.UnitID, true } } diff --git a/internal/run/run.go b/internal/run/run.go index 6a44c9eb3..52dd55418 100644 --- a/internal/run/run.go +++ b/internal/run/run.go @@ -1,6 +1,7 @@ package run import ( + "log/slog" "strings" "time" @@ -8,7 +9,6 @@ import ( "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/health" "github.com/hectorgimenez/koolo/internal/reader" - "go.uber.org/zap" ) type Run interface { @@ -19,18 +19,18 @@ type Run interface { type baseRun struct { builder *action.Builder char action.Character - logger *zap.Logger + logger *slog.Logger } type Factory struct { - logger *zap.Logger + logger *slog.Logger builder *action.Builder char action.Character gr *reader.GameReader bm health.BeltManager } -func NewFactory(logger *zap.Logger, builder *action.Builder, char action.Character, gr *reader.GameReader, bm health.BeltManager) *Factory { +func NewFactory(logger *slog.Logger, builder *action.Builder, char action.Character, gr *reader.GameReader, bm health.BeltManager) *Factory { return &Factory{ logger: logger, builder: builder, @@ -44,7 +44,7 @@ func (f *Factory) BuildRuns() (runs []Run) { t := time.Now() f.logger.Debug("Fetching map data...") d := f.gr.GetData(true) - f.logger.Debug("Fetch completed", zap.Int64("ms", time.Since(t).Milliseconds())) + f.logger.Debug("Fetch completed", slog.Int64("ms", time.Since(t).Milliseconds())) baseRun := baseRun{ builder: f.builder, diff --git a/internal/run/terror_zone.go b/internal/run/terror_zone.go index 5bd80561a..f7f48c34c 100644 --- a/internal/run/terror_zone.go +++ b/internal/run/terror_zone.go @@ -6,7 +6,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/config" - "go.uber.org/zap" + "log/slog" ) type TerrorZone struct { @@ -104,10 +104,10 @@ func (a TerrorZone) buildTZAction(dstArea area.Area) action.Action { } if clearArea { - a.logger.Debug("Clearing TZ area", zap.Any("area", dstArea)) + a.logger.Debug("Clearing TZ area", slog.Any("area", dstArea)) actions = append(actions, a.builder.ClearArea(true, customTZEnemyFilter(config.Config.Game.TerrorZone.SkipOnImmunities...))) } else { - a.logger.Debug("TZ area skipped", zap.Any("area", dstArea)) + a.logger.Debug("TZ area skipped", slog.Any("area", dstArea)) } return actions diff --git a/internal/single_supervisor.go b/internal/single_supervisor.go index 0cf01a2b8..a2742de55 100644 --- a/internal/single_supervisor.go +++ b/internal/single_supervisor.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "log/slog" "math/rand" "time" @@ -12,7 +13,6 @@ import ( "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/run" - "go.uber.org/zap" ) type Supervisor interface { @@ -25,7 +25,7 @@ type SinglePlayerSupervisor struct { baseSupervisor } -func NewSinglePlayerSupervisor(logger *zap.Logger, bot *Bot, gr *reader.GameReader, gm *helper.GameManager) *SinglePlayerSupervisor { +func NewSinglePlayerSupervisor(logger *slog.Logger, bot *Bot, gr *reader.GameReader, gm *helper.GameManager) *SinglePlayerSupervisor { return &SinglePlayerSupervisor{ baseSupervisor: baseSupervisor{ logger: logger, diff --git a/internal/supervisor.go b/internal/supervisor.go index 58ea30d2b..282ec1394 100644 --- a/internal/supervisor.go +++ b/internal/supervisor.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "github.com/hectorgimenez/koolo/internal/memory" + "log/slog" "os" "syscall" "time" @@ -15,11 +16,10 @@ import ( "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/run" "github.com/lxn/win" - "go.uber.org/zap" ) type baseSupervisor struct { - logger *zap.Logger + logger *slog.Logger bot *Bot gr *reader.GameReader gm *helper.GameManager @@ -36,9 +36,9 @@ func (s *baseSupervisor) Stop() { func (s *baseSupervisor) updateGameStats() { if _, err := os.Stat("stats"); os.IsNotExist(err) { - err = os.MkdirAll("stats", 0700) + err = os.MkdirAll("stats", os.ModePerm) if err != nil { - s.logger.Error("Error creating stats directory", zap.Error(err)) + s.logger.Error("Error creating stats directory", slog.Any("error", err)) return } } @@ -46,7 +46,7 @@ func (s *baseSupervisor) updateGameStats() { fileName := fmt.Sprintf("stats/stats_%s.txt", stat.Status.ApplicationStartedAt.Format("2006-02-01-15_04_05")) f, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0644) if err != nil { - s.logger.Error("Error writing game stats", zap.Error(err)) + s.logger.Error("Error writing game stats", slog.Any("error", err)) return } w := bufio.NewWriter(f) @@ -87,7 +87,7 @@ func (s *baseSupervisor) updateGameStats() { ) _, err = w.WriteString(statsRun + "\n") if err != nil { - s.logger.Error("Error writing stats file", zap.Error(err)) + s.logger.Error("Error writing stats file", slog.Any("error", err)) } } diff --git a/internal/town/shop_manager.go b/internal/town/shop_manager.go index 02a53a93f..851d2850e 100644 --- a/internal/town/shop_manager.go +++ b/internal/town/shop_manager.go @@ -2,6 +2,7 @@ package town import ( "fmt" + "log/slog" "math/rand" "github.com/hectorgimenez/d2go/pkg/data" @@ -12,15 +13,14 @@ import ( "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/ui" - "go.uber.org/zap" ) type ShopManager struct { - logger *zap.Logger + logger *slog.Logger bm health.BeltManager } -func NewShopManager(logger *zap.Logger, bm health.BeltManager) ShopManager { +func NewShopManager(logger *slog.Logger, bm health.BeltManager) ShopManager { return ShopManager{ logger: logger, bm: bm, From c04250de7497c12595eb356681a961a354b60c55 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Mon, 12 Feb 2024 10:56:41 +0900 Subject: [PATCH 012/548] upgrade Go 1.22 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5c0d14eec..397f82532 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,9 +12,9 @@ jobs: - name: "Checkout" uses: actions/checkout@v4 - name: "Setup Go" - uses: actions/setup-go@v4 + uses: actions/setup-go@v5 with: - go-version: '1.21' + go-version: '1.22' - name: "Building Koolo artifacts" env: GOPATH: C:\go From 11e201f721401da35b318713b496c609e2ed42ed Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Mon, 12 Feb 2024 11:22:34 +0900 Subject: [PATCH 013/548] dependency cleanup --- go.mod | 3 +-- go.sum | 6 ++---- internal/memory/injection.go | 11 ++++------- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 2fde3e96b..f588ea100 100644 --- a/go.mod +++ b/go.mod @@ -6,9 +6,8 @@ require ( github.com/beefsack/go-astar v0.0.0-20200827232313-4ecf9e304482 github.com/bwmarrin/discordgo v0.27.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 - github.com/hectorgimenez/d2go v0.0.0-20240204054823-23600ecb0a6f + github.com/hectorgimenez/d2go v0.0.0-20240212022119-de5d7c115748 github.com/lxn/win v0.0.0-20210218163916-a377121e959e - github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9 golang.org/x/sync v0.6.0 golang.org/x/sys v0.17.0 gopkg.in/yaml.v3 v3.0.1 diff --git a/go.sum b/go.sum index fbc511907..250311fc6 100644 --- a/go.sum +++ b/go.sum @@ -9,16 +9,14 @@ github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/hectorgimenez/d2go v0.0.0-20240204054823-23600ecb0a6f h1:AEyTnBYVnxiGQEkYUDUeufrL83+SzRaMj/GKLSPPfrE= -github.com/hectorgimenez/d2go v0.0.0-20240204054823-23600ecb0a6f/go.mod h1:QXuKJYL7/gh0dnwHu/f8bqEWDAOy1QP51RV1I0mjUKM= +github.com/hectorgimenez/d2go v0.0.0-20240212022119-de5d7c115748 h1:e52sPiL5z5LqzxOZvDHy1VZG7hMZ0gFuGjrwgdQHRO8= +github.com/hectorgimenez/d2go v0.0.0-20240212022119-de5d7c115748/go.mod h1:UqWDuAc3lyiNo/zhBWa9J5ZecTYhg+3ljJoJB6vDoG8= github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc= github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9 h1:U8aCPFEMnxAEyj9IonhMVV1gSL4nzelh8uvoXp0hrq0= -github.com/winlabs/gowin32 v0.0.0-20221003142512-0d265587d3c9/go.mod h1:N51TYkG9JGR5sytj0EoPl31Xg2kuB507lxEmrwSNvfQ= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= diff --git a/internal/memory/injection.go b/internal/memory/injection.go index 3abb36e87..a04558238 100644 --- a/internal/memory/injection.go +++ b/internal/memory/injection.go @@ -5,8 +5,8 @@ import ( "encoding/binary" "errors" "fmt" + "github.com/hectorgimenez/d2go/pkg/memory" "github.com/lxn/win" - "github.com/winlabs/gowin32" "golang.org/x/sys/windows" "strings" "syscall" @@ -30,19 +30,16 @@ func InjectorInit(pid uint32) error { } handle = pHandle - modules, err := gowin32.GetProcessModules(pid) + modules, err := memory.GetProcessModules(pid) if err != nil { return fmt.Errorf("error getting process modules: %w", err) } - _, err = syscall.LoadLibrary("USER32.dll") - if err != nil { - return fmt.Errorf("error loading USER32.dll: %w", err) - } + syscall.MustLoadDLL("USER32.dll") for _, module := range modules { // GetCursorPos - if strings.EqualFold(module.ModuleName, "USER32.dll") { + if strings.Contains(strings.ToLower(module.ModuleName), "user32.dll") { getCursorPosAddr, err = syscall.GetProcAddress(module.ModuleHandle, "GetCursorPos") getKeyStateAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "GetKeyState") trackMouseEventAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "TrackMouseEvent") From aa04cc570606af84e41f2d878b36fd3997b82337 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Thu, 15 Feb 2024 21:54:41 +0900 Subject: [PATCH 014/548] waypoint autodiscovering fix --- config/config.yaml.dist | 2 +- internal/action/move.go | 2 +- internal/action/waypoint.go | 32 ++++++++++++++++---------------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/config/config.yaml.dist b/config/config.yaml.dist index d0301e99a..10bec9673 100644 --- a/config/config.yaml.dist +++ b/config/config.yaml.dist @@ -187,7 +187,7 @@ companion: leader: true leaderName: '' remote: discord # Only discord supported, telegram doesn't allow interacting between bots - gameNameTemplate: + gameNameTemplate: game- # Template for the game name, for example "game-" will lead to "game-1", "game-2", etc. # Gambling settings. If enabled, bot will start gambling when all the gold stash tabs are full. # While gold > 500k it will iterate over the items list trying to buy one of each item type. diff --git a/internal/action/move.go b/internal/action/move.go index 2f2b826e3..847e9d454 100644 --- a/internal/action/move.go +++ b/internal/action/move.go @@ -37,7 +37,7 @@ func (b *Builder) MoveToArea(dst area.Area, opts ...step.MoveToStepOption) *Chai toFun := func(d data.Data) (data.Position, bool) { if d.PlayerUnit.Area == dst { - b.logger.Debug("Already in area", slog.Any("area", dst)) + b.logger.Debug("Reached area", slog.Any("area", dst)) return data.Position{}, false } diff --git a/internal/action/waypoint.go b/internal/action/waypoint.go index 6d64d5b9d..94f435a25 100644 --- a/internal/action/waypoint.go +++ b/internal/action/waypoint.go @@ -7,6 +7,7 @@ import ( "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/hid" "log/slog" + "slices" ) const ( @@ -60,31 +61,25 @@ func (b *Builder) openWPAndSelectTab(a area.Area, d data.Data) Action { func (b *Builder) useWP(a area.Area) *Chain { return NewChain(func(d data.Data) (actions []Action) { - nextAvailableWP := area.WPAddresses[a] + finalDestination := a traverseAreas := make([]area.Area, 0) - for { - found := false - for _, wp := range d.PlayerUnit.AvailableWaypoints { - if wp == a { - found = true + currentWP := area.WPAddresses[a] + if !slices.Contains(d.PlayerUnit.AvailableWaypoints, a) { + for { + if slices.Contains(d.PlayerUnit.AvailableWaypoints, a) { break } + traverseAreas = append(traverseAreas, currentWP.LinkedFrom...) + currentWP = area.WPAddresses[currentWP.LinkedFrom[0]] + a = currentWP.LinkedFrom[0] } - - if found || nextAvailableWP.Row == 1 { - break - } - - traverseAreas = append(nextAvailableWP.LinkedFrom, traverseAreas...) - a = nextAvailableWP.LinkedFrom[0] - nextAvailableWP = area.WPAddresses[nextAvailableWP.LinkedFrom[0]] } // First use the previous available waypoint that we have discovered actions = append(actions, NewStepChain(func(d data.Data) []step.Step { return []step.Step{ step.SyncStep(func(d data.Data) error { - areaBtnY := wpListStartY + (nextAvailableWP.Row-1)*wpAreaBtnHeight + (wpAreaBtnHeight / 2) + areaBtnY := wpListStartY + (currentWP.Row-1)*wpAreaBtnHeight + (wpAreaBtnHeight / 2) hid.Click(hid.LeftButton, wpListPositionX, areaBtnY) helper.Sleep(1000) @@ -93,7 +88,12 @@ func (b *Builder) useWP(a area.Area) *Chain { } })) - traverseAreas = append(traverseAreas, a) + // We have the WP discovered, just use it + if len(traverseAreas) == 0 { + return actions + } + + traverseAreas = append(traverseAreas, finalDestination) // Next keep traversing all the areas from the previous available waypoint until we reach the destination, trying to discover WPs during the way b.logger.Info("Traversing areas to reach destination", slog.Any("areas", traverseAreas)) From ee651b1f0cc45ea5ffcd01e97203c0f5682c13c5 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Mon, 19 Feb 2024 23:03:19 +0900 Subject: [PATCH 015/548] add game password and change the way game name/pwd is introduced --- build.bat | 2 +- config/config.yaml.dist | 1 + internal/character/hammerdin.go | 4 +- internal/companion_supervisor.go | 2 +- internal/config/config.go | 1 + internal/helper/game_manager.go | 43 ++++++++++++++-------- internal/hid/keyboard.go | 63 ++++++++++++++------------------ internal/pather/path.go | 2 +- internal/run/tristram.go | 2 +- 9 files changed, 62 insertions(+), 58 deletions(-) diff --git a/build.bat b/build.bat index 6d40def56..3aacd9e87 100644 --- a/build.bat +++ b/build.bat @@ -5,7 +5,7 @@ echo Cleaning up previous artifacts... if exist build rmdir /s /q build > NUL || goto :error echo Building Koolo binary... -go build -trimpath -tags static --ldflags -extldflags="-static" -o build/koolo.exe ./cmd/koolo/main.go > NUL || goto :error +go build -trimpath -tags static --ldflags -extldflags="-static" -ldflags="-s -w" -o build/koolo.exe ./cmd/koolo/main.go > NUL || goto :error echo Copying assets... mkdir build\config > NUL || goto :error diff --git a/config/config.yaml.dist b/config/config.yaml.dist index 10bec9673..f6c8b04cf 100644 --- a/config/config.yaml.dist +++ b/config/config.yaml.dist @@ -188,6 +188,7 @@ companion: leaderName: '' remote: discord # Only discord supported, telegram doesn't allow interacting between bots gameNameTemplate: game- # Template for the game name, for example "game-" will lead to "game-1", "game-2", etc. + gamePassword: xxx # Gambling settings. If enabled, bot will start gambling when all the gold stash tabs are full. # While gold > 500k it will iterate over the items list trying to buy one of each item type. diff --git a/internal/character/hammerdin.go b/internal/character/hammerdin.go index c32d04634..f5efa25d3 100644 --- a/internal/character/hammerdin.go +++ b/internal/character/hammerdin.go @@ -171,7 +171,7 @@ func (s Hammerdin) KillCouncil() action.Action { }) for _, m := range councilMembers { - for i := 0; i < hammerdinMaxAttacksLoop; i++ { + for range hammerdinMaxAttacksLoop { steps = append(steps, step.PrimaryAttack( m.UnitID, @@ -198,7 +198,7 @@ func (s Hammerdin) killMonster(npc npc.ID, t data.MonsterType) action.Action { } helper.Sleep(100) - for i := 0; i < hammerdinMaxAttacksLoop; i++ { + for range hammerdinMaxAttacksLoop { steps = append(steps, step.PrimaryAttack( m.UnitID, diff --git a/internal/companion_supervisor.go b/internal/companion_supervisor.go index 4c369630e..4dabaa264 100644 --- a/internal/companion_supervisor.go +++ b/internal/companion_supervisor.go @@ -66,7 +66,7 @@ func (s *CompanionSupervisor) Start(ctx context.Context, factory *run.Factory) e continue } - event.Events <- event.Text(fmt.Sprintf("New game created. GameName: " + gameName + "|||x")) + event.Events <- event.Text(fmt.Sprintf("New game created. GameName: " + gameName + "|||" + config.Config.Companion.GamePassword)) err = s.startBot(ctx, factory.BuildRuns(), firstRun) firstRun = false diff --git a/internal/config/config.go b/internal/config/config.go index bcc913cc3..5371310e0 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -128,6 +128,7 @@ type StructConfig struct { LeaderName string `yaml:"leaderName"` Remote string `yaml:"remote"` GameNameTemplate string `yaml:"gameNameTemplate"` + GamePassword string `yaml:"gamePassword"` } `yaml:"companion"` Gambling struct { Enabled bool `yaml:"enabled"` diff --git a/internal/helper/game_manager.go b/internal/helper/game_manager.go index 2d0e87a4b..b70f93af0 100644 --- a/internal/helper/game_manager.go +++ b/internal/helper/game_manager.go @@ -22,7 +22,7 @@ func (gm *GameManager) ExitGame() error { hid.PressKey("esc") hid.Click(hid.LeftButton, hid.GameAreaSizeX/2, int(float64(hid.GameAreaSizeY)/2.2)) - for i := 0; i < 5; i++ { + for range 5 { if !gm.gr.InGame() { return nil } @@ -31,11 +31,11 @@ func (gm *GameManager) ExitGame() error { // If we are still in game, probably character is dead, so let's do it nicely. // Probably closing the socket is more reliable, but was not working properly for me on singleplayer. - for i := 0; i < 10; i++ { + for range 10 { if gm.gr.GetData(false).OpenMenus.QuitMenu { hid.Click(hid.LeftButton, hid.GameAreaSizeX/2, int(float64(hid.GameAreaSizeY)/2.2)) - for i := 0; i < 5; i++ { + for range 5 { if !gm.gr.InGame() { return nil } @@ -54,7 +54,7 @@ func (gm *GameManager) NewGame() error { return errors.New("character still in a game") } - for i := 0; i < 30; i++ { + for range 30 { gm.gr.InGame() if gm.gr.InCharacterSelectionScreen() { Sleep(2000) // Wait for character selection screen to load @@ -77,7 +77,7 @@ func (gm *GameManager) NewGame() error { Sleep(250) hid.Click(hid.LeftButton, createX, createY) - for i := 0; i < 30; i++ { + for range 30 { if gm.gr.InGame() { return nil } @@ -87,6 +87,12 @@ func (gm *GameManager) NewGame() error { return errors.New("error creating game! Timeout") } +func (gm *GameManager) clearGameNameOrPasswordField() { + for range 16 { + hid.PressKey("backspace") + } +} + func (gm *GameManager) CreateOnlineGame(gameCounter int) (string, error) { // Enter bnet lobby hid.Click(hid.LeftButton, 744, 650) @@ -97,21 +103,26 @@ func (gm *GameManager) CreateOnlineGame(gameCounter int) (string, error) { Sleep(200) // Click the game name textbox, delete text and type new game name - hid.Click(hid.LeftButton, 925, 116) - hid.PressKeyCombination("lctrl", "a") + hid.Click(hid.LeftButton, 1000, 116) + gm.clearGameNameOrPasswordField() gameName := config.Config.Companion.GameNameTemplate + fmt.Sprintf("%d", gameCounter) for _, ch := range gameName { hid.PressKey(fmt.Sprintf("%c", ch)) } // Same for password - hid.Click(hid.LeftButton, 925, 161) + hid.Click(hid.LeftButton, 1000, 161) Sleep(200) - hid.PressKeyCombination("lctrl", "a") - hid.PressKey("x") + gamePassword := config.Config.Companion.GamePassword + if gamePassword != "" { + gm.clearGameNameOrPasswordField() + for _, ch := range gamePassword { + hid.PressKey(fmt.Sprintf("%c", ch)) + } + } hid.PressKey("enter") - for i := 0; i < 30; i++ { + for range 30 { if gm.gr.InGame() { return gameName, nil } @@ -131,25 +142,25 @@ func (gm *GameManager) JoinOnlineGame(gameName, password string) error { Sleep(200) // Click the game name textbox, delete text and type new game name - hid.Click(hid.LeftButton, 836, 100) + hid.Click(hid.LeftButton, 950, 100) Sleep(200) - hid.PressKeyCombination("lctrl", "a") + gm.clearGameNameOrPasswordField() Sleep(200) for _, ch := range gameName { hid.PressKey(fmt.Sprintf("%c", ch)) } // Same for password - hid.Click(hid.LeftButton, 1020, 100) + hid.Click(hid.LeftButton, 1130, 100) Sleep(200) - hid.PressKeyCombination("lctrl", "a") + gm.clearGameNameOrPasswordField() Sleep(200) for _, ch := range password { hid.PressKey(fmt.Sprintf("%c", ch)) } hid.PressKey("enter") - for i := 0; i < 30; i++ { + for range 30 { if gm.gr.InGame() { return nil } diff --git a/internal/hid/keyboard.go b/internal/hid/keyboard.go index 1a5056a29..d651ab2ee 100644 --- a/internal/hid/keyboard.go +++ b/internal/hid/keyboard.go @@ -31,16 +31,6 @@ func KeyUp(key string) { win.PostMessage(memory.HWND, win.WM_KEYUP, getASCIICode(key), 0) } -func PressKeyCombination(keys ...string) { - for _, k := range keys { - win.PostMessage(memory.HWND, win.WM_KEYDOWN, getASCIICode(k), 0) - } - time.Sleep(time.Millisecond * 200) - for _, k := range keys { - win.PostMessage(memory.HWND, win.WM_KEYUP, getASCIICode(k), 0) - } -} - func getASCIICode(key string) uintptr { if len(key) == 1 { return uintptr(strings.ToUpper(key)[0]) @@ -50,30 +40,31 @@ func getASCIICode(key string) uintptr { } var specialChars = map[string]uintptr{ - "esc": win.VK_ESCAPE, - "enter": win.VK_RETURN, - "f1": win.VK_F1, - "f2": win.VK_F2, - "f3": win.VK_F3, - "f4": win.VK_F4, - "f5": win.VK_F5, - "f6": win.VK_F6, - "f7": win.VK_F7, - "f8": win.VK_F8, - "f9": win.VK_F9, - "f10": win.VK_F10, - "f11": win.VK_F11, - "f12": win.VK_F12, - "lctrl": win.VK_LCONTROL, - "home": win.VK_HOME, - "down": win.VK_DOWN, - "up": win.VK_UP, - "left": win.VK_LEFT, - "right": win.VK_RIGHT, - "tab": win.VK_TAB, - "space": win.VK_SPACE, - "alt": win.VK_MENU, - "lalt": win.VK_LMENU, - "ralt": win.VK_RMENU, - "shift": win.VK_LSHIFT, + "esc": win.VK_ESCAPE, + "enter": win.VK_RETURN, + "f1": win.VK_F1, + "f2": win.VK_F2, + "f3": win.VK_F3, + "f4": win.VK_F4, + "f5": win.VK_F5, + "f6": win.VK_F6, + "f7": win.VK_F7, + "f8": win.VK_F8, + "f9": win.VK_F9, + "f10": win.VK_F10, + "f11": win.VK_F11, + "f12": win.VK_F12, + "lctrl": win.VK_LCONTROL, + "home": win.VK_HOME, + "down": win.VK_DOWN, + "up": win.VK_UP, + "left": win.VK_LEFT, + "right": win.VK_RIGHT, + "tab": win.VK_TAB, + "space": win.VK_SPACE, + "alt": win.VK_MENU, + "lalt": win.VK_LMENU, + "ralt": win.VK_RMENU, + "shift": win.VK_LSHIFT, + "backspace": win.VK_BACK, } diff --git a/internal/pather/path.go b/internal/pather/path.go index 4bd96032e..7a5437604 100644 --- a/internal/pather/path.go +++ b/internal/pather/path.go @@ -27,7 +27,7 @@ func (p *Pather) Intersects(d data.Data, position data.Position, padding int) bo pT := path.(*Tile) xMatch := false yMatch := false - for i := 0; i < padding; i++ { + for i := range padding { if pT.X == position.X+i || pT.X == position.X-i { xMatch = true } diff --git a/internal/run/tristram.go b/internal/run/tristram.go index 15d1a107a..91d201bc9 100644 --- a/internal/run/tristram.go +++ b/internal/run/tristram.go @@ -85,7 +85,7 @@ func (a Tristram) openPortalIfNotOpened() action.Action { } // We don't know which order the stones are, so we activate all of them one by one in sequential order, 5 times - for i := 0; i < 5; i++ { + for range 5 { for _, cainStone := range []object.Name{ object.CairnStoneAlpha, object.CairnStoneBeta, From 1f4309908025ee3ac6b5892058cb0e8187df5ad8 Mon Sep 17 00:00:00 2001 From: 13413j1j13j5315n13 <70957358+13413j1j13j5315n13@users.noreply.github.com> Date: Sat, 24 Feb 2024 05:50:55 +0200 Subject: [PATCH 016/548] Enhance companion run with follower logic (#77) --- internal/run/companion.go | 164 ++++++++++++++++++++++++++++++-------- internal/town/A1.go | 5 ++ internal/town/A2.go | 5 ++ internal/town/A3.go | 5 ++ internal/town/A4.go | 5 ++ internal/town/A5.go | 5 ++ internal/town/town.go | 1 + 7 files changed, 155 insertions(+), 35 deletions(-) diff --git a/internal/run/companion.go b/internal/run/companion.go index 68082ba0c..f44ffd807 100644 --- a/internal/run/companion.go +++ b/internal/run/companion.go @@ -1,16 +1,20 @@ package run import ( - "time" - + "fmt" "github.com/hectorgimenez/d2go/pkg/data" - "github.com/hectorgimenez/d2go/pkg/data/area" + "github.com/hectorgimenez/d2go/pkg/data/item" + "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/pather" "github.com/hectorgimenez/koolo/internal/town" + "time" ) +var lastEntranceEntered = time.Now() + type Companion struct { baseRun } @@ -19,47 +23,137 @@ func (s Companion) Name() string { return "Companion" } -func (s Companion) BuildActions() (actions []action.Action) { - actions = append(actions, s.builder.MoveTo(func(d data.Data) (data.Position, bool) { - tpArea := town.GetTownByArea(d.PlayerUnit.Area).TPWaitingArea(d) - - return tpArea, true - })) - - // Wait for the portal, once it's up, enter and wait - portalFound := false - actions = append(actions, action.NewStepChain(func(d data.Data) []step.Step { - if !portalFound { - for _, o := range d.Objects { - if o.IsPortal() { - portalFound = true - return []step.Step{ - step.MoveTo(o.Position), - step.InteractObject(o.Name, func(d data.Data) bool { - return !d.PlayerUnit.Area.IsTown() +func (s Companion) BuildActions() []action.Action { + return []action.Action{ + action.NewChain(func(d data.Data) []action.Action { + leaderRosterMember, leaderFound := d.Roster.FindByName(config.Config.Companion.LeaderName) + if !leaderFound { + s.logger.Warn(fmt.Sprintf("Leader not found: %s", config.Config.Companion.LeaderName)) + return []action.Action{} + } + + // Leader is NOT in the same act + if leaderRosterMember.Area.Act() != d.PlayerUnit.Area.Act() { + _, foundPortal := getClosestPortal(d) + + // Follower is NOT in town + if !d.PlayerUnit.Area.IsTown() { + + // Portal is found nearby + if foundPortal { + return []action.Action{ + s.builder.UsePortalInTown(), + } + } + + // Portal is not found nearby + if hasEnoughPortals(d) { + return []action.Action{ + s.builder.ReturnTown(), + } + } + + // there is NO portal open and follower does NOT have enough portals. Just exit + return []action.Action{} + } + + // Follower is in town. Just change the act + return []action.Action{ + s.builder.WayPoint(town.GetTownByArea(leaderRosterMember.Area).TownArea()), + } + } + + // Is leader too far away? + if pather.DistanceFromMe(d, leaderRosterMember.Position) > 100 { + // In some cases this "follower in town -> use portal -> follower outside town -> use portal" + // loop can go on forever. But it is responsibility of a leader to not cause it... + + _, foundPortal := getClosestPortal(d) + + // Follower in town + if d.PlayerUnit.Area.IsTown() { + if foundPortal { + return []action.Action{ + s.builder.UsePortalInTown(), + } + } + + // Go to TP waiting area + return []action.Action{ + s.builder.MoveTo(func(d data.Data) (data.Position, bool) { + tpArea := town.GetTownByArea(d.PlayerUnit.Area).TPWaitingArea(d) + return tpArea, true }), } } + + // If we have an entrance, use it + entrance, entranceFound := getClosestEntrances(d) + if entranceFound && leaderRosterMember.Area == entrance.Area && time.Since(lastEntranceEntered) > (time.Second*4) { + lastEntranceEntered = time.Now() + + return []action.Action{ + s.builder.MoveToArea(entrance.Area), + } + } + + // If we have portal open, use it + if foundPortal { + return []action.Action{ + s.builder.UsePortalInTown(), + } + } + + // Otherwise just wait + return []action.Action{ + s.builder.Wait(100), + } } - return []step.Step{step.Wait(time.Second)} - } + // Leader too close + if pather.DistanceFromMe(d, leaderRosterMember.Position) < 4 { + // TODO: Implement attack sequence while we're very close to the leader? + // For now just do nothing + return []action.Action{ + s.builder.Wait(100), + } + } - return nil - })) + return []action.Action{ + action.NewStepChain(func(d data.Data) []step.Step { + return []step.Step{step.MoveTo(leaderRosterMember.Position, step.WithTimeout(time.Millisecond*500))} + }), + } + }, action.RepeatUntilNoSteps()), + } +} - actions = append(actions, action.NewChain(func(d data.Data) []action.Action { - rm, found := d.Roster.FindByName(config.Config.Companion.LeaderName) - if !found { - return nil +func getClosestPortal(d data.Data) (*data.Object, bool) { + for _, o := range d.Objects { + if o.IsPortal() && pather.DistanceFromMe(d, o.Position) <= 20 { + return &o, true } + } - if d.PlayerUnit.Area == area.ThroneOfDestruction { - return []action.Action{s.builder.Wait(time.Second)} - } + return nil, false +} + +func hasEnoughPortals(d data.Data) bool { + portalTome, pFound := d.Items.Find(item.TomeOfTownPortal, item.LocationInventory) + if pFound { + return portalTome.Stats[stat.Quantity].Value > 0 + } - return []action.Action{s.builder.MoveToCoords(rm.Position)} - })) + return false +} + +func getClosestEntrances(d data.Data) (*data.Level, bool) { + for _, l := range d.AdjacentLevels { + distFromMe := pather.DistanceFromMe(d, l.Position) + if distFromMe <= 20 { + return &l, true + } + } - return actions + return nil, false } diff --git a/internal/town/A1.go b/internal/town/A1.go index 181bc6703..6f57f8b9c 100644 --- a/internal/town/A1.go +++ b/internal/town/A1.go @@ -2,6 +2,7 @@ package town import ( "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/npc" ) @@ -33,3 +34,7 @@ func (a A1) TPWaitingArea(d data.Data) data.Position { return cain.Positions[0] } + +func (a A1) TownArea() area.Area { + return area.RogueEncampment +} diff --git a/internal/town/A2.go b/internal/town/A2.go index d7a05c885..061b52a27 100644 --- a/internal/town/A2.go +++ b/internal/town/A2.go @@ -2,6 +2,7 @@ package town import ( "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/npc" ) @@ -34,3 +35,7 @@ func (a A2) TPWaitingArea(_ data.Data) data.Position { Y: 5059, } } + +func (a A2) TownArea() area.Area { + return area.LutGholein +} diff --git a/internal/town/A3.go b/internal/town/A3.go index 8a42315d6..86c41902a 100644 --- a/internal/town/A3.go +++ b/internal/town/A3.go @@ -2,6 +2,7 @@ package town import ( "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/npc" ) @@ -34,3 +35,7 @@ func (a A3) TPWaitingArea(_ data.Data) data.Position { Y: 5068, } } + +func (a A3) TownArea() area.Area { + return area.KurastDocks +} diff --git a/internal/town/A4.go b/internal/town/A4.go index 23bd6d759..8377c38fd 100644 --- a/internal/town/A4.go +++ b/internal/town/A4.go @@ -2,6 +2,7 @@ package town import ( "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/npc" ) @@ -34,3 +35,7 @@ func (a A4) TPWaitingArea(_ data.Data) data.Position { Y: 5033, } } + +func (a A4) TownArea() area.Area { + return area.ThePandemoniumFortress +} diff --git a/internal/town/A5.go b/internal/town/A5.go index cd939febe..b349952fb 100644 --- a/internal/town/A5.go +++ b/internal/town/A5.go @@ -2,6 +2,7 @@ package town import ( "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/npc" ) @@ -34,3 +35,7 @@ func (a A5) TPWaitingArea(_ data.Data) data.Position { Y: 5019, } } + +func (a A5) TownArea() area.Area { + return area.Harrogath +} diff --git a/internal/town/town.go b/internal/town/town.go index dbe8a8ca6..af5ad7718 100644 --- a/internal/town/town.go +++ b/internal/town/town.go @@ -13,6 +13,7 @@ type Town interface { MercContractorNPC() npc.ID GamblingNPC() npc.ID TPWaitingArea(d data.Data) data.Position + TownArea() area.Area } func GetTownByArea(a area.Area) Town { From 563318408bfe57df603c3d8ae74d4852d8b348c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Gim=C3=A9nez?= Date: Wed, 13 Mar 2024 22:00:32 +0900 Subject: [PATCH 017/548] GUI & Multiclient (#91) --- .gitignore | 3 +- README.md | 15 +- assets/koolo.webp | Bin 0 -> 563308 bytes build.bat | 9 +- cmd/koolo/koolo.exe.manifest | 17 ++ cmd/koolo/koolo.ico | Bin 0 -> 403954 bytes cmd/koolo/main.go | 106 +++------ cmd/koolo/rsrc_windows_amd64.syso | Bin 0 -> 405304 bytes cmd/memory/main.go | 72 ------ cmd/pickup/main.go | 67 ------ config/koolo.yaml.dist | 19 ++ .../config.yaml} | 23 +- config/{ => template}/pickit/crafted.nip | 0 config/{ => template}/pickit/magic.nip | 0 config/{ => template}/pickit/misc.nip | 0 config/{ => template}/pickit/rare.nip | 0 config/{ => template}/pickit/set.nip | 0 config/{ => template}/pickit/unid.nip | 0 config/{ => template}/pickit/unique.nip | 0 config/{ => template}/pickit/white.nip | 0 .../pickit_leveling/leveling.nip | 16 ++ .../{ => template}/pickit_leveling/quest.nip | 0 go.mod | 10 +- go.sum | 29 ++- internal/action/action.go | 5 +- internal/action/action_builder.go | 23 +- internal/action/action_chain.go | 7 +- internal/action/action_step_chain.go | 8 +- internal/action/buff.go | 25 +- internal/action/clear_area.go | 2 +- internal/action/clear_level.go | 20 +- internal/action/gambling.go | 23 +- internal/action/heal.go | 7 +- internal/action/horadric_cube.go | 30 +-- internal/action/identify.go | 26 +- internal/action/item_pickup.go | 15 +- internal/action/leveling_tools.go | 49 ++-- internal/action/move.go | 35 ++- internal/action/pre_run.go | 4 +- internal/action/recover_corpse.go | 13 +- internal/action/repair.go | 7 +- internal/action/revive_merc.go | 7 +- internal/action/stash.go | 63 +++-- internal/action/step/attack.go | 52 ++-- internal/action/step/interact_entrance.go | 13 +- internal/action/step/interact_npc.go | 15 +- internal/action/step/interact_object.go | 15 +- internal/action/step/key_sequence.go | 8 +- internal/action/step/move_to.go | 26 +- internal/action/step/open_portal.go | 20 +- internal/action/step/pickup_item.go | 15 +- internal/action/step/step.go | 5 +- internal/action/step/swap_weapon.go | 17 +- internal/action/step/sync_action.go | 9 +- internal/action/step/wait.go | 5 +- internal/action/tp_actions.go | 2 +- internal/action/vendor.go | 10 +- internal/action/waypoint.go | 8 +- internal/action/waypoint_discover.go | 9 +- internal/bot.go | 50 ++-- internal/character/blizzard_sorceress.go | 15 +- internal/character/character.go | 18 +- internal/character/hammerdin.go | 14 +- internal/character/lightning_sorceress.go | 15 +- internal/character/paladin_leveling.go | 19 +- internal/character/sorceress_leveling.go | 49 ++-- internal/companion_supervisor.go | 111 ++++----- internal/config/config.go | 122 ++++++++-- internal/container/container.go | 20 ++ internal/event/event.go | 135 +++++++++-- internal/event/listener.go | 24 +- internal/event/stat/game_stats.go | 102 -------- internal/game/handle_killer.go | 32 +++ internal/game/hid.go | 13 + internal/{hid => game}/keyboard.go | 21 +- internal/game/manager.go | 224 ++++++++++++++++++ .../{reader => game}/map_client/client.go | 2 +- internal/{reader => game}/map_client/data.go | 0 .../{reader => game}/map_client/structures.go | 0 internal/game/memory_injector.go | 159 +++++++++++++ internal/game/memory_reader.go | 109 +++++++++ internal/{hid => game}/mouse.go | 55 ++--- internal/{helper => game}/screenshot.go | 27 +-- internal/health/belt_manager.go | 74 +++--- internal/health/health_manager.go | 16 +- internal/helper/game_manager.go | 175 -------------- internal/helper/image.go | 17 ++ internal/helper/ingame.go | 5 +- internal/helper/windows.go | 9 + internal/manager.go | 145 ++++++++++++ internal/memory/injection.go | 150 ------------ internal/pather/data.bin | Bin 1010104 -> 0 bytes internal/pather/path_finder.go | 68 +++--- internal/pather/path_finding_tools.go | 12 + internal/reader/reader.go | 69 ------ internal/remote/discord/discord_bot.go | 55 ++--- .../remote/discord/discord_event_handler.go | 10 +- internal/remote/telegram/telegram_bot.go | 64 +++-- .../remote/telegram/telegram_event_handler.go | 12 +- internal/run/ancient_tunnels.go | 5 +- internal/run/arachnid_lair.go | 5 +- internal/run/baal.go | 5 +- internal/run/companion.go | 7 +- internal/run/diablo.go | 9 +- internal/run/leveling.go | 2 - internal/run/leveling_act1.go | 13 +- internal/run/leveling_act2.go | 26 +- internal/run/leveling_act3.go | 13 +- internal/run/leveling_act5.go | 19 +- internal/run/mephisto.go | 7 +- internal/run/nihlathak.go | 7 +- internal/run/pit.go | 5 +- internal/run/run.go | 47 ++-- internal/run/stony_tomb.go | 5 +- internal/run/terror_zone.go | 11 +- internal/run/tristram.go | 9 +- internal/server/assets/css/custom.css | 8 + internal/server/assets/css/pico.min.css | 4 + internal/server/http_server.go | 158 ++++++++++++ internal/server/template_parameters.go | 22 ++ internal/server/templates/admin_required.html | 18 ++ .../server/templates/character_settings.html | 40 ++++ internal/server/templates/config.html | 53 +++++ internal/server/templates/index.html | 71 ++++++ internal/single_supervisor.go | 116 +++++---- internal/stats.go | 195 +++++++++++++++ internal/supervisor.go | 180 ++++++-------- internal/town/shop_manager.go | 32 +-- internal/ui/coordinates.go | 7 - tools/handle64.exe | Bin 0 -> 416144 bytes koolo-map.exe => tools/koolo-map.exe | Bin 131 files changed, 2548 insertions(+), 1752 deletions(-) create mode 100644 assets/koolo.webp create mode 100644 cmd/koolo/koolo.exe.manifest create mode 100644 cmd/koolo/koolo.ico create mode 100644 cmd/koolo/rsrc_windows_amd64.syso delete mode 100644 cmd/memory/main.go delete mode 100644 cmd/pickup/main.go create mode 100644 config/koolo.yaml.dist rename config/{config.yaml.dist => template/config.yaml} (93%) rename config/{ => template}/pickit/crafted.nip (100%) rename config/{ => template}/pickit/magic.nip (100%) rename config/{ => template}/pickit/misc.nip (100%) rename config/{ => template}/pickit/rare.nip (100%) rename config/{ => template}/pickit/set.nip (100%) rename config/{ => template}/pickit/unid.nip (100%) rename config/{ => template}/pickit/unique.nip (100%) rename config/{ => template}/pickit/white.nip (100%) rename config/{ => template}/pickit_leveling/leveling.nip (70%) rename config/{ => template}/pickit_leveling/quest.nip (100%) create mode 100644 internal/container/container.go delete mode 100644 internal/event/stat/game_stats.go create mode 100644 internal/game/handle_killer.go create mode 100644 internal/game/hid.go rename internal/{hid => game}/keyboard.go (72%) create mode 100644 internal/game/manager.go rename internal/{reader => game}/map_client/client.go (97%) rename internal/{reader => game}/map_client/data.go (100%) rename internal/{reader => game}/map_client/structures.go (100%) create mode 100644 internal/game/memory_injector.go create mode 100644 internal/game/memory_reader.go rename internal/{hid => game}/mouse.go (52%) rename internal/{helper => game}/screenshot.go (72%) delete mode 100644 internal/helper/game_manager.go create mode 100644 internal/helper/image.go create mode 100644 internal/helper/windows.go create mode 100644 internal/manager.go delete mode 100644 internal/memory/injection.go delete mode 100644 internal/pather/data.bin delete mode 100644 internal/reader/reader.go create mode 100644 internal/server/assets/css/custom.css create mode 100644 internal/server/assets/css/pico.min.css create mode 100644 internal/server/http_server.go create mode 100644 internal/server/template_parameters.go create mode 100644 internal/server/templates/admin_required.html create mode 100644 internal/server/templates/character_settings.html create mode 100644 internal/server/templates/config.html create mode 100644 internal/server/templates/index.html create mode 100644 internal/stats.go create mode 100644 tools/handle64.exe rename koolo-map.exe => tools/koolo-map.exe (100%) diff --git a/.gitignore b/.gitignore index 0c2956bb3..af221a871 100644 --- a/.gitignore +++ b/.gitignore @@ -3,5 +3,4 @@ /stats /screenshots /logs -/config/*.yaml -/config/*.yml \ No newline at end of file +/config/*.yaml \ No newline at end of file diff --git a/README.md b/README.md index 7231829fa..dbfb3a6a3 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ Koolo is a small bot for Diablo II: Resurrected. Koolo project was built for informational and educational purposes only, it's not intended for online usage. Feel free to contribute opening pull requests with new features or bugfixes. +Koolo reads game memory and interacts with the game injecting clicks/keystrokes to the game window. ## Disclaimer Can I get banned for using Koolo? The answer is a crystal clear yes, you can get banned although at this point I'm @@ -30,11 +31,11 @@ not aware of any ban for using it. I'm not responsible for any ban or any other ## Requirements - Diablo II: Resurrected -- Diablo II: LOD 1.13c (required by https://github.com/blacha/diablo2/tree/master/packages/map) +- **Diablo II: LOD 1.13c** (IMPORTANT: It will **NOT** work without it, this step is not optional) ## Quick Start - If you haven't done yet, install **Diablo II: LOD 1.13c** -- [Download](https://github.com/hectorgimenez/koolo/releases) the latest Koolo release, or alternatively you can [build it from source](#development-environment) +- [Download](https://github.com/hectorgimenez/koolo/releases) the latest Koolo release (recommended for most users), or alternatively you can [build it from source](#development-environment) - Extract the zip file in a directory of your choice. - Open `config/config.yaml` with your favorite text editor and ensure `D2LoDPath` config is pointing to your **Diablo II: LOD 1.13c** installation directory. - Configure custom bot settings under `config/config.yaml` and `config/pickit/*.nip` files for pickit rules. @@ -42,21 +43,13 @@ not aware of any ban for using it. I'm not responsible for any ban or any other - Enter the game with your character. - Run `koolo.exe`. -## How it works -Koolo reads game memory and interacts with the game injecting clicks/keystrokes to the game window. -It uses the following third party libraries: - -- https://github.com/hectorgimenez/d2go -- https://github.com/hectorgimenez/diablo2 (forked - from [blacha's repo](https://github.com/blacha/diablo2/tree/master/packages/map)) - ## Development environment **Note:** This is only required if you want to build the project from source. If you want to run the bot, you can just download the [latest release](https://github.com/hectorgimenez/koolo/releases). Setting the development environment is pretty straightforward, but the following dependencies are **required** to build the project. ### Dependencies -- [Download Go >= 1.21](https://go.dev/dl/) +- [Download Go >= 1.22](https://go.dev/dl/) - [Install git](https://gitforwindows.org/) ### Building from source diff --git a/assets/koolo.webp b/assets/koolo.webp new file mode 100644 index 0000000000000000000000000000000000000000..40d4ed138822a103691ab5ddadc088c050d20a3b GIT binary patch literal 563308 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%0At2^ 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

$!ygGKgnL-^z&u1h5yj`!l^XR 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]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�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�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

&HRccfB zmgkpkZ*^?COc+e@AvCo#CJcQm^XZ(fMAXWnQz1Y&#LIxl$O|w=S6A_waV?6ZfPu5a zDH>QXG5{v?_U1ho=dOOa9MBg#8TM_9-Hn)%bapuYzAD)42?}bUgavEZJ+9@ zp#C7Pk9fY8*EdyXda&_nwWIPrA#NDdwm<+Il9@D9`R!2S4CA<=t3=7_<~CWoJU=qs zZn>W_R{USRgMX~^FQNmrq)X3Cg9kfIPz)UMTixFa-iwUlVSLF__tkWH{mbJ}#(6y7P8#><3nq|had3d1-}xPVdGNZ^su$uB*r6$CHKd15jM)_EWV;Q2`*y9d`z&dKctUxE(~`kHY$U~csf-^mK+BfUL_<&CcxtP;|yRPL`Ic`lTtoJ;!F zA-#T8RaTOeH4zv=AY-$jWfL~cJ5%J8ey_k~X?Yy2Eqvd-=iSsx>*WBjf+B*N-@!A+7|ZCX*qt8M`jC4YrDE@BSiOMb5pvF%5I`AvEHI#)Og41&1-g z7$hjAJE9{|<4$%*?$7RWzw^IM`%cZ+P}ph9XR-J_-$#SDMurhu6jBK3kt6xppSv`G zI&uVT?x~~>lvOjw#p!D@vv0NUvKR)$7{Ydvm`|s0Op8Bn^UN{fNjWh`O zehh}BWS`{aNMC;#%|9Fe-J@7$j7qZ03=Boax1{1A za9X`OxUzHl*nI}~u2wT6sByHT44hW=r!(ng^(r~9mJu^~O9~%=d_xT%0Ej?}Y)6f+ zO*+_iZ@U+Jt;SwLKm&bWMAT?jz6Pw(W3Y~CzKNYxo>DQH795EE2u4lo8~k}F0#H=y<@$q zx&J-o<518LfRKW_0WP`rF%o=>ey8j^etxcJkabpiEPl$bGkDP!G%euE=n?}>06siC zJOqX8#*&3?hb#~aGEfRqRBO#f{5jbi)4oV9`ln^06dN?EBtirNkZm^3H(fVXsV#Mf zP1eu7Xj#6XtTJ=-mA^dd=c5-R(FxbMML`b$Sk_F1G+~|J8pRphfV~9Tc5k+XP7vIJ zJ8Xk1sG$YdY{8`I0jdEPf$oDzOvA`a8H)oOkc6c%0D@q3iWF^{N=kA%?su&3)Q-Fl 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 NUL || goto :error echo Building Koolo binary... -go build -trimpath -tags static --ldflags -extldflags="-static" -ldflags="-s -w" -o build/koolo.exe ./cmd/koolo/main.go > NUL || goto :error +go build -trimpath -tags static --ldflags -extldflags="-static" -ldflags="-s -w -H windowsgui" -o build/koolo.exe ./cmd/koolo > NUL || goto :error echo Copying assets... mkdir build\config > NUL || goto :error -copy config\config.yaml.dist build\config\config.yaml > NUL || goto :error -xcopy /q /E /I /y config\pickit build\config\pickit > NUL || goto :error -xcopy /q /E /I /y config\pickit_leveling build\config\pickit_leveling > NUL || goto :error -xcopy /q /y koolo-map.exe build > NUL || goto :error +copy config\koolo.yaml.dist build\config\koolo.yaml > NUL || goto :error +xcopy /q /E /I /y config\template build\config\template > NUL || goto :error +xcopy /q /E /I /y tools build\tools > NUL || goto :error xcopy /q /y README.md build > NUL || goto :error echo Done! Artifacts are in build directory. diff --git a/cmd/koolo/koolo.exe.manifest b/cmd/koolo/koolo.exe.manifest new file mode 100644 index 000000000..e5542863c --- /dev/null +++ b/cmd/koolo/koolo.exe.manifest @@ -0,0 +1,17 @@ + + + +Koolo + + + + + + + + \ No newline at end of file diff --git a/cmd/koolo/koolo.ico b/cmd/koolo/koolo.ico new file mode 100644 index 0000000000000000000000000000000000000000..c5fb7f1d2d46e57219b2bf857d89ffd3bafda01b GIT binary patch literal 403954 zcmeFabyQVp`!~*XJu~Cjj@=#Dh(!p}($d`}-5nwzAV?@3f(R%oAcBhB-8wTm;dDLo zOgz({-{;=vY(yWw&-$+4TJL)Qd0FdbpS{mHdtY^5_jO-&R8*c*c}-=&02Lm`sd&Gr zqEf7)qB4BA;ym*;6_vkvZQMA;`A&W=<1H1HdGnO#lT}paj8#!ty;^ZTO;bhXwzi6j zv$OL3t^9t5ib_(F^8HtzQ)w9aoXXLo%5$^lRW46_UPb(g=l{9?Ih9|+UsRdKb3Te! z6xVrBQ6U@?=O~7B&VMHly^m9eKESEN4{);Q0ZttJ07pCTqqpNOdfV?v<0xMrKkyz- zbbo-8haMyEk$Kw z9cnl#6Y9{I(~g5XFXK4Bf2`|0Wc#Ne#bF(4Gd$6lw*e(dz6f-%fu(^Hf<2tjTo;S3 z-AU+dh(>+77jj(JqawXjg6A~hF3+h!0>2;YX$zC(TF{-d2IjM^VK&_i8k1JQY`GEa z4Ggehy%|!ROp)njf#&M{5*`BY_FZRTvP2)FUK@xNqgNr%z8EL7+i@m;A373B5wgYx z^M*~ts5b^<;m8>XvvZPPS9G_Xm*5xA-%;9uMPui}!FDrzl54Tv)*Wq!ZlbZW z8;wPU2(Vg;V6!=}TC5JUrJATrjU@axaFRScN#6JDy9y5zN0{k^Vx2`GRxDbE`0BIB z+*F1@lQqy@FdwU@PlB_K0XDi?qk3~5y7%9}2_Xag{^5?>NDV1~udN@vJPVM#?Klc4 zLs5RAh;y`qubCl2JRMP-9E51Q4G8m!Mp;1%1nh$Tdm7K6s{Ag>OIuJ-kOE(?G&mYN zBgNeUcDni~$d5<&!A;2DkcryTkKnk@3oUg=6mrPtAJ}slWu+IeW%DWIwO&EcMpeK@1U#kD)v;KM)US#XfEkRb8#;Sx7Y(~*?(kV10tYQGgt{go);$H;o|}>Hz8RZcGO@{VBXT{rqB6Dx`?sH!bnS5^ z{%sYf5N_y*bZ2wq1zMpd$r-I%{js+^9IeG6D9iAHx8nxHMC2jT%Y!;Gf$(ME*pUnz z<*}eiPw#&Ir<5f!b_O>eDFRGYAQ8E}Z}7 z&{fmMjFD3?W7I?}m@*%p4z|dlF0RQ9!0xhOw3Y;*CEo{)8Scn&H$p*5GWGv^eS8)C zDoops7)yO@^tFT4Y9lP3x{UXm0rj!VVLiV z2L}y9_-Sh+#oibxu4ZVgppF)N5PanjI2>rb07orL%pW};!(M$0qhEd-*3%u3V^M*9 zQG0PRs}rYlIW9BFq*6m)ghBG;*~cs`t1=|GHxmKr>Sy%az@X71#SB7PxyD1 z9m49Vni%-}ix~dm>#$!CL|(V!c6~3tI(Q2ATMpn@Nj1LcIF3)-dQl!61>G5{e8yM| zeC~M+e&JOZ%u+{sXe4#aW7LGv?znsW9De%bE8Oilg}}8IuvA^e?+wD+{N9Su^RRh?Hx9O4QqV`pk0kpK5apGL zQLhZb(C1%)yHPH6@yFPE;V1m@7x3qwf1;zT1DOt+@!pkt5P$b>-a(3&AAF6>q5ke1 zyrc3QR*zqdtzjPMXgLkBzDn~`+@EtZJ#s5151fFpuMRBlbKZIus7wh!*Pe@gI$S}Yhp5@w z3f*~HnD~z|h)z6#;M_f!Fk%$ulE!8GuA%GPCurKf6O9FV@UvKj#iL(@)zU#och$tI z3A3R!M+@7--B7V99!Cz`Rp>gIK0J2qzK9LhZdf>G0eoDmVd5Br`I9GM>bs-hyRjLC zhrdFEt3Sfc4Y;Ph3-!6Gm^Ne(99PbP;UYt1ao$yg+o7hYvQIBa>mcc)&_55j7N)^s zg&qvmyx<$s0N=nExcbCm^MQ|1)blA)BchQT>_a%#BGShbYv#;>nT8&6!u$|pu8l-D zd+ey_KuO-tKK&@^JL;mI_8Z8Es6o7UJVLw!xX#5Rc4IF}dcQ~Ym0u7Wp9K#CBg8qo zAi~OmYxZ&k`*@&!dm?HweGzJwfN0NTIGDL0IdU^j^?umLUon3hs}7;G@Dl24AE0Dw z3QEd1!qFlGj#iuCE*4o~I|_#Hp?5-W!Wlr)2Ee`3q8GcVqsz zDcDhdK*?X_{8iq+r06mZb_02-`%zOLk3%Pl5$qp?X#*$mzVqN~H6PYSw%F5Igj)|Q zaQsXTBD{l{pZ&T|l6XH;#1P?xT;8AEBeWDI?h#t*EYgh>XMz1jS~edV3(w zTqs6-TomSxoef(vTO2-Jj@utr0Cj#rrHkFH*CWB z`)#=Y<4xTAazC!#F6Vlfik3n@6a`rzV!b6Q3tLfFvKL3i+!E`ev^Fa4D?dX%$~cL0 zv7UCcoJVz8C7Snh?%XlWiY)4*a+8iud||U;eC^L*lwPm+V#LYx#X) z1NX_La!;YK3&q-_7$?NulzccP(Ox0LvTTUY3LX5!xe^u$Cf;9xivk7-M&%q3JUrTV z7l#^e;6TM?>@PZx-MObwk<^C#@H%7#mLc7{0Gm9DkmXr|G>?2_`j#SRLlw40?nFcC zA?(RMg?$BQ(Xs6!x@xZCaPuwBOWKh_CixtN4f&Xs$9Vl<-BmOsA4I;#cBELPA;ByP ziR(g6^$Cb_j76ARJc3*kV5(*h`-PrxTNVJLg*Ncvd%^Ar2zQM`vLkh}O(Ie) zqmf_|f~d9JW9da9-8vhkfjiKebBs3dEd~C4IDdexftB#rSchc$btsCmLrJ79s$%T0 zBgF}ON(0ee9f9_mNRBYB7cPj8F2cst3Iw~jqpK-evOA9-N~i59Mh1Ehq|ly>z|LH6 z6b0KN)p{LqGDX6A5A4k8eyneV3{bCDY}o~WJq@JU=_A5i3-wuE)HO-8nbNSoCJx&o z+>q^SgAhAw=q%O4s^z-S(K3eiB3;D#J7HH%IF9U3#L0unICCr$CwezhK2p&`81@zT zp)A-2W&T!3-(Zh@O=l$AQIoW!YdEc0598IA zSh-jqbEho9lmVkL<+Wj$@XA1pd}AOM%~}aPEps@U+Y&z7+CJ-17;1|Ge+!gsutM!d zciQeQh+VIVtk}5!umh!eK)KFK-HxbrYf<251-ljc(4KFEc~jIeZs<6Se|tDI-dzUw znO=xi+lb^-+dhuhEBwa={i_FZV_x2&BdlLS84w# z&29PlN_`f?9@4ob!1pDBZUd8H(t6;HoAvVTlQ0^Y%E}kjr8c7Bp zU~^nK77t$}*}UTUQ~ogu!D|ZWvpR$m<;U<{?^%3%;u7w*bfGmpAN2_vaeHS6zCC&g zKX4q(F2Y(qUt_`y%pNp`&woyWVcZ)duwktk*Rg1>35s>TkN!$sDAu>2^|6@n#wZEz zLEJl7sd^(W;5gFLFXP_vTloIbm-y-1AMoDAYqSY{5o~3TTPL|M`1+st=cnJ`{^2tS z)a9CKV2@Q}=F%n~C_R7J3va+n-5mLmuF_g4_^-fSsUxXJdk@})hjB2*Qm(~bWFq$@ zA?tS_KJPtj-u*S+`~2V1{y_Zu_Oq{0K!09_eG(qsf7o~Z{=E+Yi-*x8k9!AN3X)U5HniRAVODC+5_Ef7T=pmW7Z$17ql54u*9-fA( z-G}h?kAL9Cl{={0)`7axE}T1l312?qdbTeGS^ksh&zy&nFbjm3SYp-KIT-fxn=n(i zL|u$4N>YPqk3Qai%lJ$4pEN1Ut%uD@GwPI~P#>#}^x}tzt2&8s!`{W4q{*m(!x3M4 z812{pKwI|}v=-H(GA#qa78;m4>~)NNSp|zmyiC8+EF{?JVD6xaP@lF2Iown1N^?Qc zM*0SnYml@?3jF)#A?JVdIZ39p=jl>@=O7`8d+W#&41Vb)%o@Y}>PIiRL=7kzvmO1fX# zBZ)Oy`Fwc|P7UE+M9T;Z$1j7kVKz2obYZFLB5dDMfJK~JktIE-z7C{S9O3>b5Sx5G z5N5jyS_{-rUc3$S$4-Rqw6R#LrbS=N2CjM5*hK$9W(fTo^powXJ%Xe3^~pAZ^jyLq z?15899%6fb3(OWSho6lnR?Rd;sNWuhW$lFrZS;t(9Vox}2g=WLPqSqwqCDM^wILGu zA+CsWHiDnEE-aVLgTbnG+!sfoHP08WE7f45z7%D7NDcI){KsSMQbz>3*P(Ftm#De&H)?MIIn{gMvQ{5XT3U#(u|~YJ4}5jBV6|cq z{JD3ps>np|?idtAbDg%KzuGb#X;Jx5o4ptzK5^0>Pm=k5{1j&s8F~PXE-$8jnt70D|_%7Lb3L8w&e%luMd-Kns>mabZ^>mDWk5-o`T&Z-`y)6Nt4A2>i6^WF`Ae;*t@ zzZn;=6=PdP0hX(3O@x-wR^rP)_u?n{zmT_;o9UTXf5E{d0tw}@nx>ovG ze?f(lzRv5=)tQVd zH;YkKUx+o!j4)^HJcNhF(=T0xyN{}H^;QLXJ2z5i8zOYmE@ai;MubBZ*ZVI}RD2aS z^dq)Y_X(XN?O~;LS26!2cqD$%4r;rMO{wLGiOol9P8l*YC_gqfsM+L+Gbgff{eyCJ z^)_)Y-i{00-`;sti|g+<;PkOVwB-7uh`z?)b!PAAu7;qRRUv$a;(o=3kobzI-G z#PgmS;ynpI9)&MX?A^tALs=)X&PKYQTIh;~PsB!dgoc<(#We*gQf9Du)bD-?L@<^n*>zjry{EC@PA?x$9eS z`!nu|fBBsI?u*>l*WkvzQe3-JO5K);ZS(~tSkWdm*F>O|F`8-);cV|mPd#7kDV6h{ z&yk+3#9hH3rCuZ~@?J>T$j!Bfk-s?^2ae|A?spgQ-cPqli-WlFpb=+I=A)-M4*Ter zZQkO8O%8hSH@8F?=Tz~g8pcWXOSBaCm-gwx?vUo6LLOu~Nb)Fs<}rWd_XHif_g+J3 zeg#TPQ*rQ29jL{zCD5 z+4c}RSOJgXS&F^`Ml#forvkRpK zb@Z3jp}eR84OLx~W5(6^xjr0tFR|9h=clE4DB~~WqTe8%l0T*IsMzyL{Ok8Q;d?lB z_(PmN#G|n7xFDlUXy9Ba18w4`!DbbQ_@_-R%F~2K8$DFw;xZQzOOVt_J>Qp$J5uIzAoRtzdTCcA^wkj6bd+=>8E)H{^A+Z;5}qH zlWn~d)E`d_!3%MXM=>Y+J}+HYoC`R__XXb+yi?x4k0y`LW&8yFCHTcrqL;Y8a*ip# zCq66T-S=GHhq0^UjFBGQe;0>$-$GB*b*?Lyv2Xh+>eRz%%sz-6nVs0Nv4i6P>e4z; znYafvDf>~M)`_~5cGRbGWOSf0>mXY4da3d~f&B$1nkC2t&@LcK&H?{Tf(y&5+&U%CxI3mo{llE;OB33wtd4}i99#G~rywji8<88*5$(^ohF26~TtX3T?T<)v zFNCjiu1UI$`$~Z*)|LqN6Sx z?X-*cRcwH_CG!W|^KocL9pT*yCrcmf-0Y5nO;Pk?CD5Oq%#nnn-8^=uaGgoQk-Z6A z<73cS8z!ys+av86yIY5FJzaRJuZE|_8u)10V3TP+I!ezg>b4Ig>1@jrFPh{cZ)k4N5Hld?D8l9E2u_}X6l3)i5 z4Sjfp=3#T$ZbYP2!i2uVEph8{=6D9K-`a}H7xQuXGRKVqT)k6->+fyD4US8^cA`5K zhjvEMzZ!z}qCo6Qbw^`_GwQ<}(U3>`(aD?nM%<$bc%LzP58Q!|jR#zpFT`d?6WA=7 z10P*=<{a^R^ch~dl24m(GY;=fM}2Z2avd#^VQYX;6K$+tp#{U0_E4K+fboNeLw&(g zOdmB43#Vv8f2A#44cDSD#gTF482W+Z(Aye|6STdL@xBLk#o!2GKXo{j^O*D?A6wGh zQQ~h&pQ|A%18fm&r-{N%Rnj`#ANKxs#u@H`QzEkAw|Y6_xU=EBVlmpw!*KCJ7JZi) z*p=^xc-oGETKaHaX#i_YYnbY|!${u;TAB`+HhwnVdErILPa%9IA_hE==d&iyhn~JW zjP*TWscQ*OQzOLK8z9%)n0ZppQmnor#sS44)~JfKK~<^?_E9ePZ1&~+Sj`x|G54R$ zg{nRFpYZqNgRtLr*B`?=^)=9)G8wzleQ~NI0c8me2+`NZI#o>=E_H;ljxV${9I$Ai z4knMAhIii_fN`%5fZCv$u$*8Bw;4|Gn(YD8@#F>Lz~f$d8*>It#+-?&Sh7SHYjj*- zpyvx?O&8{DnZj|EHvDy0Bg#M%u}1WdtY3=^cT?=h^+Wjv8#w5wA~7_EzUMp7l$-wi z5IoqDSw(%Ii5h=91naC|oO>zsmN;Yevh|ogVJ?Qh@iqoL_nhPpocq=|xG-NKdD%u} zt>(T+vj*wP5v86F?J+B%L0@dxyl{>P7>&`z*w+VQ1aY1`W*QdF*M&CmFwpXbo~jvh z4(Jn|zYsz6S^6wrg{{sO*kET&yY)0_|D;W#u$P~l3&Iv}sy+;x6{}z}Z4Pq|OrWvI z8snIE@XqtkOMW-u#~aTaHmB)!*tmKtGIZ;ZZrXq?F3qS8+Jk2L8TQ1qp_RvS?LxCbizrnBE3kI=<&NYmee z6zg563v0uGg7F`E&lZ;CZz7QuY}A{b3y zjm1M};@y|uP~KZb;S+uJAJCX(0t5P}7K|7QZ}UZ*ll0Bg26$TUJd6H9kG66S*e-L% zvhfT9A3u07i4UwE4Svi;L{o$?dsmjS&A>oAO6t(j-JQ&$1mW!V;As6&l!ByeHu~rF1WM13t#j6yCdiE&!ZRd&t86pxNHlIz>0}8 zuwwi)EFCcpi-t|bVCK;%{Nf7V_>^}hVS}a!w&E$!0I20**1ZeiAoY&*D46{neRk`1TYDK>xN;v~pSeLC>2q&thv@=!n9o~IfA%tHO;TlE=3CNS5P2~JNh{&s zbyBtC_stoH^28D5zVwG%mV5aq?O`c9Ejy0ERMiI4-kH(|zo7lpe~do{k0Uzv z0ygF__TGCPUwrgA{`J$Z`0bCs@Y}Dy6hQ=ll~STP^R3LYa_#)`(W!pEEzt9F{C9J@zU#k{2szsjpelUC=IYdDs2I=mz8`a z$~h~;EgyvqB=YihRCd8|mK7#bFZP!m{fUh8x%D6>hohwUOgv=mh0r|8q7v=_w`8v=UvmBG&7}od9Auqf} z_!-*^qQ5WH8ZDdy!p|hZEA*&xi1k;@YsnU3-qOyR9_Y`pz|?;9ANu^u@K8@ge9R>z zlzoEiz2Bke*e^Kw;CDi!3_eIu{*B$G^@v!UfGo{=#HwYYFgzQ-{_;3RB0hGg{Q$g} ztCbw+4?jn9`iAweZn_2*Fh(ZNwb6{XxT(3Jk?ZoNu=UJiJ@y~)%d{8p%ln14rc*Fj zWC7LD%O&{{JQ&M7uMp!(#%$il#@269bo}2aI{6!FFa3c}|MeLDpMU<5F_HvSCA^Qb z-G88E%XbJeO2sE1K9sN%{~o=67n_5O7~j^Ve>)5tj2sxl(?*n$JG92k!w_j6t6<@{ z)rht9KwE}0(rLf#YdR;hl90Q+!Ny1^u8>10nzZ;1a zkFe$N&nUm}8_G^H$85&|6zxBQdtdydi~;?Pww-N^jg??aYAX_hsu@47!*9R+iogH* z9Y20^20b+vw0Wk`zFdesc}6G+528-+fz^UF&>;MSsjuICZ7^&!{TL%~KzptSQbN7y zuesSbe+Aq!9(}Kc3`uhI0Ya%a>{dEp;=svL%xdZz;}Ge*52+1bVcVHMkXYG?xie>D z*ekDM@5583tH8Z3boy9FIYqx2s9JR97D~CAwgDo;y;b;s~4AHw!!e zvFuChnYc!{#SrHr*E%n?1a4Yup}W8aZ$I|}CcHWVq3fHFzVmD3ANmri^Os3+Cm~zX zAkFNU*Ijh{cWm$d2{k>RBP}AHy0ic(PQje3^I)eohimQ27|ibse@+GOa;%y#kogje zQ5GgN9V4^mC)uD`wIifkmgRwb#6lPUQF&G(sY2PLG#sU{5?DA3YV^70L zc zXb?7U%!IL)HvU1H>T@q!e&KJ%p@6N-O>|gi!d&z~c(1WUrk@T>=FgLGwl*?iEGHFX z2MoZ-S6^prd=AVPPr_W~q5bE^9GMK1MkOM_c@@$F%rJYz1j<4o{r$%3Ok50BJbVBQPQ1+TiVwP z9649SYwNX^FjJj|NY7|2oVo_9Cox|#;0UssK7gfH9JIBKp`}CnoVlmv7yp!Cue$OV zN)A6lWI!xpeO-_f6_0GcKx~U={GIvQW~;fMR9gmX^(D}pGzp8Quf&E8n^6?$fllVr zB-m;*Z+8OoN*OB%@WB!01vJy1)K%AE%;2yD{}XfgY52u_<{Yjm*$=x_p4F>@|-XE6@3;V|{)H(Ue0$9BdntFHl7SN}#87xdB{pm2(vq8$H66WLtptmW4`)uwnXKP~3Xlon)Z7H>uKtLGOv`Q+$p9{VW8J?meo+=}X&C+fW5>&tyy;J{`ljm!0_PVA#zx!nSBjynn+3!8S9Q z?=lq2nQxVrxeW)8mNS-H$(U9JuHGoby${Q=XIBJ_xeth4Sb#kJJ=j(LjRJngb~Dqv zVKRFzHqa;4dr;&SP|n5td_w*edR3MwDc;R|?qHun&`eawkiek>h%>K%5p%XWnM-%~ zlM2Q>3vr-#J7vBEi>9pR`t%&ey*vQwqej7K$pDOh^EK$Ma7MxQN}Rp69rr$EJen}y z`nU{tJ}$@3x)9h|d%%P~%gBYh!a?}12GV{vSnYw*ib`C$SB|@c{l?uAT)nmxS8i=XQMv=ntXz@W@+l(H&tm=D zAQXA@lJ&Zros&@0@Chon z-esb`)@P@O!7e)(kO{8ZWw0!|_Sf)DcO2fvJmd=z_r zQNvcjT8}N6)lx0sfws#MKYeXnP#kYdA1wXf^v7PiSAsjAHsIE0J-GSJM}&DN?tD^- zTc7MC4_a~Y(sshK5qom{QAM9%Q>rVPV%_09UmJ6WjHIo*n7(RV7%o@C$~lt|(?Shs8ek|Q#u+<71MiTG$8#0c9H^R>q?Bj~I1M!q^ zk!Q0FHy?H2{?CtapE%t4x`%RAjhi2oajqBP=6l8Tn2~LT=e2+)j#*;rM&wYg+R`6vn`4HwG zz;!7EH$P_1%$IGr_rqP>{rA`8!4b+-6LI7G{iKF?RP(-B%qIy$CGE_@U@PW&Iv~_w z1u`A=n1dZC*_sl+X#@8?R|%g4qkx^~vaS)= zJ+&~NV+%)IU<%?`!zyy(B)DX{5)K7jd8Dl-U=ub`e;z!RAH`?; z<0W28e3I^?e4qCavMOxW$UxT7Z3)Ej%VnGkC-MGI*CiaTzfb-7zK9iV$Hj~JxOu-6 z7tiOQtvCox$BDa60yr&S3SUii+Pw?8ciE)0Hx)Ad1YO1cMTt`%K1$eRekkOr zAH4lwmvNFlL-`a(F(;0+-)3!a1EPY%ke(TiT|G58|H)|2&QRUp3?Y7dxq+ zs81P-5;ecQ&9T^(>4~Cn2edFxC)`>G$zf?qn?WHj;{JlJvJ42A`_9FC%FzdpfJq6L zbdB#z_YlYbqI1Q4giQ6aZl{5D>=65E&MW))9%Lh&hP-+5T_~IG=!(_m!_n*Tr)<=guAxbMG+^6nHA(=li0bMp4To zUO#JyJdMZsM^bNyZl3q?PuxqKi_a*=V>$^u6}U>D=l$ipjK{Ew?<=1x@a{JR9he^U z|Nj0jQb6Qst>#GL=*!dMg{SMu&K(uH>#>~mm%0D-Yw>;Q9*tb|i}P2@pyQ~8(Y$eoL}-i`+x6$P4j+mNqR#GWB=Fky(AckbN~0`XPzd1~bbI6g~n5RQI2@9BHU_x|4;Wtg4?gSgiJeZha(N7Nt2|0eq~4Dx;C zqkR28j)KO0Lp<;C5H^{7u7E}8Oocp(Ktld&u{d&&5$OM-{M3?{l3y#`R9*$BF(LN0?J~sQD&(8m~(=k_T(9psVUK z4$y&op!^a#w_n7*k~7%LJiGR77tq0TQFke>ca~jbj?pD_RbNJT9cywMt~00a1`f5{ z#9`j|2=n}ob}|o-IcuVCg){_B`sl2Lo%E7nmT*_%B;)gVPEz&-55)WZWK#N^L~{iX zM2l(obQ11;d8e>D?HG2&9YRA`7it6BQSQ->Z%v%qad2Vo1^<+MqJuH|HU@?<%mYIBSjt%To9pJRc6`srd5Ud%^ z+_0@EcV_;cM;mH=_n|(Bxr$*2(ah(zrX9uJoRf^1ox=grSkS6>AA3EqhFX#>$(AO4 z1dW~;#7mL^+7P6jpjF@d0&kv+oW}#?!`{uzrR1~f1KLsH+JX|B9oS-8fgGb!WEm7A z%XmAo%&L%WRgX*;)<3vcu|H4+LVPO`1Ep}Y-wbQrNX#Cr3WJdb@SYb2?}ZU? zobHa<17G+({GKGu@5X(3)}t zbw2x;M_G?Fz0C+(76SXZHZYyB7REDI!hFF>*ss)tyS5H|^$g%|WQssDYXn&{pUTb| zp^hF1ckyNYZxBK~B3YA^gaC&)_OjBaFCdaJum}Vj#;|TGhIx<5)y z4y>&_J-NAfH z*7El5jb}Y^B4K7eWrxV6WIvESaX7jso<5d%9Nra+&Z3)dV4D_v3}*+ z{Sw@yfA~6m@>lr&xl{BPbf%)WjrZS|$h^ly=JQ6Pjd^uD<6W^M)EO1tj;P#Vhr0ar zuv)nk#gW|mF&9?S;gkVsZQ$IOjy#uXa+JO`2NPR_8?8bd<8>*v`ltwTKpKyZ%T*C) zr-%9!cQmu+y1gb8r&zmvm9X9*d}q%WVs}vts>408Gto=RQ>;sJM6C5{7^^OZ);vq- z8`>kipdMKzt#I>+!m84AZL$m#Kp^bxNu=JX_|}6 z*9s+H!>y0#w<2xMvexWyQzZ7Xer9);C-$;_uaW+%x=8XS!ihO^w&*JNfUo^(R21&* z+lR?Gi{sPlzwi}^z9-A3%!IE7YZO@f=T-2B?Qt)=c%#FK~%)-h8l~Jwim@ zYBF;&B2nVuf;?MGWIGxn%5*hj>#ES2wt)5T?1i^34yv3_@36jg)SGW%!r&no#Q6M7 z)_|KDMX@g4jB(ldh;>F^#`P|mx0PJDy)Ulp4`dAY< zCt@gj(OgG^7}s`2IqN6G44E5hYl@m62Y8w+hClPB6h2cW-(~(k3xCRlsIAvuvJ%Fl!qf)zrvmb*!Cl2qO(o zSX;!y)*%&IYwR(0@Vio+UgS86+(a=%yk4A-;d=(go^W){fT4~jLRd%IlTF-)i0&)X^6K&RT6s)QpX%_j%I$ZC-S^anCCYaHK7j3 zjaeu4Ymw?$`{6BkFJ%5{{)_9Pw~M=#2XhTs7e0_VI)>Wlsg1=A#zjsYVt+d3-xhdV zFrQtOxhV@^IM)Ogn*Ol0OookP8jP(%uws=drZJap$m_35amvBW*BHxuf$49K#GC=+ zr7`jKK^VmAVu-xevBTfR3Ju=NAsV($=`b^iU{5a_&JPW&qindXT*%m?Ci_{Lqu9?1 zIgZ9iHrGJ`^T0Pb8eway3-|3Q*puOf4eQh>OIiqU)S;igjk5pjJiTYtiHJR#=)q#X z#td2$C!j9W4V|ph+n4W6y`TZ3Ni(56X&H=`y2Hji8HUC|SiD#l6GlzI(AU_5fVhbI z=V33rg2jWT!C|T;;upstZ`BrT)ha`gb|s3nX(!AN$DFsuVD4KZp)q19ESTH4aNtag zeC=(F9yAnlW-o=Nt|LsXVqj^N40D4>#%Amo*IWVpsk33PIv=4r)Tx@xLs+kecoX*H zaxkX;^FSeGV8!go$cQU=Qs+G-1G4?sUnhvyXIKN6mtGF{mCI;%*`wHncG|3&m^*L= zOw@c~#yPu$xo{%~4wdqEg&fPWJ(hXVCgbQUR7*yIW;yaS*kfo_C6ZQ_BYssmVpo+R zZeQ6Gy2k7fR@2@)10BU3FOaf_3f_qP-yUwT8DCn8sTnSIZm;F z`8X5iGmHKdv!#4ynZDvU=*5>YZumGXSF^x+gE;2YT45n;=VuQb1|M||xGY_Y{dunN zvNJ;aGxD2dUjH}zB|ShNyO*6WbF$xIoZp)D2A&u>V5o$*$R$+_MPBS!=EHl=@jxzR zJ5{#^aVEssaX0G2_u*JpJ8l$r;C=RP`>?VDA60kYV~&riI`FW9eU#{zZVXICgf8>z zW{twKA+w-4Y$*)b8^m;q3096;$$0yKz8p$97g5mS-M5EeEpxja7yDxBn?o_p{%I*pR2Oi5Ou&kFRhifI_7gOa=^*4mllv==#m-nc zc?_0L9tKmc-L=~~q@0^);opb*GiW2@UeCOB{h0==O?Jbu*WP;Ov&S(yTbEVhc@!Ge&=kZO? zS$xgUe%acK2bFEews(id>@hG}pbBd>9m1i8b<}$^-g);4I7D8vH1{|kEf=^UlzmI= z*3My^-%GOZWxK9F-{sfR-2Wf&7q+pVT`(-BIAF%$=}MV@%y;q3VK2T0m)X8Z)hF)6 zJKCe0J(YU!u<;PSJ;eNS=5T+1f;fwD@-qH;@+y8jdjr*p?18b~9zUG9iXV9WhvR(j z=q3E~7zgvwzdLk}a&i!n>#WGnY0O`lk9os~WBI!iv3iUuM!YO^kB~jZ5Ht{SID5D% zf|h$T_mZ_LW}563c2HXPB!2eOe@~o?SXsaKq}RlKAA4&UsT#v%iYu0iWlb$JifH}gGy*3Ur&#gay<#{j3 zK5>=$WAZ5Q7W;qU7ZJHuNf9|PoMegFLuWsQzhccZo@kC#E7mLooj_Fh8N@O_By;P1 z+&gp?pS=HweP@2fuYdiGzwkH{{qH~i#QoD3SR=9sbB2$^k%m_M^~MVdV8?-zdd_WeijVt=GWE9Qoz1tU8!0M@EHP#-=Unj@F7Z`I>@DQGc>dFf`8 zoe;_I94zoekR$g}HIM5H`qMy?f0-6a{tKNa{Iml9Nao1sO|r&}K~L&FL5l^0<|4to z8PQ>95MTHJiB+E>yN$I6M}NVIhrbi|XJU`bJx5tT=8S;pfe4-%4sWhkO$BB6^S9rh zMFL#DauZ(q%o7exMp3FBVp;EDv64N)mU149T`R4-f*jzuA#uV0}gW?aq;-6 zCqK-y-&k*w&YS~F)ujmGUM$iz7{)90Sl^=oi+LK*o2yc8r)Zf zVXM12j%@QoprZlf%c6gkqJNgmf7$P&I9JYnG5?iA%>R7a{>vw7at*fblYhm0dmaw+ zf>^_F8gbh`Li(<+rMitm;$L|DSE+vE$a{a_H_m~_GoP}2<2r2Bys;zuJ6t*o+`P)3 zITe4wTPvISIt@?Y|Htot&|g%U3fo8EKSb2rEM*RE+*S6N{|x!vKcV>Kuc)~AJ9gds3AGnLLdDq+ar~p7@l!vs z{`u#h*f%!?K9)HsNbNys)=`8x*TUa60w4FQWBK#<@A1K*xb<(GI{Y)?ms0ieb;c%HC|LNJzbj6xLl79sdm#mwrb< z=UEt8+F-`S$(TNI3f9nvmdl!-Tc7`lAAeEkxSxLf7Y-ljV$Z5llx!}>o~CAe@%d*G z@Bj7v_qcpwAFdwuKuOFL`g#YmK4UPpgim0PoY}~Bp1?kZy6jUJ#oW~eST=GN_kPpa zv-$-LrX6OezJc`+-mEQQ-EguSnv2{K<{Qyx{|MX!9r|!r;w#U8d5x6x0N*>_^Bz3R z9pKLO+F0F>y7d)_&O?d6r&@}Hf5z_bu6OYG3N=u>rdk^=pbky>W$N)a_IBq{+E83StFK6_zhHf0gm&-q?)q~ z_PX14{tuWrhe+><`5_N6Cj||(P291SHCBH#?>Ei`2k4&!JooI2lc{LA>uVq&2ax;ISXDV3DSDUGQD_eMFwHpo2J{F_nJw9@bZ#|BK^K zl(LQ|EH<9`|0|K{pMnjBtmQV-ApVQlLvNyVA3-}=js{8hVxPQG!`KgE3353H{MmD2 z%0EV8#?X0iW$%OxcQ?i%n6pXWUv;Px>*n3z>*S```zrY<$+h6Qz*`kNF4Nw_rP<8f4=kA*8T!{`r8DpvH3 zlX$O?X~FM4+?6!w<2iBddrg{&wNT_s7G>ANWWgMS8R^2sA_-H5Ov8v5-+<>z=4yqX zC2xO*p+l%t>$G&{EIfGseO$SC33J9z#v6oNo4*56#yL`c;V;(W{4LeuID5szRYwnP z`P-;p%n@dxkK#Bj7%^@mWM}!j1-O6j9&TN~j=8Ky64%tnPGQV!CbVV`W`D>@a9|uM z$|YEe!_-IGBhSSMg)Zw+6HmL})&P6i<6HE*7jgC8uDgA<&9m?qd=@+x_&?@7UsFEB z?`@cCvNz@QN$j8P2n)R!3}-I?veBz~z6Ytr50SX@8YU6Gxnsw&ui7#8t?ywU`&Ae< zbQEGLj-itEQx%s4?yTkE>)^0l#CzD|MsF_mvj<|Zp&7QuFGE&{8)gn24V$$#xN!O$ zdb+wWZR99S`o}w1H*+yK7xh@ZlI$O7y8_K68r-9$Naq4C$re!JE!jbw z2jaR+1NpUd&d;5o?VK53h=r`D(Va94B@qtX^Atj3i4(?C2RX7fAkp^-wzkn0IPpD_ z8ZIDd$2n|0_BCs_SU1NWkP_edx}^6ZHnJD0JL?qU0z%+p=7=EX%Wq-tfR;@~h_+yD znf)UEHi8#>vp6Cr!~(fNI;>e8g(a**4ohsn=8P29(yf>JoU|7QvX{<6jC*Y;<_;gh zn6Wl{;U|#y57~o;^;!1*82ZLW7qa*#3ff@%?kGZeS0k7i{NNjh0)nGS0essH-PxyC4eKI7QT*9a}d+=+|nf13}RRq=>)+>7*t z^C;Ny5w@TB3DuW>;%_;)Al`l={nYF+%l&+sZ4mwR`mFJ0UrbB>Zp1=OxGXWnHQ*b6Zf?RE7&zi^%VE9IOw;E#{Y>>Q06|W6}QFDcINYJK70XC+oUeYrbYo zg#9rXgA!}67(wo|fvE>&yd>O-tHf_v2A;xQ$iLVFM$rf0@4A^iLP7lhMki&UqvKEh z?npYq0u1=O2l@QXh$7Ur6eA%0H%o;qEzM3Ui!noNc+er3i%SGpob?B%!LQQ%coYmIR-hBb1 zSkGr|9EvQ~Xf`&pC++oZtOu-SE<_Ri5gE9}`T|kcSD0+aTG3TVT2g{ix8vBm?@tB( z0yfG)+4kF*ICwPo$o>zyU(sqRaJL_7QUvQcEA9soO{g2C0&Yl5_ z#!N)eJpLxtiU#DY*@cEJpI|>>67UH)YwI6Dd(JZUC{jm=d$^?cB)d=GFZ7x$^U9;l ze|dgL^Maoh@}HGd#NUpI?4z%k2b~8v5BQw@Ex#g6GZ)Kd%|H`#5bk}-dZGtqxN*N2 zC(iM=I%+Es5>|CH(Gg0t-~xY$laXnU>&_9ZWp>rSj+_K5XoY@x`9HlU#BE(Uk(0gvuB zC>9P?wtZ>ys<8fsub?FkmE%53+aUSOwvh8>sJ$EGYagoT%Wp_Kli%66@FRqEis3we z0$fJ8p?Gx+V@C?em$ne^(r4u|WA_TzW@GBqB64HfQV)!EV_C0~Ijh(v>t-B7(l2N2 zmgU4wVksq_sR-{~%_cwXGCr>m=PzX=y;iQG5Roc_b^z{*r+@pIlFhAS{JzBRz+{)8fb_V2l`4#~_ z%i-B70?Wh5*SP(u5mzcYx%(%$4-P{&&LhjX_b2n0=XKwxmr-Z7eVO}O)ZbE1g35Wdmc7$y`v!O26-@+B4TtJO3r?S{g0m@X=xGcJG4hg|LzfaNvU{ShoH=T+uo4y$CHl0wube!s|w`Whp*;DDbPG7Z~k5)5=u?%OgZ^eo0cW~+M z4%J^sTbEean~&Epp0onzFRaG7(~Ia^mB}0^blTQRq)w-?LQ%#>o!hdhZ3b-Y@$(mGv~vRXt7Dub^oIx-;@7K zdpo>~`!&9i%$v%w;d@!kJ(`0vr{>d!FT=G5TXFY4H*uePf_J~W%NX3FjE6pn_deK4 zUr)wPvd`GRp80z6qOon+cpPLLvG8J^K1_Z|a@IsUICD(X23}n`Ul_$)i+y@xw397d zy0_zc#~Awgyla;Gi)622#msfr7?|{e*Db%JnfH=SGJCK&AB&Rn#9 z;YdyK!h81_`^`S_>Ye4dbaNGX#}DJ~_YZJSF!=Fv#=mY;amY7l|KGc{T-nPT>@y@T z`4;1oFJ4%TE$I=Ar}o5%_8pNGG#r79qh1_7k{m*PxGvoVa}u-I&zW+K@trK+$E*ih z-rV069KCd?REn}Ib{)~;k`B5qPAIQy59HiWQP)r}+ENojkfqb;| z0Uy>6Y2m}MJ~4oDXTB2p|4kUy3w|U0=?5yl{-VoO>Moxx79+D$fj!O3GJx%W_?`SHzpBH(_``g+qZ{_OGjSUV?z{9Qqu_qri!pe^@>+R`SrgHuZ@jCWvu+RpST85zX& zSLT&uy|jGwdm44&b@`vEh^}gxDNF>j=ju{fH!XWzSB=H*eHNQ4Mg2a1XJgSJ=FyHt zsNYEDo{YwkOUz;U`F{NCr$@{SNxSgzM(P1=0^7uG&i`aydFuh^1H|Rv#svC$r(!Sr zhc(PAoIA-AlZM!HjL6T^#9zNRb8dTbUUtDW=c|9vHhml0?lOW#^M8$BNv%Ua_t{%X(FK(+mA@{$m zz}-(ba-6W2_?*C{Ym9rim5a+<2fBE25&giYlG~bV!1E_!8)G2G_zfg4*=SUhGp{zs zCzf@QI%qvm@-x-nsI$q&nd)MGfBCFrM_f!YRQB`t>MYOX|IB*xg8M9SQ@C?1CAm2y z&&t$sNeJ=@+iD8#(079VqaO=cRVkDjhDt- ze^$S3iJ#yh&on(>VQM;;*m&_zIZQvT&D4vfY4jnTG@E1VD1`Zt2ZlM*Li|Dz8W4dH z-ynqh1z~*XMD{K7=%2hz*?Tq5lix5E{X42}v$(Ew!Q!*L_vwR``(Ebnnd@&^_ex!` zte-lkPV4$9{7slCe=<4eZ(2TE-OKB$ok-tn`aQ`5B0K_TSVT6**oPk6d5w9ZuduwU za+Df-S(F>sXY{(JuD4}-)xW3y$LH(+DGc~ozwg;Y7VoCtQ@xMeQ(1p=UCi$-cvt@4 zxYziO(i#3w_K%EvOuu2Or`%hqSI_^B{!OKS`hBV#^)sbzmi4kc*Y%cqs_Vp4ul>kp zu|qQdJ%8lIZ9x5odVhl(!OW3B85w)Vtea~07WLHil_PDPxtPDhYnpT6MMvJJf5*Ux z@2O>Fl8G5N^&6%-@!W{#)OcvQ$n#9^sosa@rhZSiebNK`|9}4!ZC7^u&wCz0&QRZj~!`?E&C-oSK~F^_N6Z~6}6_R^q6gteV*czp?+JA^QxY! zbszN`G7iyWR~~8qRGm!!v%F88^Y@Ks8TVDaSKD5FG;EF7Mw88BJ#=04I8&Z$yo1zP z>Sf$xS%3Y1eLQ!h(pUF|n2UYTziDyQ?`3|U-}#@uPo7crUj09PG}~Eucd;+>Ooboo zVe$O`H_r7t>7#x(^-iX`==0xuAFWqa@3Z_YJRwTcnf)%!>rrv1@t05AML@A+RmF;$=Yzdq|aS>C6w zz3?4OIQ~ZO&FwSB41zE<_9aZuRH_f#7&>TrVN0i!Ou zj>b{O36|e8f42&TmcK9ORexKrwaRsMud27H?j{`dIKlj0alv|1?=TJGha<&Q=53iL=ZoHf3>-zlgHr~Vg<-5Xdqw?GFxx%d@d_Kqc zTV|dnc`v1(#G;C=P;!zw{DI6A27<8(j~C%+#!Y@p=~fl|dENXyVxjstjp6?|iryK8 z&yeSsipb*lo_pjOA$QTXTZ*@6A9LO9F1$p}k8|`-J%z0cj$`wjL*&)ii#72TD2>^s zaxoQ0F~)Vm78H)(jKXm&W4DlVgSqxbGml>geKWX6o#9QNj=&PE3g3vl2vd=BRW>QU zpnT@k%OAIi&nn02Nju0TM1G%X`^bTNkiMOVuxZW_a$C^PC5yg3!BOE{74n&hQrBu4{tg)PsuK587zI`~5TxX;J=sFsDojQ451H|vJk{u zl%wdcd={NOvi+vY&nTQiJ9Ex5|KV|LOcCxR=4G6)6UC#sryN?2{J>3ECAkZIHejh+ z0jAoI?gpD$ozT5zJ9Mwr7TxQ#hfUp1%v;nMed&MY z(s(e2Hyh3v&3=p(=)zcuPUum)gK>Y2w&+=-1A6iM@*LZ`Js3;UoA){}=5Gjm+xufO z{kIm6VBTEM^;qe(0jrp2W0mg)SQA}=^>KSypF=25JI=k^ zGhCy*q;fqTVY^iPLu^0BnzS)q*4Uf*cwQ(2X#<8FWS(Qj{)P7vYiXO5hqUSaYu-~h zZ>IjNnYtUrV~KAFb(HU3!2FQ;%+Hn2ddV?QinkQzi}cxyl|1GKY(q9>GCQ;gN#O;E z3nO1a_$o{eUrFEkY=nAcAYgbZ+#RDasJlOUHtvslFV`fWLo38~OhQuExk&6b3$tx9 znLExCb^iVabH#OqecO>3(wp2MgAx$vHW#7ZixKI+oX=c|iNSe@3gU0@e0o3umITVX zY{4oopd^gb@k2T14D@4Yy zWk_|JkEwkVF|KDcV|5w((KQr7jN1S)S4U>Wm- zWMHhzTyjp$WZtqQ`m9bvXx}La=`|5SeE&ece?XTIa&d$p#5#i9Q_+a+H=UeI>BtuyKCfi~z=qX|0KtOuKh^)aAb zON{Ex_z~yc7{~aINhAAVimL;rFm61?jk#{z2hvyBiG@dUtW06vkICe~i5ls``-fok zP{x=KcjKO$55nAo8JExxHud@vqXlpoIG%ZzW@D~%3L=LxpSt4|<~}3;5ABqnvoC^V zP20nhG3p~R#%&lTx(z`zpFP=4euKZo-;WtJfN>El?v9u$@5FbTN=~7ek@lE8!VVLM z^u`$aT7>tvR=%*VT^So;)g0aHH$?k)>Z0|V^_X|48FRRiOQM-QIkEf@yDK+Qvle<^JZjMdPrE`&sJ} z{n+pMVXdjGiT6cWoDcakeAw^$l52~3hvrA1Jaa7V>jcJ4M3G03Tu9mDur)0b(Js9) zqz`>$d~+DLmW1=Gmf`NUrC1tCKefTJh>R$~VD1l=kgII-TympljloX(S?tQ4$T)&% z>?@9;&5Xk#zSm)Lc?su|@GTu!pMd?$nQ>qp_un=q(r=glBlp-rUfWkRmCu-f&GVTL zjQ;wi#kHAk+R79H6KH9<%69CfMP1pS)yL~yqdqz_+;Jm2-S zyK7N4VH^4KZxVlE&vA*iHO3f_>nhTJC|gyD|FOOIv6W+kqJWKv>OG12-2&DP>oHcW zGiLh?#Hw*_%+(so959Kva5Nof56;7(wF%fx%;kMcV!RnIML(Ma;y&FUW#n&LEtn@T zhH_>wW9XR&moXNHw-sT6=ZMvB>hs3?w!H*IR_Vxry*;KI|kbOAUb6a z{JrT9dh0U2{N@Jc&(DXaZyF|~Zh=?d?l?}4rqlH8IxD=#Vf>%La-*XweEzpSfho&aetCk}i-UcAj{McGCUut7l-a|p-zQ=bFLlQ)SvG!uJ^ zreVu`#{NzVK<-#~ED9o5Q=}V86B(?oG!za-^Nyo}@T0+Ba#5cm@h*K<&R<+eAHFPd z&(SxP`|;w(cY|`e_OF$c4|CQ~=7-o$cI8hdFIbe~DLcNC?{qkw`zrHsaKm)AvGG`! z62jQDK*r>fD=#Jl`QhYdn;L?V z-9^l+oD+?WvzQMkayWSy+o5Y+a?~(hzJLEw$genwvVAv@SAH2AkKIS~^mO#*_^4g= zW^lD>g%#7iIX4roJM!hzN9xj*B{*I|9=|P#IDe8pgOq{fU%o(pIN`oiIU4vbH~C(- zm=EM8eZjBO@BS)%B`%YP?iBe2_cKp*Ib)>PC;M~05{jMlKio@Q+OZ;T}`z$xY14mYk$D^Cc=-0Uk(vlb}$UR5FUa-~pTOLIQmY?NZ-OKhNzCJM2n23%jW_<2e`Yfy?huikN$<(8C`iJE*9|$q0 zj!C|dcWDQX9$0{qlu20N?uRUIFSaY{PhtrB0)KKy2`7XDT)Q&Xx>^l%sn?7B=@N`^ zjz!IvUPJS`_2J>_i3s|p+LI%*)<0iCzcy~{r?aVVw&b&^i4cb_Se4|*xp5+S78Wbr z7k{$@W%RjOK9=!S)Q7XQGtA|5bVmwfPvY5@nQ!*cJo+QhH=AwZ>g^omn{xTxOxm-# z(U(2N z-@{(8e$o1mmWTMT>}5WdzFm5w3*$s{7*AR@*&mAnM!>##BQ$>P73LZ5jkPl(nHx3| z+o%&~Pi3$@uTuVbay-X+ivQv6;slhWMq?4VOcyhrJvW^B=EivZ3;!M+CT~V^Yip>b*Z|kb_A4+$COBVm76Szqecyj;5ZyTrnYF;aJ+a44h|9hW%^f*wuXYXXS;H6LS*t z*D{W{Row+IN$~i z(e9nb=v1o<=TGDb9ySw`C$GoU8RZ!17mMZ%T98-L;DOSdWSSE~j>fqmmu3xHz;DcK zB+cDP|C@B?ab~XXw;MArZC$u_Z_OMR{g9L3gU#g96h6(3^tW1<5`Y~Xw;kU-ll}?w z$fFvA+-UNuGG=orZF_n4Sguw0(ofG1CFDXqygL=gcO;RwfcBs9=xgJHF`Kb^4y_tv zKJ%mtFXiF&6VbDs71reKHRJyx8OSv$FZ5Hfkcaq>IN0=uCvzKSdXY=6HRF{3`4Z<< z-LWz(fMdKET)nxJ{`MTe}1TzNBlRS&Ijhmr!4J+8x z=h%&Nvk=DDPoA;~ah!Wa%_xI+L=t-1Iiq2Xx)!(_`0KcJIU2DJhW<+%&~fe6m^Zt9 z+b-}OlZ0stwjplDR*sp{$XDpj_}`9b^>#hqUu6yXKIc;g@gq34rtkeaj+3*)M#=amcD80rePdX?+6V)iyJC#%BCa!RMtDp<*R!)^`=ob#||*gC8qz8M=vGGF5eDO)hP>qNfK zJLp-x4du+f;Hu+7K3-np3FGY2zmmZ>s_=VRK(z@~aT^sQMN zHpI@Y2|0xv3$b#*YNYjBf-v${+SKeoUWb>>{kQN}2$!q$7d`s8z%^hRB4dj%W%_nR zk6#O~fr;qVbRgQk*%WPFt-AQD{2@79`JB|gKkBG`v>U&c1t^~Fj*KdhM$ zgoNNeaO~dC;3eg_MeFV#9ku_(AKjz>cZPm(@e^l|U#_LXe${9%=B?V~_w0hu7QvX>E(UY0 zGmuTWE#v)>og-lNMs1a|Ubi(lDqBZ+)O`6BC6AtcM`BdSEKG=5hlyb&@a#E(JgJ?~ zg#4Hz+IB!_kAARi&>S;dMqnn3J^2{sj~JnNY*)>8!yxi09Au1?n%n*l-Pd!ks&TR! zZ_A_fA%cHe>T-0W{x4%JfAjzct_k&F4*2R^Z|{Tg!?O?+vKXDnk5T;}hHWu$m;O-~ zgGWc&L0!hqy0sWg&fpxB4Bm)^_611ovkWQyi1#3_O%Gd(M7NF1X}$%iKIG%@-$vfm zZAc5+%G_@(%uha-Ysj-lZAQZ2Jgx=yXZ-AFM3OIH06BKO+xNog4jh+Sku#@VG~=oV zk;B#=ZQg9m{^BKteWgAaeYt9%w14#&Z`ReCocncaq%4SX6-%b9Z3Y zsPXXaI0#-XT+pXRC$0&-3Af(0(B(}l*wyTYwy&_SeVaPmaUy!xvqPg-YF3fK^BkP= zp4FH~w@vFF@bk^!n0X0?HXT5&*f&%k)tmee(*}~mwOf0fU(ejd=_4_?uQTTkw~T$? z|AYFks>K^Pzi5bh!LrK=1PD4I|g%ZmE)9$ zEXNY0*i+Yslp@)46S;M_VnNt8Y)ssV^I7B+&fkrPm8uG1M2U8A|LW{ozSdq{u( z+xM<~f00A&*WTnBU??WJWW%qmE9!F$Se@f8ho+2KceBC8eG|x2)>6f)NZg?8wX5~b zKO=)fY%71Fy-53z`S3QztoCZv3Bwz^B4S7;TDP!P{c2@f*6&_<6gwoG<$kTbkUgLX zv+PzO$+?(ZPX@2=Y}%B~i93{jKM-t*^+!b&EOHc1=iT_IbPpbs?ZHQD_Tr%wo8k+@f!{QRD#4fPV)^@;BB%lQ&<5i**x>a%_bmwu7*bF?u>@w!)ul zYT{?C^;aLwwnuOm{Qp2sg1aiR9<=Wc{HR;@b!;)wAr0-D_xw}X*CO^I?SrsnKq*oj z*q4r6PhR1zNMuRlUhDA;Vl9{#SKvV@b$;!B#UuUioyYOnp40ez{~5)j`^Dk&c(m^% zKG=B}Uy^rOK7W4T4DUIKfA2U>-s!`5v~Hi#J}AG3g%#M9v;eN;lecbO9pUa>nJ2wH zIk(?pAJGh*-sXN$<6f$7)_jvM(j$ZWjcXn3*PMC;VS2wLMD(*m$gpnYBzcK(>|Mym zd5CL@MqK(It+#2cwG5=K=xZ-J3ik3mX;<0vi#VrhjS1bRqkjkH8YiFFi{4jX6TPoN zo8x2Ug@sNfNOoesI%*U5Y_=l7yBza^x8h9ZPU`V4@^$aWr^Nexrz-|Dw^p2omG5qh6*TXj=ACQsRvm=cCLz`? zko?U3G0xit{d?G(`9RG2`Ug5KIR8JwpSpi!&n*nMABLfgMsRN-9(6h9G{!fTc1FLu zKFT`}XfOb24*5u>y-D&Q_I}%u7`g{ZV-H}@eAKi8y6O)MtPKus;dHQ+fz-K=)liO!QxIX_oBMWw zj8|-ln6W9u)L3uRGN`K0me&P;_5VMi|DyZFj0x&ow=KqYiX#t(!|#qAH1^VOwST)M zQtXys<{;)O;5czQaZeXF=$lpnHXm~1k0mbkvGR3 zy*hM7#RhWY5m&*vD)!HPwp{Z(Eb%fgzF(eW*q#r`0T7SgwHTXjoq$H{v;Ii;<$rZJ zK8oxXi+SYFPxYd`8GA_ai6=}sg~Z7xuz%Gl>Mk*--V2xdS5ib4QskW1ZtGLdCpU;%|AbWFXjU-51=6|8ugjkcGmZ_Y2RLGskYO zO+Db+F$~pc)Ajqj=qUI*G;+lJfyI2kEto#>7^cOXGWgsloj~&BPKD_BIec>Z3O=~?01rO@4qrTZ zivK?S6+iw;zW86B;g_F&!O!16!B_Vm;6QE(eJ;A7-b*j5@ps4C4agxFhsPJL;^(iw z#nT^u#xL@nU-|uKzv4eXJ;TReKf(JSe2$0bZ{Z8d;EVmIF=oIZbfn!M({nfy9RrX& zFc4$952as89mQ4V)YKNe>U4ae?rS+n9i3ZvU{cpu#0_!8Zsvtsz0?;2d-h|z=XE6m zjjujx-1Sjk*BsvZbJcx#8B?t-*oSs?TVr$==BR04a5n3AsXQ8UEwTF!4IGf>v>M4e zhXHjyA^t3q(r+Sl#RH@jJiwj3m+ZE1l%K!<0Vm5gqf_nr zBlfr#xM&H3@~k1wQ-gIbUqxnmsSnZs)9>=5piMWS!V&e*l_ zJZ(^A%#`?dD%}^G!(u)+wGn-PW4gv+jyv;)OgxVG=;KICxrEf^zY z{6#O?zRC4L2hMN94j`Umoy643NL}?1DFu&_oc{>($!ni|;Ct-7^CP~eo%mna3x2-QRoxK$ zof%>B=UYa!@IW&_q7INa620~w`P942G;boZ1|ftAUf9at(J)BzZg;d zN1$Y~H@43W!)fB*r$akzTX#y0K`ZgKu=&(`wKgqw-J+QLUa|So4k!b|PglmLTytZ- zgZ3ON5A76!!QCRM|Hhn9>xQ<8_1J$+>6M1mkb{_>{I1gbB-)&etzTmK3FgqC?k{7J zWA?Ehu=&apeEXy70A478U!Oih;>2j?jAQ=Gu=lV!{R`%U{E<9`Ka)%OdlV&nh*XCH z3~bX25ANN69&n3KPoF+ze%nRNqgxv;Rt@Qc9*&Ih)3G3ADyF&wa*wPDy3}t>?tU-M z?T5mjIVk$pYtOlRXY;sD*H!R$Y){`{`g_mu9?Bewz8wFI#=-RyU`HQ=-CHga+sgef zjk96ze;75d9~Eku}K& z`Lh?GFlhnz7X4sf-wLrKLa=*oDRRP7=xfl6`H0zJ$ z`{~K|xU?@9%cAL<7*hxN@%6BDd|mpN*x=muiCB|PImE-^>PPnw7!+-n(2S;P$s zXD*d#pTo5;5sn2#-rfblMW6?O;6Et#9$sf1cr~9ut|Gg6QwQ ziVFC0zt5qQGX^r(`=CzbrtdfcLwY)sqh~I@`tr-?f&cXxo_uqSdD0Sa>yRDJZ|j94 zYkT5Uc^_Oo+!rU-&|h+DeH>ryjkE|mWF@5HFu6wOdQaf^tq!_YYl8j_yOIa7tGS)a zn7jE~&6&3%kG6+Ct8sqx%?f7RnjdZ*kUZqJm_olJ*{4-~Co$AIEqbr<)<-29Vq5ip za@}lyWpijdFj1%!h2>sjZzf#-O1`HVp{$1bhNc`6!IpHF0&tuHp^aXNH z{etDEenRQhU$FYZU5xMvMuWF&sC>!t9oc_sP^~5$hX-N)=Ic0g_bKPXKjEjJpFW4_ zcmMehuDy2!(jE@)+e0qeQ~2c3Lx_#ie?R~9Gw$8E&b`=KxN+DS+jFfEIgp&=E&mS3 zrhlQ2)ZY-+{|%I;b>w)Fz7~VtMBLCiNQ+`V;+W}-zi{PVz7^a%I>EYLTdv6&^I*Zg z#@}AWD2EjCkj=&XKsS`ni=Yo2eQ&1+@|;ec?J;xHeYTk=C_DNU&ffeMk3Q!( zmFp5uxh_%l@7c3w`0>9_@bF&`u)CZ-L5rdhXxAEE-CDx4cU^R<{tq<&C&w$y_tWMz z=5c(BI#P}6$MyaKUz@j)JgO;XxYonrGG~MjYKfKc-D%hB)0d(?*P?5ofq5|pwnMcQ{m#9+qx3|m4U&{`%L82Gn+oqM3ptC^#Kc>~$^F5LYeam5$&}q~-WOJ;v_{dL~zwK*eZ2Al*`#!_=W1nK# zl0qz*m4>a%->`wX8VaHoVXU(^^Eo#~#^{Fd?cNHB?rz-U`lre>RQoSni)E?z*T0~_ z-~KN&X8xt-FO##ICEl+i=TG!&onejT)19$0)))RgI$&^P`psFnD?bU*mrnFc8W*&Q zwl|FaithA}4@G(USmuKD!wLG#ubA(Fq0D(8`L#8!Dn^yKDShWr^jl$XF}ISw^^fq^ zZ9wE9T#!@9+dimmGtBUCLAYx=`nB~n`yvZ=&0em9c!yjhjc3lz+y_{&`&;HEdWJ>& z9-wv0_9lB(bw8sLe`x~^nWtsux@*j7^eb}DJw?u`pCLJ(7IDs;vF%d~qrZ_;^ZG~_ z5XJncv6$<_Ty}jN5k1tF`%z6X(a8l)9EZ#MNRA^ZlJ`j$mHUbEsLN~J>%E1=k;9ST z*$(+L1~4uvlm3NnTnlQ0)^9Xcb!+){E9(7P`c6(qR@eyTd%kr6{r+b#ZyNpZ-=#lp z;0SBZC1w#L+J0iC3iZ2E*Dds3<1g}1`cE10_OBR!Ivkgd?=hR}ZU>OK=r+eMZ^(gYF`;WgN(Zd;I2ed^_Y*(y|WZnXs!CZsrq5R+*P@h6Z(d??$PKN9hCm zrn*Nk5FgAQ?K{BF%^htUH8$HN`QJPAd76;MxXVk-c|pvjOp0Qlw9~t5SfBROL z9TJT>0Tam~Z_gY{QJ6JmFy=>fM9g3>=9hoTtpC!sx>~hjJck=Pw_rR0e?#{-HU9Qj zgxWhGtRLgc0$L-)ZY1jc^JTV+*Wu-uj0vN+Fh15B8|Q?pSg$pVGg?m$?=r^UE%fuo z>5Z}EW$%oX*ae2|A^v*ZK;f=sA;;g5gC+jr=WN*)qzzThiP=|hUAuz$n|pE}B+|i} zeAxpy7aUD4;uUE8dOd}21M1C$KIxbqxCaR{uON&4X!@>?(4x6vlSM{7+P1^hD_6K* z@(cDd(Msd$)y?_s8q};my8_W5iNc_+VxL+?T8(XcUN%b2TY&N9xK zdLo{4r#YdcP@G}Sc~LO^n2lWW(zZI#SN{B&GwQcaGKW~(hK6Sx{}fH`SK_nn7n{=1OKeXqrbe?-Qf2h3+^uj<~ab{%Y9vzEE2A7JI8Yz*%@ z40SlxZq~#KGuB-&^4bah#9eZ{6>mGvDeka(mRk$nMp+ zuJa~iGZK-w;3R!2LpZJ-g{=!Csrw-+zH!_@8~FF^j4Yo3u6qt9e|9KrJG4acik)hG zKUW;4gcU>UY=%IL<9EJH|cX zMzlG9!4wx;6fg#4!Z`9-j9$;2hAq@s$hoaIrg?8eV&HBp$i0Vx%fDjj(a$huRw4Qi z3#2Su(0_;@!lvh7(f*H^&yF^q_b9#Rv4}EcW3^V zp7dkz4`aT_Fr>#OaXp&x@b*2htH2E@VfM(3k6~WL$?zKB3g>Qi@UR<%Sl&A)JOuuB zR-9jP&cbniWCUY7^3Gs##26G#c4MAjf5zl72O481OK5`zv|+sAKVGAseQONv&imC+^-n0~=OSV+x~}pnN^V6}m}`(Z_Oi;EUp;On z;^O8oCvYd`KMcU!_*6s;^MYr8XB5s^gxLXOaBTG^+6(4u;rz>|dtDq{=kZ=CIwR&4}R`Q{t$7Ri2kK$1<=fg`CubZ0JW_ zi#{FIluk_zbixF$KD2|QiJPI5Cl7sybwvj`zG|oXFh`sI%r9!Nd^P@Nz2|pD z_m%!z*czqpA{$fum~K~UY%Bc<+rnt}Ic+&doHlR;}I7}r^ zKx9NQn!edY$zX8jK*W2||1Gcr^U~hM%46T7ka-*hb6tvgE_oe`Ohwv40ZYkE&L2|J zI0m1H*+En3)8BwTv~>{|I1bV7ff&d2yk#@eF+YOw^M&i^D^SKgiV;Zh=J>dOTaJsm zGPkBR{fOEkIhe6_*36mq)~o2-$sMUnjv;l~My$%6hP?$7v3Z6sbLdTF{Ok(y;ZH_p z=wRBN28gnri5YgwF_e3f?dmYDk8wzw%gCEf+)o_*06RBbfFs+YjJG8IFWhIGY7e5{ zx(}|Dfzc0`<-mKY>ilzkfXL4D9I-pnue5%rF%sPKu(kMWl{anP%$?}OIKs@3p*Xc` zE(-Eekd(F=Q(`xvP3?}fQM9>jhGB}wY9t2iMCz0ySiJrr$2dk?D5fkVpQe-&)3Jz0 zX(y{MeukmLJ>Y9Uf^*f02ywPT(2z!$L~fdp0V81BssjQXhak}231i%S5bENAA&ieJ zO;5mz$*G9y@)>d)f!-aQa0_$huE|A3Pw7O!dqO&m43Yj z=kFOaa+QtNxS4H;$+lbe1#*wzuVwHY_R=m)c1rG(yqyCW1LaC?k8NwdQ+X>TcioPP zC(I8Pfx&G!F6Uh3@}+E)mZTyjgFZm%2WT?})7Jizz7w4g&7m%~_ zGZbI?h4x+Yc@qDtMiIMHeue98T+Ws02J>bLrR=Z}6VB4%NJZ<`6@?cklaZEBh zv=0iC6WPAV&#-(AIf8;<*RUN%w(d)x5*x;*y@OhReI5PUjl#S|hp>3vapty~hm*_) zb?s^v`B=ipwJ`zL$cJ*1JRG~1lQYVp6M4|scA`%)=kZUd*vWio)nn0lp)G@D6i}%Xn7sZ_fG4`l7>z{!@1?u{Yav!CP<@8zjYqzvWTOL4AkMkv$m6 z8``#JQ!JiwOyx}6$=sPLeUXvMV%aBoYhP(~2 zTraK8@y?rYXvdhP5%gj3+sQHGKFmoyhou`nLcy6IXz!`_l*RhHz?`{rQ8cp&=1pXb zBiH3!iD!I&=F1xp#`rFd`5Sd4UxYRJ{8}T(z9sjkyJL>u6il@bhaGd4R_C}%Y(mRw z%{gw$Lhhz3SirIB>f)KqH@Xsc-Y3?D6B)NW4p*;}SBNHUL>neShxtz?i<+u8Gx5ptBgC{oJ7*A^4^=EYyyF%B#6K1rW@VF4X)X4btiz5)xr~*LfqSbSj9qGskzL+_bA zXJW7PU;5xG`Y-osnMwN*+jERZH;&`noyJh-pBcF`ssHBuseHek6+gk>BMt-X+G5AH zIC6+&D;WsSQGWhRWUgF`?6NcP8D zLsRa%+at}ch&h_>V#hA(8Ou(=pGENB#Wt{E?Z45rS$FfgNw>P>C9Bhb^U00Rt%F+1 zz!HBw27OWdslHERFZdr}E0N8F*kD$9J_f_hu%_lQ|wZwx?SmCYE7=mE*NPw7+q^{ zyxp)D*3DXmv)gtdcTOaV)7zpbtqqo@gyHC#P2?Y%j&6*17aJhhn0S*uPU zt6&?JE}o5(XR@i^%=`0EG43$$&pEcugXIahc8hsYAF?e__fPGgjlh1L7-!l6$vv|n zc~Fa{k?WE5+Ce>2wwC9*9aQXj3b#R{@hX3_eXUvu>(vYWI`w3K%-DD0B^YYG)_7{Y zx10kQ`2Rs4AnnAAe?Q`%{QLOx{q|Bf@^Y`CODk){#0O~XQBpJuxn**^QQjrnku{!3q{@#k^ReqeOqJT&6m zI*IF9?j7h8=})d3&cjsvqlLYZv8Q>wNjxp_7ynPoK3L05%S?@1iNDw*H|78vHFzxT zjOasUdsJ;e^7rz+r0k`AoR_eJ`G=ce&OCqeU9D7HV+PNZ$ z{3M3ZnpB4hU=ySrd@R%`t7-yHn+>$%8EtcCi2`-`!^^_PF3 zCw-HW=kCFr<=c>xGYc2qTaJ4luQuhoGUdNzzQD`m#=8BWK-nD8`^y&>A;!-E4PJW# zjtvG=@7EyRu8f6!hCTTV1Ey5sS!8RUhfx@9aTt7nKv6;}m5# zRR3zS`Rd%T_vSH=$^OflvUv^ELS}-u*>>^!r}*3nLDBTFroZo&@0Cte@ST+X7wlCr z*(2h=F5?5{GoFGLHESVb0rP2-V@>4*r4C-bo2zo6-F%RT?c3%eBWo!Zm7GI__ad$b zG*Nw;tkH{2smWN6Ue(*ev)Nz_XGanl_ z%%h#5j2|;MC-qwwX@kNocAJ<>xyL^E;`xP$^0cFGUmNm@#u7_Aq>}d_gEGkITZT+0 za!F3Th;3VbP+f2iLKavnCu7~4MF8+S71yu?-aowBB>&Q16m>o@FM#Xj*q zWByxddqn5;cjc(tfXGwkUdz&p$p^=AZ;oLXwN2E0k{nfAVEAj`w;6fn7!yUW-nNZ1BWtk_hZ`mM~1$Oyrl^CH$D;@C^|shXYS0S z9A^ePbwS5g-7!9udlmE(+m-L5Ob{AVlsBjZo4 z6WTV)*r2@d3oIG3jXA*wVu=4VjGoDu`R1)KZK^viQ}=IvOg^}~%W$HC9Br3q4~W?n z@_=JhznCGuNbr&I`Zd z#pCI?crJsyf5e}-UnjTTx|L%wsEZYP^csfvRhO}F-;bEJ^nC=mE@v#59cJ|5*ml4s zY{>ao<;7OEhceLEOP=s`8y=Hm%Nh>Nn!vfI1NPHL^90xa1!qg$HTv92JEU>f#~0ym zDF-DxQ(F)lG(CDI*K*rqDuN|Bt7Dk*xXshw)PCwSU+djbZGtV$} z>29=d)e#Z?jyU};b2NWafGf9`;MkUF%*mKVY?!n61CAG0PRI1Q8!#N4!WoVk>vu)i&RtO? z{fUgL_HMg`ft>pf?Cn7v_(JJN1>dQH?R4wf?~pV4ApBZIpa*>glS?kBHJr`&IiJ1$ zH5{Ei(D;>?;WM}o4jfy8Tc4JYBas}DJJ=3rgKlzsc#ZjDSFWNA=5NHr(M4$eR%;~# z8Cy!J_fmCuIZdOzKaRAFH0IS_{u}JY=3Kq8j2x=W3Xv89Nt!8$a39*Ernkhbu{V!ZjO6amwkvH z^trC{kH5o{dAY?e!5GgQ7;F7ivJecVnCy@qlN$K5@2!eI@6|R;wI%(1)A7`i_vve~ z3*D?bVvsZU3OC-v#`RwzCzWH#p_v$J69TW0ROBAIi$k9==Hv(VRkz-UJ9AQ6ReuLb zUd$;upa(qrT4VEu47P&}93$qCpOf6Fx5$+$GBCA+S(%$KbH*+>b@NrchJ9NPWei^l z(pMc~e=!#quC1tI?~VRe<$I?bZ+^B17jAGbFfWPuetobjFA96tFm|2XRnCn%qb>dW z{kT7{>&~ax{|Rl%-Cr4-@Lx=wbqcm!12Cv5^P{^Ip)~6QY%6CU%rWR1`h&Uj4^U%- zF5Cm$RD4MJ`)geFm_^$l{aNr=x-Umn4E@*mEBT0wSj_mF&h`JyZHF=_UAcq%Y_{k^ zKAK6%OR#+7ajZUe6%~wgJN?y9IQO3?*mL6!Qn)u|)71vuDX(^Q>SBh^Ao}eEFcx|U z#yj;v*>dtGekA#lsk8UVNy|Q3WN`h%LaZ*Gg++@?*tV`?&z>9Dy5kzMS1=F5idndF zhwC>S;~077nPZ-IM-|R9ZarR)8=s!Wi4z;Swj*4HK2)ggh|(ml-!Fv2!|qg~H6NyM`@#-q+2*U-Lg`jQ`A0&v3aa}B-AHgo}E$tz9+|uzQ zuz6`b-n+?h$|GZ(a)aYX$>Dy3_I%%=Eab0Zob`$=Sedt(vLN3d`_;-Zj@Ehd8H)@) z-Nl^ur|73nUSswxSIB{T?Zyi3iN#~S*Dx&dbwdd`0)@wU1N~N8`j7>Mkxd>)DpQ7Mz z=(ll{|0(+|dt`DSi@KjjZL{>XKZCu#M?H&khf_)p7qKj(6tU!o3-=y_Ft0I`%XDP( z+HQ`SWb7*bi<0Zp+13ez+BHK-f*&rCoAu)94Ej=rVf&IXJo;|vN z{+f}cyFwxkLT(*U*b<0Bm^PHGa9bV9N4$~l`+6I)qJH>`%dWZ-~^|EF6eF3 z8&>rjGUnke_zvjEb?5qs8=I_biC(*`in+#F9~EYli@HxAO|r0T6PDP@c~!aS&)T-> zd*nT2?0fns+aix56Y+zWbG^STeb8x+&o-7ERQ^Lgz1m|l{R^&gZSFETvv=iB!2We{ z-+nc)S_6KRuxGc;A2eBXiq-$$anIRX?r9^~C)KWpVT0dvN8$6XZP3CtrD* znrB^pFNbTTDmtQA$qaA%5 zy0Xt_-`vs~Ena<#>rnLF>em&$t!l%*V@t%1BL^$TC&s*$7}4hZQBGB}45VF{OXYVg z@z?jh=xE5s@DZwtzrO#u{$ATYQ+w00Iz!nME-Qz1i`Izp=!<>iCcbtz2iNYCLv()% z4)2(bOINuMLK}YbaT(W)HZX_w9o%PJ#{HlE!_OPpKd_IWZMy!+c3l1R3@+c=MZVpo zulU<+*%5eTZB_X(i~^$_ld+-RPf| z&M}a1(y!wB%p&&xGjQtEV!ZeMF6#a{-234X?*9tP;2HC}-(z0)v$*ly9bEnL67Si- zHCC=?P$rkjJHLNjJa*)go0K^fD)OVrJ3WQtKaQ<#E~o4YaQX6LY@R3ngaMetSm4%g z*2dU=J;|lqhy0T5$sr#E7y35D4IfSpx%L=H?0a|YMqih;MthcZ1Hpti>b~|jSegEB zZW|hN^Yu!3SmOU887Q2o%X+>h$LI8%&otv}`W^FU`MuvMqC*QA``@Ky3(TAAL;iho zrOO(@L#|P9UFh8#OL3MQ@fUBD;`UcparcK$aQE3$+@l=s@p${2%jEc$`IgxKB4x8= zT}e3SWgL5xJ`Y`Yrb;EKGJr+o zChYZ^snKWiJvbLL&&}lf`Wf=O^85Ol>D=;~oU7-tKUl>5{H|855kJip@7`Okc++pn zegVr3;(PtkTHO9*2lsI*aQDd-U-Sg5}l& zuKNh?9K+sZk-w8NSIWTP))1^kj=ZjQS+L^$3PTILH2!+c zRLejD)TKpS58~K{`&2hM z_PPFO4Q|lR-}&-9?)>;QZa;g5Ti@Q}+<7*x&k4&PzG= z&%ury<|ddKg6-K+XE?XUVuYi}eYTHd(oMvlYi}G6sUrA4EF%~GI*wJcuyNrSlxK}2NBA6+FCLF< z=C8?{;;C`~>|Qw$Wz&4f{nG{uf?dcRJ_-vW7=zKdhvG9de3?!4GU=$)OZqT*ca4>@ zH|Bbp^h-W#y*BCLbNwg3FV7InRDKx!e10}#$#adp`aRQks>(rsHs;7xVF-mF?rUW+^b-i5nt1NVOT6!(7q8h5@vt?bY3 z$7^Y`*0SH&z~dI$D)O^F-iLD+*J4L;68ZkeFc(HLbCRrJo`po_rlI{|9+9KlQ#o&) z&Ac?@Q8p_SWBT;QO3GzL#3;nO+oD3RviRO_?zi}#dJn#j z{{H{X-g^gBb#(8-rZ;<6>zqCFthHv%%$l|I7_d(k$BSu4Y1^Cn zh*KY|+e}-Q`&>i(Vk>3PS*Z)%{o@DR{q0Nk2anhk5Rm#|+bW?Y{%#zqOpF2-HDbY8^hS%O1b)V1^2Xv zSoEYFMKkm_?SnBvF_<D&=iF)QnsqQXI99GVR_z-M>#lEmRbO4d zsrpZ;%d&l?&mWmr#z5hv=vI|2&Q<$qxdHxcYxSJSaSZ#(gf?l%qFPra|6GrT8`RTB5rJ^gsbP>%Ax_`Z_|K1A`tE%4!S@=w@a1w7k1||>Dp8Mj>1K?w<<@RS1L>3uY0%BGpg;y^SWa_ z&bszDd{2{0A7eLt;m=LUr#;?Cm~(!>!FC|V#ztY;`cfRZaTC|Sen@@k9PWL01os}F zqKvwZ4}Sj!xBq(&Hy&=5I_sUUwsMSD&T;Z8+5*t_^Q5q8W_-N&)?xp)`PfvFju{#B zcirEVzU2pF#nN()gSpNqc+#LQsy_Pf*4+~{C)J2#+L^*nRKHdDVP`LoJ1>f7b-iuVlgP}dBf(U;3Q$o=M=i`+qdFe`Nl z&HN{l} z_>Pk8hB%1hvs`~vb3m%RzvXNbZ7zxWp&kPRJgT&*VY|t)q+HakBkP_u{0;f7EVrWU zih8JVjd)&;5k;;`@*0l?Pn>7l2wpzSy*Zmo4`3c+b&Ly{#C@5rj7wnw%N~7T-nA#= zM|6j+Wq%B^w}-Q%6P#>qV9Quq1N(G`6=Q7KnOSlVqz9%`=M=K;7}s{iyty_gMSJMW)#GKr zR{{fmzhQey48;2~DLi$&CF&~6F(^a#tSm#^lh5e%DsfMg&%Q#eM~Hb1kpyOkchQDz z;~A_k-jAX@#`NLbYi?!vd@&|YUS(eD1KXa zUDl)OGrI3lyrRcNe7E{mw#m68TuZ2?9Mv`zbEt;&DcVYFAH!U=i(z}J_SR#j`)&E{ z@>{gBWb9Sqs>NV^M&0CZYTu#piueZ6{-W=z_@=7gENEBt8)BR-6ZZ~j7?E$duU}jf z>qct5NYr1oonf1+YbsawBrWhAdCu?D_m`qhhGp@*qW$mT-RH?4**+Rx@*P!2(!FY9 z)o!Bxs{QrPk``6FSL7AnroE%Jr{?puqFhnFp03n4>)T&^lPX)$fjBqdP5Dm6GxFOE z>CCWvgX@OvS*hK0ZEJYV@L0CL{66h_guMA%5@m?rmA|d^!xxTeeSp5M2H&EtDNHNc zP-`cRRz;l+>#b`W`MrFO7-$$(JY!gnY{x^qN137Vy7rE;NtJmOxo7x(#W7{$0r4B^ zcbH53wR3&@8@9V@i%Pi;vr6qPeBf2^Lq)p_+7|UQqyh2$THDL|sJ@qUuI~c`Kg#qG zE*<{_=jj9e*>MQ9_BbWlsJg`cf2R(SZ+TBkq-T~b`zzU|e2?cMwz+H%(I)yN?uo=Q zWK!o^uF4d@D~?63Vx-IRWLsBUtMq-UOn#euU&jv>e53K5p{$Zv>V8L-rTc#UZ;E;d zy4GVMu+qLu`wiW(zTR3rMEzxZ=*A7=_$<>oVp8LO{{E*0{-*{0rv?5WwLoY7Zo2sG zm&E^V#1a2qs?olC4Vkp_8Z|DSyoU?NDYuTkz<7=FQT5&b$8wzv)%q3Hzi7F*rhZ3` zCB;~SsbW5i=Ti1k9&?N)bWEX-%AB%Vjh~*MYvpP4I$9g(pBFl$O1j@w&;32G=zGPt zR!!>p>gpltSjje8_gmVt?2FhA>YMa^zrpvYGR1GG`?Br$p6a9I`>HM?*L~xK6CX)E zLEKkuU2QIP89pQO=g@)BQU2|Hg{f*I?fvS%N0l#iA<=HEhuq69zQ3CE%rV$Me5d>d zgEoF%ovOWO_^voM_&xRQhPmOf&_l$z{vE^jtCstWbHg^3$A;zUjz!zNdrZuQi?%cP zy=tD7-%<_shTmye2mQAjlx28d9IJDscd2uEPv~{JXXJIM3+r^^O799CROxQov3y_B z0_&verK4YMd?$We8{Zm!r}7OV-Z#Ad|HrZXMuU3DI_m22tb70TUFtp69#!YHMEw+P zsj|)!f4NsfwbQ?>yDCSuQPp#GUF71P`h9g>TvON8cgtMht-Gi03+yUABg+$*8z$W| ztdE`tbhM*kFLe8gvekE}?=$>Oacp@1f9F`0_pEo-ebp}NT;zYRtM=X1m8E~4^{)D! zx@TCnx^|9Z#DA3i&u9l#hRCb?rmEMT^}M*Q?mg?bS@piI z9dvD=%0Ho#BZl9jWdBK>jI8<%>Rt7YVQ%=Wdamj<^}M()j;m{f>fU`;IaS}6=WGW_ z@4ER2NdvmNYvri+(X|(!m-=lr-&1Y*{~w-HbyMx2%2($qSM6h1@9K|LT?}&7Km3gz z6n$v<3C?ZHxiwiIF~_YXse{XVx_yeguRVKLpI7=8-Lvu;K3nNtHRr01B3Jbnxw>B6 z`|6%yE}pAehQ1s@1BUpEwy4w|2JOXi4EJdoev`huD&MM}G5nsY-%|D5uq^fM>V0*t z>aMPJfmw_e6QR zZ>fr-`W}_5=M2wJi+al6*2)q0{?^{Q`|_Udw^SMOnn69Je3R#_2X%az_>P!Imviaj zn!az);eLSm0pcukam;ylnRFP+dpu^YPl65%`vUzpXk%)9|Em8MmMe}$U6`xysdj$f zfUfjyA>K1cs?Ah8$hKv<>bl4kRw|dz@Va_NeT(*8m2p>XR4xAG6;+nLPP%d{m2L37 zmA+H7oxt5NsrPl)RNKnmk!`4}KY#ng{<}E7=L6bM-Nw=Fx46&rCilNw!~WHmv5yXm z_Y}U1UHRuxzUUlw=AA`3eHCns~id;)u zQjTI1k2i|zsUq>ZcrH~ue-vBNkMZ4OD4WUhW}QUY+>^5W@|-i+wdh^!S#kk;3odZq z@kRP}dXL|Ag*L#~=%e=rZGvy%Sos|s-~9nj>}5N!E_&HR+7$CK74$)RBaJB;qV$qy z(t$xciFQ-C8}j9|@e%kN>dKGh{+-Pqu+U(KS|;-i$R557%&X-!{N9niZ$7g*7^){wS? z5Y#OQ8H}e;;I#n--s1apb@AQEdg&6c6^Z1#8O45^Q4+8Tr9qpqB6KTOkKTqg<91@* z|6;`YcZ7uwZqjRvpMFZZi&BcOc{@~lg+$hs7HR)r|ATZ=hX3mJF4uk^3l z;*Eyr#29lucy38d2X*y@TmL9{*-VDNQwoAzW@D7=JjTY!MxkX|ab7u?G#Sz-@jRR46wfoKVzwtkppwg`Uod+B8C2FGrmjIr&G$vso) zi*Y&SNe|dG8-jRZmzI1Ane#4VR_=AoWqDaFdv4)vWG#Ci^OxK}_TuYUkb4CS=3PS0 z>jBa_N-InyUX-jc^jvw z+X_Cej3fJ7g}0CyiU#Ddri(~hb8#-8Q*@-xE9_H*UbBmR*T!l4QA)fE{WaNE#P1T{ zTf*;L?z2u}JBNMebo*39o5#SvyFcTDI>WZ575dY6Y%ltx=+Vd+JsTS{=C3LFwKpt` zEn(Hwma)bL!@eIevi8PcyFd&b6b4t9(QtQ-f~Q9ee7)lk7?6O_&~!wMo{KT#7h?RB zVoXX{hq#ojm^NcKQf3~+bjnoQc5X1K)e(vPbKuuwJe+JsVN7s7q9{9p{O4dmH&?_u zWh1!X6!s$>5NVr@xT$+FC37Dp&Dx2W^eq^dyoUZUiZD8M5k`&8Lg=Ur1O+C*&wC2} z?oNQ`@F;i;9gPvr^sPkSF+;3<=u6WBj=f!B--ABzyA6VksXcv34`7Tr3;GD@gFZ&| zMcLGp_3w4ct*y3j|K8RO~M!o$>!F_9xM*=8CthRh|OEJdO3YLo^N z|DZCg2;9mxrwkEoAG8Il$CgvaI4t#w<2&z=1_XX03H%LcKwvCrL?kgsP%ZzfcbU@$ z<_PoMPLDPw~rBCtmw<0=k7xB4BWztk3Q)k3Sc-$933 zHPO9MefoB$kMdshCv0bii5_-H4tAk`=V6#b-`-haLort*?o*r-;=-6v^sf~>1hcp& zWoDogW&}7P!{3p8fg@7A9TpU2VaC{+e)ExH9gl2>=}5FmgTH$!hS`i~oB{gds@;~~*9{&v_V9MJWgG|_ zgg6gCxU)6maam*1@PU{*!j`_t`Q6@jNb_+(ny&-nAv^H<9QmD2{N6#B%`_)Oq`{ag zQm9DIGM~-!nXHF+FWJiu(>-hvJJcGZ?dUVftQ!V(?m+(t)G_KbMC&(e(;rn$G-K?L zmW-F)p_UQ)H0#NIQbQ1F9*qo_xybh_)$|BS3+!7&pFy2sZR}2tPu|tW9;5*=rVu)r zUXK%cgiIP8h_&(xxuLKZ;{@(Wq)xgq@c?BK^<4JJCAxlVfh+mQd>nlg4n+H!MvO61 z6YYs}-xiH9w0k>*+4R6v4;##na%KEA?zAknYN+UfpSN52yr7@Kn=_f?A6NoBJmIp!NfKQB>?tHGRU zXI3=UOb&o$`_}NWPoOW$&9Jo%!<@h@TrFCFdpomHHa?TOL_X}T!jL%qIC{0}hj{K$ z7T>WsErk7A81=9)#-bdB?Q_Gaw~t17&KT-t(Tp824twZlWbg7x*jqB0unu%G!}Uf)#^gYx`nY|kD;KMmomM=;|ps=5a<_ER8Z;V}MCxF2SF zdSa^Ma73Cp!N=4R4y{emyKxJ&f2THS;%)L(U372I5w6BAlo4^rqtEj{=!(CKbVPYR~F(L{X?BSIGgPd zPdO6F*q%X*vFeA_arBuZ5|1^k{iOdKalV@VT*Q5muceQXjii%p+;6*&ZFz`vbaG!N zL>!3=@8;k=`n`Df!hD=OF^e&Z8SiydB6em+!?8r=tqR-1B`qwJr^+H_c^B3rM@%*`L?t`39f5Z#$-i3v@ewqHyZqk3j z9qw29fW8uM7UI2&3u#L+3kTOurJwq-SWmiJ!~OE>rjf>{hcGTxC|1RWqA)xJc|O6& zVoaEH#x{?)b!JQ;D|lIVhk56w^zZr(o@Rz)=&A|!W zCH5j`A0YW&jwf{ezL-xnz+dzsN4MQZS;let^;*QZHeKm!{!KWUw&$KT2NaB>517fs zh;eH+rH8RD)A8Q9TwLLvt5bVsV)xQmd3_!0wKmRA##~u3k^YjH)+Pqhe^MA@Z8H8G z`C!d7(gLyGkij_C0_#{}Dh zaY#D-EiS-K`n(du3u!q=&U}p_~s1LqTvbmIeg!I0Q#Z#$#h)0K5j7 zkPhC0O>1*34k+Rr*m2o!%ehD5uP`^9Cz4}6MFT<>2%1py=~8#7=nI4$@Td`E(DcnW zFvZo5vDt$u7bw5tDYyBZ+ZV>*;I>R0*_z4kpU7B_{Qfv%${5NeF+RwlU&PsdLy$Yl zoxZo}_at{bb}SlC-+f{9MNj%k4v>Bf4sT1v`SZEB`XPBsw72vX!o8K;_j>aa`hcP@ zqC*?#gJ|wJtfrsvZS=Kva{nyZb^@!j2WH|JeGzS+AAu0du4q=TF{Ulvg{6BQVWeL= zMtY7xL}VOnoPseXemyq7_XAu*W6-f-J>+tK^8OXEEF%q9uH-O|0ePNSUpP0P`xj>8 z;@NE6B#+;wAB@}Frz?EG2$}HSwOsnPqQ9}Lr29Mcw?yo3(T|%*Vvn>)H%Sv$>7)4~ zePEqn{GmOilj$RCG`7rUybbmT`-&%WKWHj_0%S?KaN%?|+cKH$G>&^lLrDvQ4uUv` z8G3`+w2Q5qG1kIy9I`v;kfUF(h(^np2TR4UhVb^dB~^LK{$tGOPLE1NPs zUGRBH2Rb<+bOu2aLPrSmie#MZT39rCBmMwq9GHW3X%nzCEC|KXL5z1lf&0!=$W!S!u!8b4i?N8P8;Cvr32p;m z)4n;{)ozadEgWIi+Yw85pP;|HpBe9$W4e{+u4&*lV{|hN7Fv&z_|jG2DK66 zYL2y8VQl*Z>D%@OY2el;h4g>5lx;;>y?P3cZB4{`^lN_W<6^n@`r6$>T%zyoOIPXF ziGGi75r647PWUh*_P1CMnRxxiJ?^0=ja;P%YC|2x0~4JG!h$|xL(O`lAi^6fhns#aisl@yFLHf+P#jCWDPt@)W{jr4AIe4Qh3lsH(Z2@cX}DRzu9FdC zTfYrc#_J9px&V>h%h0m65jwPNjhM;Pu%T=(_8of{rE9ms+dBZwYSzQ>&LN0$%4LiK zbH-44i)FN8tVw&Un;pt;oKAm#3rLsC=ogK&czYRr%BFJ7A(C^}Q9MqTei(&*aGrjz zkCi8LUVFNXF?R7h`wsdU5pqKAQI@nI{6>*J=!^5(?R@q%Ig~ZIlr8gdgnkr6?8Ehm z^dTtq0O|q>fmqGs{BfRGmmJRd!Enwg2Vv!e0F+TK6vd82X5e7lIuXbC>D^)6ybabA z?j@}X{jGwR71q_|f1Cg3dw+XQj2GEQB*)G~t6FvG$GaZ7(NAZ*gDvL+La3(%&~qpkHe}&$}akRIh4x_i5Grfbso!cYD+X-u^d+uKy$JkBtsPh%`yH}GA3UHkL`8LXmEwh8LZ}lWx zWIu6(^}2L1Px5Tp{77t~KemmmbNTw|ICq{hgEHVMeIlMaPI*V2_0mP^t^3mGKQ9gk zH<90Wrf?l;8pkw|^y9`c0cHOBY4jODzXYM?y^!VON}11b!WhPm8tsp*Dd8AD(gN09 zo1+CWNt-f{?Mtk5a{O;NR)ejw1OCTnNdqSjeF(o{evE_iGR6)t*RUtw7e)GF;@|;j z%Q0ZXS6_i=PZJcz1XJIiK)D@;jU1yL+mj*vQwU#m!VlYR`eeIBpPUyiWYb?!9Q%gx z>=%=;d`dLeVtg^r)ko{&#szUa7l^{~jPVrcOy9N^7~Z`Dx)Jl{HFJlJA zB7R~yef6J)n@=2?)o!Ts_b>d+YjK2>pK}$bSNT5|F@zmBmyo-fg`J5v`_kqd zgEKZ@8^+Ug>WAzocgCh2OFm7Jy4!X79lLTlUyf&Y(67MenIWPKlTNT@5*udq0I@>AIu&4 zz`cFHki5T`K1!C7_Q~fQA8$+zK`Hq;cWem9y+Itqu#X=dg2E_Y%ncff=)o5B>)IY& zIEU2gt(uGjQ;*}|j*O|`2-kiw7#CEE%&fCWFE|Ik@pI6bzW3@gwuADoF0ikRcST%! zbzMALmo(kEb1y_Da(%JnGNw-2j3NCa(V<=!%9h$Prm#iZW(eZkMq1z?ET85_c@{;T zk-SSCWGDH2Q!4u;_TgKyBBcKt;geCMqx9J*e5B0}azVVy0L+i|!>$dCx3ir3T>{5Y z)4j2r{r(>I_m?RXPV7oT`I2bLmeCw9i}>8s4-&#K#mgF9n>0X*n=_V2FfL@2A8sB_ zhP!=d&YL>o$nINu{FVH#4p)J_xG&}a`H#Q*Tl>oD(OfxgX+P&kU1`FXJqa3B`V zWQ;Bs(@vxdUnW27CO==KjJtimfN?Vl={qrxzAq{FSib|S6RFFvUIKUO4lz#dnC{?- zneL2jIA{RpkUDX0p^2R5X#GYrbgk0^c5O$%%W@jVaeR})wfs3tFCeq{493kWg|pWf zv~S&s@n5z0=nW{_6}E=C@U^dEvTJmq$p!U{h>_Fq&9`B}c%m`0im+hAd&uP4Wn}PD zIQ0pmZ}&cw2@NTC-iC3#I@A?fGR}7|q;qa^=>!k<)qb-7UPr%cYpCC@OAf?Vj_nVW zrEm`^eS#HE#0rjsQ{C(^#?}lAIS$^+@$M$}`6UxZGQOQ1lER1M(7p`ZVH}6Ehck43 zB{>F&Xa7kbCLY!uVcF6Mb3EO!opWH{eK-#R!@9$whqd%kV5qlMhrPNcpZk~i3te$+ zP%N6f{w87uI?&JPaF{h|!q~U3a_+Jj76tpr`HF*UrsI8n|DA{QefsHA`iYu>gWKaN z3+N{;o^_eX@hfHeL}xoVwe87yEHlp6cc6dXhG_Se5qj0_%QYH*jIz%_T;wKX%sGQu zMeiY{K|7;1Xz+#>8(ZV|s=Q9V7QC%X%GbZh#WfXgq(W9`I)S)f zpLH}f=>gA(I3zIk&b;+kkjeG83DN7|?UaN8okpNzoi2>&ULV58a974UcQS6nSns_U zyW0T^N4ueTl9(T%-a5`31+l&;NgIWYS!3jwZb{@wOt3S@M0-mtr?1LQ)Qi_o4PcCW zC-~A&RzY?o?h4-dU@?7sPojTm`t?o-VVqSD`rEIKAhUkBcPbs{_fJIU=5@KYF^RTZ z6?&h-`MJ5opX0k~^n&WH2|pO+^rg_ROKI|9l-hgp|I(|xXFyyY{WQWrnNf3rl~Um&88wg zXdQjSoJ1z)u&3o8KxoP`I0wX_r-eOQHEShxH^IXKzsi_vm?~@=yz)Bvv=-Xa2A~Vq z?RzrrRiB0?Os0$l)`@FFE%@8-Xk}3LH+bn4c`W+^UD=|nS}(nXMm1~0#H1&jeMTcH zqW~GDr!a?sqf_UeLUi~lcyay1wxbv2R8O>gtr1#KZ|GFJ4y@WVhi|_wnC@WKy5yTOj(4Y8&C&L)hVq`GClv#?{%fzJWus>3Wi}8lq|1o(VoWbMh4jM9NX|Hc z=#bU$u}OksM{ll$^%4`o&FZ3C8)Gcz z*j$X!#TZTD`n+7M1*rS~M*maq2pZV7?l@d+hLFczC+|CB-GorA=eMmH7ld|=B4k-D z$2{h_16Lr#I2>jTOkm!?7z4N#+n4j`R*iaK;ozlM?z{#wtmh)gGzk58t@-P<4=S8|vFLE3afuOiWn38)4GZtS&+KkhTJ-!J+PU&zo_Ts#RDPz0PK8gKB zzXnEdXxafDUAkee_ed-bp|4!V2N*`b^kRNx6X!|ic(|i)!&Zo}9DtIrU=#*XW`uFR zH9HWU8oz^n|15O1s-PrNx+E2ZAP zo@)XHp&syJoQx*quR4s=-2ScB7~akoaa^}do^b-Blh?v}NFZ7?ZN)gduj=Kw;A?@i z$`$6CPN(T>!dA^)Z=pfTt2j0j*Yo&H z9>#W0K+gt@<-vL4VMec`cb!%k(4ZG)^qGbE{c=%gw;Jn)?Z$fdy~uG~hOn-|=vl8F zWgcUqk_NSJ(`1s8QT1PW4b3UHOuO`jz3V6hPg#uk+@r|IyNJa21Bi6Zqi^s)&Yzf~ z>$RweO7SjD>62tRt*jw4*JnH}ZXH2h*t=9NKl_u@9DV%yn*EEMuzm zfI~lfj>%~YMt=O?#-Hnd|7QP}e%wI6XprDd&Jm`@+OrIh<)?W{0!C}VjyZHM}= zyh(Z52a#;wMA`!ejbDl`U93=#`l4tXHU6rcSB%?K|1RWw3)*A`8hc>P&{gF1eOTtW z7BeiDBE@1M(yZ8z*cKpl&16IxZk$yPF>=B0HZ5_~`cAoC-?J%~h55^fsV`|qVr1hNz z`{q`N={te;sJ*B&(8iGRO{3Aj%dN`vKwXk^O`SXU#ZdnQ#3t=VB5j4oSf#+e#Q>>O z8`o-xVXYZg{_Tbs(5fA>y*OSRJOX_<=AJgl35A?@xqXE1hML2oOMe{PbzS!R|F`g0 z{IBVOyU>QZ&=Awk7(dVnmQC8RuQ%eDs5YEi48i1~OAtG?3>E`D(dbQ`uC14w0_*DN zK%)UkBb>)^Fyh*g^I~ipxfhEaR$->)Vx%((%+s7#B6Y+D&eLus#>CsV3~2$|kQKfi zOULct8r4p0PuYomGj`$dtX()ZM@z?N^L!@lWKzqqb=r37DYQ5ATgtf5Ju$MiGonps z7t(7I?3q*Bf3f-O;^vd$=^QXWkL<7PDa9#Deojq7SPcegDoS=Q7~j9W>_sjnsq+X94Xh` z)+5EI49R{w7$bc<|_v z51%mh-JaxZq>l`PpP4;uTXd&y>Za)3@>PTkYJiS4>%y*yB?h&!LHjppC;nIM#HsjB3z~p|@Y3trs##|R|A?8+G zJM>1f>rlA#=zv@M;&Aiq6m)AT+BBd+IbZ|T&EFn z;#;#_eA@*g&T|D^y_3+mR(+kUR~T2#1r4Zc+OfdCOTD(pw4H@D!-?&HLZn#bBh|44 zDT3Gih&wS)Vaki7?w7g?SM&Gc)6#v!Si}3_%6)i1>}6W9oA~bGF%$8wl*BbY_izQ@ z<1>$V`~~0rc=>jm%v^@~{!yIM>4wG}^L2Wg`c@n69WjlCb^V@j;2NOOWrlj{SQ+QtXx^ ziMS^b@8kgX<;>@WZ^Pd7UARp?e?Y!|C~y@Rt5muN_f_JxPl@ZNd`2Zb4G8>+y+{vB zcUL4GEqqB@ct3w53TQK8+rgB4-x#J`A9Up$M*g%h7)sx+!#M_vXT0FX9OIic>V$aO zn3~jWP3$-q&AAc7`aSPh>JQ}g0kj{UFuV|HmQyi^zuC1>9j;5i29t)I^BZJ}^OdX9 znd>p}19Rc#951mK^?6=>4eyC(Mc-*}WQk?e;}+ObZ?|5GPbMNU2^#t+x+$7dT4;nCJ3c(m;}z9>J1FL#~77kf_Ot9@tj z&4F|HYVR3*#q%$Box~SA_za)@Y{Nl3T(e)w15w_Cl3g-=#^cXPKbNvsB4&^~=X`4; zz^M!D`?hDi*zTA+#vP_j8_P9s&lW979}QtnTU~3T-je=bv>lYbE5?uZmVt<|U4R+( z-1}tK1)+m`F*f5{T$6kQO=;sZ!ofoq!$r*bXxKk*y~mIis^YK3$$U1wsCNbS>NjLg z*}s3sW!Utw=G>|&;`(ONW;z4SXm>66-f;Y8h;`Lt@tkk>|IoduTEUR<1<%elFyvFgzr!Ay<->f?V=(vc4FNVJ@ZSQ}Tw_*i557zfmQ{S_IzWaq}Svfo$yu5c0O3NOQ4^0|RL zFr8SfB6a!%Uyjw7N+<2WM7Ea>1nagTV%`vk$baTAuA>?AGhKw;!0%H;;+N!r48G(q;LXrx9=!qmWV80#K{;XSM{+0GXe1_mIk{|IRx zUsVoh{H`#s$kp0L=N8=%X*VBp?We%Krzvd@f)M4?4{a%Hm(s7bu*s_`kHxtm?&|pe zH2xwU``)b=VQ#|snH>8}>z4(WUcsnG{r~TJ{V+AuDBHs)}yCV4Qi_u3+H zPbBXrhV0>9o`cAV-H)5g_TcmNd+}BIaeR05T@5pZoxo4!3JL2~pkH3@nlLiF- zq=PX--O-$O3Wp0<;m7mDU(k(sS71*5e@wi!#OIIm9@7sZ2^!-)As56qJSf?Q86yMH zy;(DkIfud0xIH@7XIvqp&S=E-NRxVRz_D#T>Vx$V&~-3+Hfb;CjzxVH?rN;4;a!2h zxG&nU0oOf-_K&6>FdGwS^F7(s3a2-4&qa?G7|>@R_HVx;u~syoWPrlFYF>HHU)T2w zo<2gFd4}BhTN!*_@c!B3pJHC(V$y#jj53Zyv}GpR)ocB)cwe+d^Ve!2y7x3>Ij-a! zT`AH%w#a#!#ISuxoNydTlTRag$|)SoIfO6D4oTT8u=@VgMdDmF>G0RlfRG8_pSq$Y zoot96?xDkfC4PMOx}*y!I|RQ=yh#Vgm~?a?v6nO;uIZjRasgkH25&4~3zzP_xDVn@ zSW)hoHfV$K=B}`A(;Bs@xA$(?8jePNFtW29ELw2STf?>zdxdw^T*JMBSA<;b(b@vB z=JS!^JR08px?^8X1Xj+cZBp%8n3X_#ImS*=_&W&I@4piX zV~-+n(itR9IfDe^zbNGdKHYwX{CGjboP7E{`)|=-tMphMlO}!;{498N&l!Ba<0L-c zc^Y3+hCe=i1>;;5{;TlA>8tpf`rwy4PT2pApJBHQnVgr;Am68u z=cmV>#PrF;ebQ+yO+3l{R;M-DPHev;?%xSIVA68pN_$?J#C6{PXv1Et8J~gFVIjzH z3#YFE+SSipjeDyOV6@{f?vtpAy;%jgSG)`RrsZIP&sZe7_#)eX98S$I#aH{!;qg(H z#U%2_M~U^Z%IODQ`;ph~Zr%&4_Qq&Vea*No=ZZN0Y1*&_<$W{G-L~Z(&-Uow%!F%X zEzq%cGdZs(>aH+Xc~$I1d&z5DU-0NX0h!jB2ErjOsiF;TEZssSRFO_RBdf&Y6$y zGX?VotwH*5&gF$4Ag`a1*iR?+GEF>Ln*haXNiFQ zwxgTHK%@pma^GJ*J~;dyKD+*@Ec4-|5Af*h4SY@B|Mm!fS0o)>e9z-=4xC1q!w`(@ zZi%eGiO33N3XA1l*74le%DrWwv|$d7!gRMl?&-Bf7s>(6o*c`>{)XDMPOUC|5sxHL*6#j`!#ytxbGSGOU!k4#Nt?# zFYrIjG5`3WiCil)LTt}Oxb=xbUFs^;(Xd*xHROLG*UX#s$6TjX#(Q1 zpGN$r5qFW&;!flG)^{n>1;4+GZ;AVt?APyK{Rki3{|29a|0}-w+!|MnMt`tu3CXa4z*zvGk7f5g4ppW(sz_wf~Z|2vK|zdypU2U8r^ z=-P8!Zei4#eZ4t6IR^CZYz?o@R&Z|DgLcYIsSh@xjaV&osw;k9%!^gvUtPPY_7bvU zKznDTm@VM`z7g~@;e^e!6T5pZ1w+i+!HYJ(hVoe*8_wq#Vy-{te7}139CdjiL)5v* zCElDv()NQ1?6vg)fxp;OHiB!Erge-tS3MhcrXG@}tE)!?e!n&z(E0{}eN*y&v{?dq ze;xNi?~rm{VygVPga}6@yBLJTqK8xSJd5kB2{#8v0 zPkHSr{$lCBJ$;IA|9FafKm38aAAgI_&)%didY1UV%eALKn7mN~BTV{Zp?5siM9#$K zv6 zXAom)`s2gXDTwmx$Jox6)B$chv;WrPt()sJJXd&Ei$D2Zi>;#e0E)R~Ce9U$^=6yC z18GCo6LA*vVbQ@s->&MrRbG|B}D? zz4#Gkmps7x#Q$rK)jxdj9q#=ia3|)(Lql2p%hM`<;t}!GUr(Okr~8kvCMi?K8x?k3 z-sU#Ackm4U_~{q0J!Ndj-|*?xdz1qgkmenRHpFuz`F-Qq zx!9M;m}+SSIFh!6zB&@nhjYPAU#pD)Ws|@y|xzwgaAtzoG*zXI*J8=+`wu~^!e58I*gvFXzIaCQ zz8L%M-*E+fjJw0EVL#%Zhu*C%rS1RoXl zjn=fa${90-HZ(}33xIppyPniB2;M(|q&YV=ekb-R#h)R$ z+`#J>qPuRKirtLJ}1nP5l*hS$$X{55@0>G@Lk7ksaQ@w>{S}`+7FyW9z@Jb5@X2S$42a;Et2M&ghhuU76)3i(4^y}1<_CcH*^rX)LTQ794*$$!YLg;($`Ew?MHX6V34g&imBD_ZeVjOI_57M9X z?1zsIr()R*542+p^{s1;JyZT0;{0sZXX zSPaKb-t4EIJ)Y6%q6TfkxHr9T24>QpN9cVCac7XS^geOd_&!BozvlAi&ZNK0~}PCyVyS>5Gw=u?T}~ zhrrFu0khpFa*eAshIX^Wz_#6J>(>YU8=ImH?PH!L1BATnP^%sNPZc46c42eqV?p@S zSQF=uPfpFC-#J%wY~C6>Hk_96HVv_^dMvP)eYj2+sB~Y<{}W%86xL#_ComVe8vASG zzYpQg{d!GaejB6h=W^fe6z&J6jdwNtuVjL#i*e01NE@&W>A?q(7<~fCvu|-f*XKy4 z%ug+Ohy^_13m!cFQzrv78T>q~KKtln45S_P$kqW^V!Iaw z0cWvt`hBdK^B8O9{|9R_zorkGJ6PtyeS{W8=vK2M=1on+)4xPN^Ur_3|MnZQ;-{g@ z%Wt47_cX-$jz&hi?8od&@3LJ1n(^ zQwdug-m1@k77bLwp0ptG7CbMG6%ELoa^mR6808U;1~s_PyWa%*Sy;sVfOX{eR+ayT z`1fzz53^`Loige$?SaoAb=d><^`9e&_|Mt=4VDq}rR4d19sY}XF6cm{MJIkm*|lHs zXIxOKub&#o9dxFg0o_Cyl>@~p^Oin5$itV+m2lG`ZS zh4r9sxq2AfwJ+xRPNfZh6s9?ZVp#kBuxr+xd)`c|<$oa)nz2ns4VjP7LGwvZ_VlNt z$^K1Af%xLuJj4cBGVXML9A~^c%|cz0pUJobn!dp4gM`Q&)YC#fSfk zW$f>lNc?|=z+PaUcbrM(Jl_BQ@A%~p9SyMmeU>D+eBlC2n$qXTfW_ESB>L$m_~?Vb z@CV=hlk-MDJbuDB^nYPPF;JNNHLM!belsEhfBgRZvA~ljq@V5ExTfC<%O-Zj(X~Oi zd~gzOo=U~8!f>ScT4TW!`fpge4mq?3NZ}g9(6+tE@7?L^ZaI!~pH|6)OpLelA^tsJ zP5gyyRPCjWlQiD%+j1b{M{S3DUtcVWbd!5Sh3>z7W+=Y8wE*6OyTHYk`YYGsB>u!l z;rJ{XQ2jt9{B`TUQtlILMFT2VvOvj!GhF-4&MZO)`d4ri>yrViI0xu2<-e$lz}rv` zXf#j*?rps=%Z)Z2V~!yu>o!tWJVH|GL(JLsEwTR{OBMd40fBwN`CqW^*6-N<@n6{S z$zRy=(O+13?ROly`#XN*JdhlTJ=JKTD%1WJ2vU7Rbb-iKdf zY_ z$-pi{VbQd6r8d*>e;L;8T{(}i3nR_xUt^3Xwq=f@54a%uzwyJn>*I0bcq&YrH^2<8 zUy8AxA^r+`nOBkXdKw_k>i%iT|Li~btl_%?bA`Xm1&zt^AZ>rBbM&Ro?Aoy-{49Mi ziT>}qHL;L=fRF*A|59`y@&+8o`gRP%46mJBvtr+0a9`p-W5d_%^Z&rIGaCOdJ@Xs3 z-TM>AzW)UacOQn=sB!4syFdLmwPoVol0Fs~IeH?}HXcRkrJr!|;h*>qbpkQZBgco# z#i4c%JpS%Gl&xQnv7w;a5ADc3CDHzC;P0A+ zDMMYz`=Q)R8$sJg`hueVfA{DN>|8aLW532&v1I$-`Csuc@%kID>*zt@EM$h9C+7H1 z(T2$N_gPjYIuJC#`@#><2uC;CxHiWa?puuZDTF)usR8w2tq=G+{(hYzFvD|~#6M;E z10=0{gt#T}9AHmMjFu?;>}!#GCqW88=c`k{@aKUDf!Ol04GJqI%<4MF$zrnJGkAa#GipE3!2 zc&zbuWj#>xx4>3lZt%R2{bK(|Rs5BGKqdSIJ@9#9|CKO4jdt#JX**#HKf7@1qZ`q& zo{5|bHlzVT+hQKeuVVye3jAYEbB^~Rl2<)K_TK-X@Z1wDCH_Sh|G>68-($F6B%hI65kl;_PurOL_us0)Js>sE`JEattx5Zp+BInR{1R>cU*h}@ z_1g}wAl#-Qbps>BnAgJUv|hNl%Y%D%Xd^hH4OXR_V~EK+GUi0%*WX4n`gm^1B-%<~ zUzg*l0mhz~9DN9$R--XLbQt|V(WjK~E0jJ8E2nVZ_natv{Xq`g?M&e6FhchAa!e=i z6xi#MhJOX70(<$KKG*0(U@QB7;;(pKnv{=}^EACWHB4YoYO#zWuW#N{7w?Zcn&@#nwb z^RNGlPd}!O2^2K|+Zm9by?5oQa z9f*6P>;ts@H>VGf;oUkQi*r*R^shfDxQzN%cPRrDhFaf7ImvyKnL_`M;`ndzJ&FIq z!#|_o-M?g7cJv-hxvn7AXH|cwus1wcG$8H?-f7XK6;f7RU>V?;;R*6d3-kB=gqfSa zL;9L8kwzVJ)*7xWEj-Wo0v52Oe}zeQ5wxj{=N{5nq|pcbSkBA3cQt3~jJ4^eaPHEG zYpo#&9B3_nqalAsrA9n%%p_={DfjmXy3lB%2HL$=gY$cJ7%wUSQC6L>D$@$3nFEnO znd`M9xVPW9AN@XbM?eQZ?vw2#@fYpXp2t!C>o9KA7KC%ou!MetgimbYFMHcO`ZK5h z*X85=apyn=)-DdB4LJM$r8}kVkK#*3142iuko6VElK-XtrlSF!tdRKgxH`<$HSrs& zACTAh{29&zMfgP#?>bmA+MTxQc8Cfnf~RE)*SguyDdu>`p0we_sc#o3thGccZTK znxyp>oJS8Hl84C?j=|r?3rnKh=?93uKc@#`cYX{uPzJ1w6Tabt@%iO>2=_GOnvx|B zao_i8;wf?Am`~Dy#I&lc*PU0wUeg1_J4((gte=%DIup5gM#!FmoDK9tQx8*ySz}3r z8+-=%VPg0Wn6+@Iqz4E-?ONM}d->@5L(Kms(-+2y&yjQRC-Ur{D7f$!+(W17d0+9i z;(Nnf(SwG+HdkV4?@63lmQI#vIm^|ZFTeN{vp3%4ShX`E9h+lDP%;)xoQIWD3$SkP zLJaLo+3W6)2_vbqjctoy^8tu;9zwh|TYRN|DjKMoD_Rh_xHr<=g#MoV;Ah?pTNdE*2d7IneIeMcPY?alWTjBJCb8FmA;d%pWye`hQ=ia|FN433QhPVh?5ZGvXfPt(x#9kfCKH*WxebEP~q~;JSazz6o7qX>mcWdMw`G$1FIUQoY+#tzw%9q)j zZZKX{7eo#*Vm~z&3o|)4lbA*SNF&f~VlWG4^$vFxYk{mSd~72^?c zUEr;9aV);wx_xunY6QWZy5IWQJ-8><4Mn5U82hG`<|jb-&3gGwxO9u;9*0W^9F~Sm z`gq-vF^arTzpqR?a>ikEMg&&H2O%fW2Um9_W5d!=v~ALq;x7HYu%3VZtP<-0X?N%bc}9%wS60{?}?zfj=M zwA>(xbB5c)T;d--qAMbto1h_wgaXO4}hzw z+RLW!*6ecxU5dU=B4zDYSS-f>#AtX>oUTnZJ{N5())aeE zUz^CjILt4A_AZSKWQ3;w2`nrfMsgnEClpc$T^Fd zVT@O?Y9m%o%fjGxec^89M4!E@FxA@zdsox0ZKNCGhWJX~3#zXX-_xmibL`)}8-H@X zP^=Y|mzAL%b#X&EAfEFyGe?M-J*Idx#zgOyu;e`X|6=bwpsP5tu2GNkIDyGI=bTN> z+2kaFM9w(}A(2E5LJRk#k0gV1sS!8QU|TJs#U*kL~^MQ{C0KbrGJK z|9xw{_12raR;}t=U0q#$_Bp4jPF0;M$G&X|>izard(scsS)M1h7ZZB)}lhl@5;VIKjr5khuGl>GQ$XzN@y}>y#+G~wwll|1C@?4Y7433e+jijox>rr? zIR>L&o>egy6vh#3=OeBg*h?HizLFsLZzuju%2!9j;-%p?&l499X5es09Oic)g|1Z^ za!#f<#|G7K?odapo7M?F(>=LnySS2X!SsFl;FvmLB7WpNkp6x9%{Lg>tGD7uJsy$$ zB@26xz=zdqA;dK0(Eoz_bNCC7 z6v7LZJVn=pV{Iws&(EN5 zwYC-=tG&&ABb~Ry!#y2~#~y~qrfm4qb`wl_bzkI*Vr(Pdr%xQAx!b@&`0j6xwRxX$ zP1mNG!PKuE70pHWcON>LeLk)cxgpq7*9-m<_&}U1!gv2&45JTO*H)bn=f4$s zXE);B$q<}~iih9SWth^TA8mR?5VE!&eY_9B#@X|D9te3?>6t%Za0eHp9=L)Zevp-a z#_x+~&(O1dN5zY(AHaGKl=Xh?2Ewg%X~e8*z`l|2{;OzHwFg$Ozla6vPGTh29Y%6J z$G%nLuy5@|CHD!-M$>2TAat!+8G+-6&>!SzOlsZ}ne+o5=`)!7y-Fa|Z=cfrTIWkF z`|%R@WMP8qG^FjnqA*tXEgmq&e}dEVHUPH&CZ<~U?f7e%w_~rawGLpJsvp2Ps37Xk z%I_7UuiY|SPgNNavt2N)TQ^LZ9*s$(qUj@neP7}weYb9v`@(~M+Ln$^$I{6su%0%% zkgMRl@7L(ucNF``#<;7}yYFH9`VIKxqmPku_b$hl^m|yNJ@;Bx#M>;Z9@jr?$pf3GU zifvrE*I&n?{v8oMYdBmx55PQ+V;IrRn`;0?7aIG%$IxHW@=@trFU#>D_x|{1ev3$v z)8kL+6U|-u-xiw6{^}OhdEP^XiuA|(ihBNC+Ws50=!7-#Jj;dH7Qo%Yp7^so2{Cs8 z{{!s*527D6%AWhE!Sr7{7b*LJ;1C6UzLw)uG#kZr314?tgqG$ES^xZv)ej4kuy)(wJG9T8h;Rv1| zdyhWEFTkbOK!na5NdLa0kQz9P=VQ|k{!%#ua5T>!?1YMMzl8<#_vzhxEaz6+BbvV9 z;{#o|mZ>QGHbimWh3EPZON9gFTh`+Etc_6TnutGU@yDY1L*uCWZ+u4KZ1REXx9Mw+ zBb06se2J}ouCQ44eyKL*n6872L5y+81=cMp@POJ+DgB|=l{og9H3Bi<1yum#5tV_F|iGA7Eil8sgkJ!HZ0haH`f_wj=*g2cnd%AKy zZ#*t!ZN?!#p7F7ibNtf>^Spy%>fF>(^cT>(N^7iT9DF(EyhTiRZ;$&uy^7*0h zSNpKz&!Z*xGRpY4U)KR#+m>Gde}$p65hm8c13DEareGOLiTqEWZONYYd;)6be!QNf|hT=c&=j|+PxP-z3F3N z_#`YIHx*a+ry*d{61dT)`A*NanEhdOte@Ex0V}5=aLq>edTqnHc`LDc#!_rsv>N_P zc|DnDOiyjXwSXn*1MwwPk$pbBI4^bJQ+NhuV%8Wp+8SNx7n|pMt#VgqL0mY!8GF4( ztNna~n%7Z!qzw0nRhM(?-!6hM+Jd4s^Q=vtD-g70w@vm9oqOVNHb(R_+Dg$u)7)np zHbJv}(0u@{^PPD>;V-gp%D=tM5d77cPx=rVd$T`b{5Nn{{YlEd*rImtOrt;QM#`71 zOYI40U#bI|@~n~&o&%Q|z7U&MPr|hMq3~LFjb|Yb=2%GjMK5#zNM|e<97`TZgU84e ztX*>jJ5PUS;4Au@x_j3>M-W+#7XC10+#ZX(tG)o^xSU_HG9VlyhK<4`_bC|OXDF(% zKhd>SOZsS^gh@kapY1V#zO@E%-eMe%hs0vuha>1`JsH;%QV_y%c6-`2+LihvGIkEc zgG=*pCYfi?1`I~j`hJL5+Y8|{pXMDqr7Zon;F@xbauXAzY8rPANhzH5ChxI4mc z?AKAw%@D;{^#zzGoFR^~?>2rKeF0D9dBGuA;WmeBRNlw%jzzJ+Z3-ehH)CY`9`Kkv z8*?Ykz{S{uST>yFtGy|>a`ZB`t`9{27VWrJvm5u`at(Li$_Vpp#d8?C;CNVjWCS%s zxJPwN>&vsy%F*u;ZF(&$avzXaIs%S8#au5R1pCdw*<=qSt#w1vs!=$;X93Ru3*-5s zTe%)|EP|&G;(0#rqf_~A^ntSnOXy3ZOS!J7_|Cg%TBQVS{k4z~eL~5XK9}{v$tT#n zDg@;@HWj&-{#0eImDv+^*su%O@E6Pq;{nYJf}h4;>wLSst7nP5<_UFA$~500{BxT7 zGhH~|E%$m+j(gT&mq#{|cl`w^Nq>V&|Jj_|dGE%s z#env+u|4iC{4?(Itik2jzjrBaU)_S_Z9L<4l`D=$&E+|-J9+k>$o?GaeOC-$`8?i{tCrEM9AWmT*uM_ z<9hRamSw9kr>_f|m#K&`-P>U2Vs8XYTn~@-)8SI1H}~|HSH66TaSo>?*O1Pi9*d|m zpJ7cn{go}4jnii~Apc=7&j#lix5Peu=SejcwOm$@W6wp&+&=Kyq*&k{M~5J*8OlL zn>GwZX4N^sjOAMKf!6J&9BUhpYV)0OH=i^3$%a3lJgNLz=ThkYk^CpNC0g+<;G2tLHKh28z=8>6PO{g$KO z=WY#$Va|{!cyesGj6R{3k3WnJ>u>NJ*RQaPe6af-F_$3N>ubi*45@kFBWYg{&%v#a zx&2#XF5C3}?dad1^E?fTzt6K2cy@Zp3h39k1?MV8@SOE-+{;k`L5uq1kbfZN4;+G+ z?ZG$|l8jY@#?!}pJv5>3hTi2{q8a@XmwrXYfqy{NH|g)A&0++xa}s;$V=P_ekHAff zaF1txKK?8mSt%ZfU&Aqe;56L66975)Fq`s!nD(6Q6Z`NCry}$Z)`RPMuH(>wpGhwu zolDR&j{L@R;JEI6?GxI6W^-Njo0vIn0U`qrp=mA0`WS5|FZSviSiNMsl0~DhXUed~ zt&rH@0p=?Nf2AW#9&qLdt^dX5DC@v?`f~pN?RPPA>q}hg(1$@~+FC!r#e@$KvZOrc>zgXuy_ef`giTq? z^C4zoSj~Ry(;92rMb=7E=G#~4jui{`BjNn#@ZW!$zRDIME!i87csBIoXHmGubHw*; z;yKqmC-xT4gU|mgQiY3|tGSkA7|)HXp!UOU7!-??y+0t8a+Ag&^iy&}x@D4vdpG8D zj|KY!MT+rk*UHK+CSz;+oJ3XHvyHZ2)`A)1@&fI(iKWuv`kMN|;1wAUvJc4g7X|A% zTl=8+hvUW>?z3pq;oL9n*%_>RYWix=Mdx+<)D)I^u(-A&ckR z$@#DOq}Bd?UYIv~F}5dPMNrax4D2zV{l>~l#!AxvRr5;i;NIOEi$~JGzZ>-d#|R#5 z8&=Ifg>8Y^*pdDv=lgy{Z0>JJc>*l*Sj)43-$3xv^5{w%&8+5wv0?Zu&aL`#PCY_} zgX@F2zH1)+^|_))`C3>%xfvq8%J3|^x0R2k_LUl{bEKM4CzX5kEn^Ol^LCZkzwOm> z3_{}XBmVpYc&_lncJFz(acc)2f3XXXK8wQLyZ$&BFhya1^Qtc%Fir5kdoKX#K9ew} zV?&;q^d6=)TFCPOb4V|tn*;w0>Vd-yB0HI+>BedM*gh6f{d}>DYq=Lb5c_xMmYuk_ z<(|URF0XbTurRdaOkPoKxQqb`S^ufaQf&sGvt(bMqx_3Kq9^wO*DX~CyCa?`{uSI6 z4+!?;XWmywR|4DckIKS^G~pR zMIt_+&9v03#&?${y;@f5LfhS1EFRANhsf&X-V22XO3N1U>%^AV~x2TKS`7OYHhcPzwZC*=j^fMSGY?o zI>T%)q~D*Be4Rd!>!D-g-bg<1t*QH|zf8H8et^ftn2*B>)v1J7k|%D&cXs?SsU^>@&y9Or9WPUm{P zVB*iQB>jR9<2ufI^s_jm`iJONp$+YFf5hOb?Rl1-53a-};dbg#+&OarXEV}}m6pOa zv=?!gis@Wz3<76*@GPkgJagb}`sjL9`RFVA8rLDR4JyX>HYnbN=ZJ5?p2H6jee50< z&D($-o95&8{hh>pH!uR$ zShsv3HV4FG|HY@+wEYx%wU|WTP3278$2A$8|EhTP{+P%=K zY(x5ED~*Ni#}JD>xPI_3j_psv>S;Z&ZGKsXGVmDR1sQwdaVd%Z81Ao@r&cAm2t-e6OWz;HP7oFSI#<8q5xOIQK8WZP` z2Xd${^PcTO_M>pbMS8(=kryJ8FCd=lj26s@;kv3`YLATQzxUPI3dS0&ifkW7&`(|` zo*mJPHs!`es$(9pi=DF>ms1XNEYJa`6RY8?Psicw&qm{P68&=wYlgTr++W#z3~KXS z2f<$Hd(L0gFV+}ShHOK0%0u=^&SA;CC5VaeV7=I0eZGh1+Q#tw@@UF8<^D+|qWSg!NFuKG(U(r#)V zFlngzg1i>_kB)qZ>hvF6^p%&nrjWkUU0l(a^TCrx&TwFF;;->C@D@4OGH=Se4S(T* zi(GfF=7#fE+^QR$L z;QA)d_o~Ky95P31@R6*^Y+JbxRxVFPIQzTH*M)MNIv*FW2IA4@aqP#%D(v%!vD8uO zd+FjP+U7SPk2=7Pecs36NRL@a|Clw|mv{%0>(9qlV!xHxZ|<;%Ar`*<4k0Ou`<95a z@PK3NWYYtrS3<&{xbCbGnw2e!Aa^$`;+VBs(c)Zxy_e%KV-JYxlbaYStb`u~dt&^e zApO6K#L^l67wQoy)8qm11NK23?qROq1&RCr$Lzz(xX;mkDg4>@%M?Da@j`mqPngyFudf&W`9moF@!d9DIZ_{;YrmrU^@6>Gvh3sa zZafj2gRfzG(sj(8yBz!CS5wY+kr#KfZIZw?U1QIB-MH_Mo9yrBeQNacMCK*r@mn%t z>9@Z{EtH}UkP3e+iTTZVrew!>o;|t;n~449j^qJe2an65Z;I~}_Gw}_(eh7vWsr6m zl>dZ%e?|lPnCnobGD2vR?8SYz?YZvySPIX6BOX@!Y+|nadLGYIPAGU%{BX6g2zvsBq z7+7^A&xLynQz!Mp_3Rzgr<8p&h(5TJ$8)4f+XsKzg**8nhz#PH7|S;x^k_DG0s`5q=d|079rq>^h?p(Vut^cb?++GY}D>*OQ=oPM0FmRW7 z$V!~A8`^Fq{NwX@j&B;*WG}$Ei@tdDr&!h23+}ll?n>@i$Gabe;{L~>Y7CRdFfjz|JGQ7G6*~ z!8ZS++k86@NEvqg)jjf<@Y@C2e-=;m;JU_lv2I1G!d#F2>^eZ%vqbiF;5QwN`xZe1 z55uc<0BtL5dtZMIQzrJJJdp=TLy`R);(j|f7*{WEQ~iTH+D`MI?ZUBR8?b~n)^(A` z5wIr@Zk?BNzErQnb*#r09+30s>b_l;b9nW*XOHvs+^bifd$dH}Wv_*?1eH@0p!86dc zb_JdZ%yK8}falzc=+|*R8gXBocUzt*)+vr5UiJT?7T-W>@(;B6{7U>C{eL_Dna62A z3AsVPg{9!$q8Y|={<1M`z{&LcD886AJ~|eR6mD7Lz7+luq)UbvUPlVe5l0Q&{k@9n_4m9wyP{ciZ}&cpbg z-ke9NqVP1^AxQ?S*1+MvDos5kKzom_c=MIeC z&%Sbfo?SbGxU&sl-`}r)3J%48t7KesriDLgrRYUEiR>IX0oolBs7v0(l=f}8ZiRM@ zaqN?D-JhlVMb>o?yyaTsudj)-CHJDkO&wszUvz*jNAVE<+xbf0Q)QE%P9DCGUR+aI zqhwX=48CWy0jeM4uxHtIn&`9C{oM0A>Lgb2oMsshbsI7RTQa`Jh-n*9lIv*(^=g3= zoFC1lO(2_g^z3KhxO{#sPQ`J|P26)t9*NK0k0RmkGZ%9g(FPZti%EUAC?1gZ-{1j9 zd!Wa4nl~g*b-sJjhe7a*eTX?reGnbxNg3vN-U)lbU&8%|p}2Tx1uh+5gL_YDzZU$- zqd8A#TRO6WKEOJldeI_i+^jnm2A;>ZqyJ#|5$n0n(PPdfuHl)DM(;ON=M!)3ychn1 z(s3~1?@H&ZcHhL^j=j(;e?p%8h?d3`A447d{BU&q3UF;L^Thh~ip&yGoJgYr{Gc2CkanY&iG63ROMDE!)BnWwQ~yxG_ta1D4)_RjCmiNnD187_9;kGHPtOC` z8~9AgeG2DHt-c@WrP@r&zUcnQsBEtLugNvkrFq6sF)WK?$?pETX8x6#8{qbP@L^{^J?V~ zv2!Wg+E|5u4te0pxpg=eJrB2T1seFXZ=TIId1vrK%$mOqKGE4+qq~}8K(Q4W_-lK) z$h@T0q2JQ!^jG4WkdFnNdrI8v?dadjxZc*!6a2Gj*SmIlBW}`0okN+={$f9J{&a!; zpIzAP<;F7#+rhJcS9Gsaoo!iJ>iu|xT%tdU^S{9V+%E{Y@GE4G%c{+}JTE;A)r!}J zd)+D6)^#63r(Q(LLGB~5<1hVx(oW0%7}sT-FL;x_Am2l~Mjt4jAF}Vtz}VFDri|;h zUE{4{eUGv3<0;&^hUkKXLh#r8BzrxT{0ol>?xw!6mw(~(N7xf_nB$Wgs8hZkw)vbx z>TzODywfs&Q8J$#^9{o0aP51mwe)|`9u4ZYBld^6cJEit+5L*6pZ|(;{{w^_yNc!< z*VN#ekxn%#qFK2z*y=q4w?Ep8oG;i8KikRqVjJb05_g?-Z+vfIIG%X&!NjaD|e=QCi5bW)8Z;a~=xtDgI^ETN* zxW|5I4%>yCuTJ9jlgr55w~0O(h7rI1h+Q_C{v+mM<;Xtl%f5+)&|leI z`ZnPnv_S4b^F94NR&LGZn!RmY&s!HRwI^}SPXczY$VFPJ(8_4{MgI%_ne6wkU7do; zMayuF%qytG@xI?W+8emvM(p=`-@b(f(=1)hYkRs}D|u!5b3EXLzitEM8Nu9+zt#b| zJRJ)U_-zbFb=m`KSFH~(-$O_^@>iZu^BK0y&BE*+ThO<`D70%a1g?`eA?V0MWPbK5 zE`IwP?$Y(rt-sUf-@a5ds@sI~iLY|rz9XU*azA#TwrEqiEPZJY$CcZO$o+CZ^1j$f zOnh*k4oot$H&|LO(v zJ=s^?SV$k=XzLyLv(L}*T+ZkFk^PsOxOD9ZlKti)){E=+H;?0dk|)pL@`3MScl4=I z2g9m&LX-C^p-QO=SmDcl%h%uIJo!59>93rh{FVL*{sHgsCvY1T&bFW(&x!2K`RL6E zo_&dJI&CPli=?Lgf>i3vjayHl4#%ycvt*t5j4|`n8XaS-&heWKOWp44Sl^TX`uh1; z@W8JoxGed4O{NB!o7B9m;NapV$izz!G}>I(<8EFku3YfL>hS~6uX26NZZ-g$KAeDUqeh}v{pu*qy+q?@%th9tkMMwQ z3h(_yzk~EUnfmk>M4kN`&$+mUL4&-}vDp~(X)ql#`vhUf>f6}8|4VpoIDk5p>ssTK z{++pQnS1Roa_ygiKWQ#&@MTV3+I$lig%5F4|0O0qmW=X$K^}N9{*q6ZsbdR!+r0wi zv3#)!?A>(~u6SN0Mr|gHT zv6zg>oGWn6FIFW7VJ z`78msf4zkp53V3HW);#yr&9N>qm4fdxsM__r?is$82eyO+b-Dd;)1A|vUi()9_X(v zYJofY)oaeRJ8z+7^H$ijlXKippCRw(U+|E;koz-mow_gUlih8J}OccN|@u-4s7!e?m27deYIA@lzqWn1qZHzm4zMgkhS@0oM)!%d$QI~=KO`1 zwEWAn&KT?eI@Y{k&#U$gN%_KG!UG(aW*vQiQ2+fHH)K4TR;!DO?-oN@?hPwXoXc_l zL>aDKEzf-&jjPtd*kKb9L0?j5*w?sx_7m)jK88korg?=@Jl}l~_dZWx-)k!_9$A9~ zuA7UTHyp=fy>K@-gyX|7;!Ym;lsfv;-74G@K6thVcOJ#!NY)X=BxE9qXFXrdzs#{6 z+j{bi#@rE`@~&i_y5!GCk^NN;E}c)r(OnC1j^n$#c{`CuJ#+J_A5yrk*VkmS z!+iQ`S!(!eiT4|c z$4I_%6We0?yn?u%Es6K8sr@IiuSxor(x(-FmcHvFQ1Sf|=vluS!e$T0(dY$gPEFQQr3FkU zjk%^WY!0qn-A4US9*}XkjLAM@JN;=A?tQX{Ji#>?|8pHr@f)7}_ABzfJVRdLoZY9f z3V(;Lmp0$PKl|A}C{!n|5h`V4f zd}Fm$?2{~+CFcsh1J^bU5VL3`&ZMtGKHL2}c|pjGo;CVJDIMr^5`#@%W!VQs@4P+;4KJFOsR-*^f7MeYTA6%yvHK%ageO<$YYdl!!A2 zSK!8t&C32L_b;E{j+E_lv1_&)qGpUl^lTTzEOh0bo{`wK*ah(`xz>RD`S#IQlgNLF z`wYx&K1TWXE5-Gh&5BjQrh!~*R<|1G8s0(I$_>ztK8MTDe_d;?PxR>D9Us&zhe2&> zqDOO{8(E`1BK!|1`@X_n(^_Hgz{=1G4jeQd_E^U78haz=^HPq&&Xj)}{#w>`8HN4V zydZfB@Pv&I^z$l@!j|u(d~3U-!rSb7s%x_>$uHk^=149kyUpZzoo`{*hi#FteggeA zZ=~%nf;N~CWphi9nZxqd;${xVX9`#8!^s)~_7ned36H-29FKnaCmyk{`S9CpHMb-> zK;h3eUhMhzzc`5df4PO556t%kG~za7hUT*ofG?jITm&2JTSiuis6gUBQPo-Vk;FHrJ({Nm+r!t@OLhJzIOc zToK3pTf03*B5w5s~D$v(+r|MO( zykAe+nu}rmfPvie?@AvOrQq7I6QUPPMYBpJxQ?+K26d=MpQo>&U#GsD6JTFYwfCmZ zCuUYZPvd9Ouuy#LcuPL#XRP}MAF1}=EKlwIC!U3tYk#NKM@-YYU*o5+WxB>)r(3w& z?%Cg?@7vSlY_cQCH@L>AKWdhJpZ5N-xN?3Y?%oen{l1(}X@h?fifdOklLwaI%*jo- z{UDwF_WOAF9nT2;=^H#0*_XgJ;K6qsi~Y|XD0+tTz}dm<56+;!KJMdQ zJ{o?mW4N}wHrJ=UgDo!ov2jE{wNH56!2US6aw7c?(C>f6I*3{_fxalqa!+(kRN)@a zX`|=hc2&+6@u8EmSx9M_+ zK6l8omTSRN*IDs``96DkVefHH6F-ybiI=&~s1K^rC$FF1IIbC_-ADR;9Q&y`IL;GF zKk)kP?KsDIf^+A{2TzXS!S~Pb@Tb4w!7snyfyoD=3m*LZ9df?RR61VPpQ`rY3GMt` zvvZfW{@b}baP_(`eaCXYmaIu)kbA~FpkXHve!0he44IJ&6!vkR?mVAm940jD#&x7` z@oc2FNaFu>!&vWkizq%g$o|3lslCv&dtcVWm51+;HA<<8m$=sSL)wYh7OZ#U{2#Gl8=WmdVJUNi zPj{0a_Nehd-m`<0`=?3=JoxoD>VaR7|Cftu9ZwF&iMi}6COc;oL%SI!bZAq&d zOCyy2esf{r9^fWYRDk zS~mfWiGKsyzTzW~8tXUp_*ZEB9|nz=&`rsWV5l)>tne26m@a3!3Y`rs3*v7)YxV)0 z>Yy-@G=-P(oW@^cV_mrIHrET}$QoT41AKXca(|w3eiivY5dU9A{(na9_dLtxo7=Pp z+@P)JDssO*gPcDfWL(*wR%Vk$p2wXl4YVk(sV}z@(|hPh+oSP4a3SB%i!X2dDRG9#ik+ zGj{Cl_&D%%@IirhnD4YdZ#-kx+x(W_EysMnj19v5_n}S0mZ(;`7*=?W#I zumy7c9@l8(|2dQGKo;A4wgKOL%J!dUxc~GuukSPcIP>gPb3oDuR61YDyIjj!5bBT5 zGjJn28JT<6(a#6>@^74gV~Jke=Ml;=;9BgV{@=|$z;60UgU{hvd*mhX=k-g|_>^QP>dJt1>y5`-2qE~nj$`cAFoq&;0| zZ}0@~Q?9Lc)Q+Rz>5QG3W?*QPudWrX4J_pu#TzES>9e2hWf}D{Y%>}^i3KbD-@=+{ zx-X#9jJyWUI=_xp9;vtb7Bd!`l$2u&@?SqAvDiq`_g`i^Ivy3+9`x@yrk?w`*f?=P1b zuG7wR8YeP%ruTN9!Le;3jwUQq`}(9UxN>$oZBi4l+jBJSKofW-peOf!?XE#n!`8yYDOLtf3tlsc*Vd< zmu1B)!;XRd+8Hm6o%O8AoAzh)wR0Zz-{etUj@C8$8HwdAlCz}QHu^+q!Ts?y=yPcP zoPjuVnftDv$r@g^2cM^~9k_yrKYW6RKYx!$zy1RcfB6v){`oz_-)SfKD<1yHHsbG( zk^k*o&L5n_*)zdN-@S-?IOgFr=bmoe4x;ZCqwjy^q7Q9DQxNAp4rv_!UFBNwypK6I zbTa^HyJq3Wm2EheK_6xAL$GC}`15x`#LQucTjYYV?HcjC_`0Y<+jcGTK%Y+icuv^_ zOmdmVGbqR5!!85RoMXZ&TuW4=NJ*|Kc?+_~J0a?r^6#SYv(w8?4}C57<+=bSCgxf; zB{pn~ddz0V!Y9r=X8u=tfcKqcvB10JJ$$zj9DJngOHwb1!;RPVd}_Ps8)hLJ?dA%wr!KyChX)~zpU$$z5(}cvG149d7%f?2M>Sw z36D5GkoWajwj0#->=Vkk{ubAvU%TnA>;Tyx(ayk-!|{JM$Ag!-9z8W;F8u^A=DYyc zrgI#a$8|_|>C@tLrWbi&JMPndnCvrEVZU#~B*fEhxM$IDM9&+F{&i|%aWC5YE7P}B znX2^n#j{g6_apN}6=c4+4EI#lu8*m$yI^{&?x;e0@yPz}EIZfIsfHZr{*plxJ1sR9 znnntTLa-P7W&f9v&!jnVv5!Tx-q-kO-C)$gh6gb-`iBN@NSQ`(;IGS&bbEbux>dG~ z*L0fhds;lDbc3yI{+D%e;?E#5-~iVV^yS*AqUh1S0fNKk<2u*$=W(r=Yn(DPso?~ zCXNSX%y@&gr~CPVOb^GY1D=SOHv;kW>wG+F5qx9uQTVUb`ZQwIv2oe{LMcCBgJRgpGTsi-rl5nAbZzn~2i{6^f1!=13 zt8pm61EjzHZ|wgPyOY_EH2Fm9nZoc_vT5o7T^GrxWmei6d9S`F_!>B}|Do>LaFg#) z_hqf2alf#4>gQB!mZxnN7XK)|`be#n$U02F!nCXPXvsMjuAA-Ip)q`Tp2mecwCixp zpZf*-^t9i~UW42}A0YmB**E-&V?~Y+*l#q(hP*E}1(_?7{vpST_BFz?Unx&)M4}&P zf6S#F;>y{LoC~0T`M}w12ZC^D+a&Cz&&LxH^l`y6QnvA2ujEZLF}P_RjBDKjsoUps z?T9N97P!)0z_82}{uBG66~_pTIS&{Unyz%4U1uxoOuX!J;Vf5n9x$FUF(I8aJ{o`P zzTmI0Gx$McYSEaq*ZA8pG4M6+Nu4y`sru<>1UI>7;-{Y}5X*P*zJ8yMb()H0{G-OW z%xmup+n$qem$j1O8)NI55c*N-%6X*XXw#$~mU+%Z+L=AL`*{}f{)gc&$2cBj|KJz) z3;yvH^0@vZ_wxf>_s8%>8t!xaaR09tIHo+R+6dXFF71izRm&6GBY7Z?_JeEm_mL7f zo%2+SaVIAN=Z~!Anz7NikhTV=;#a_rxW=z=qd$t7JQJchCbVsVODDGC6z3QAuO3bN zpbNZRyC@$;&FFtDlKn$toxjmHw0J<_=b)o*BONp^s0%dK8e@AtjlVsQac$u6Li|Z< zxu=81(9RncA2FZ4FR?CD$6~Wm_f72OTH{_IHpjIpOXX|+rFZr+D$9(GjX1cu&Di7bKWM1w|UWu)DI(SO)64MPkr&+eVgY-~)rZ`qe zj5!I9+1}{PGd`*mFNNBbt6<2mLD=BC9x3NiaQ&03c<}d6@zHNT(xXV~V z^uP2AXfx)xGVhza$o=ta&LyAW{#Dt-Oxpwb;~w?G&HK?@H_mo}YX#39TFo`<-pGiY zk7N5*vL6>hA3=+7B4IOa3!w;$nuqQk>+=kSVmv=-63^GYVax-vU#s!fbW-$F<8*Uv zKEKV9BTYl49~}Jx16Rj?;R}^!_W#s>p^?zk40ih4uZ{N`v={t!Q1eITf5ZN0l%?yY z%TUi3_72ubcv80)x*qoYT2Dxs&gDs(ewWTy;8}g2?~pO0tVNP@bi`-%obe0Mv1vP0 zDOnCx%9KaDHtjKa)*SeUMjdThL2NCyvgKOK zm_7&Ay3cxO8FSc~B~4_`h^=c|-K2i1Trsj8D_X{ngk03$j6=K=fS}|`uhV>qfru6GwmHQd0lrD=Vb?afkhg|DBXDWRBHz4ld zKJvvyoVpye;`4X-@I*AMS6OnN#1c^t25Vm_8 zX7h}!4vnjzdZ`jTJEkmpx9y3|UV%84%JtnG!y5KrLzhY&E&R>z(Xy-Lg!t?G@@+b( zG_4EF{=CS$BalAk|BELdDmvKdrLNU|2Oaf&$K0dLFFEFzH1>LaN&R=Oll+%@sdT4x zCVZdZ@2u~v_wpIzIexR~{TJ|>`gR-s`uPI1G3#aBW1VE&D10C`MWM}6`qkO9GZpJR zwqwGGDd^t18ya$tQ?=qHsV7PiztY_ARG#abE2C}Gdg$7zJ$m=-fe-uiLZ6=9(4_;< z8f{)5E$I8DZiUjcOEK`7CRJYE$K865rF)F~M*ST1x8^m>=k4Dm_0cr6rwczwe?fRc z<{Hk>{*sY+1@ZLp8nh(_-b=Tsy_l0+ref5GqcF7RFbwK8NMSpu>mUs8H5_AT&zr@$ zO0T)=)EbYNkW`j&mG66~+8@#Lg1gdtnhr0ZnZ0iIYh8CmSAL)VuWk5_{|2T;K4Tt0 z_~G)ugTLURFn5j}_-pw;PyAIs&7`$@zg(N&W#!Z5ncuB=Q}U?iqzngs>U-tC@E2o; zjxpLC^`Fn`Z+-q*elORy2){UZSij4(JDBfPHcIQ-$fL`%^MtHZzeHUjJR&lw=_>v5 z^Ag0yDZImehOFn4H6C)U+msrtU-lyqqzFXmFKCAK@_YHYA^P04f@00pE z-e;62m|J{c`_=+=m*>pq9ekzhZ0&;wanl&7@04;FG?mxlMxIYb^Z0Tj{8PkB;8RbjlIO`dv*DR#rF3*-Pc&jciXS+7{4gpo~OX` z*0%{QNH6l0BQQ<>mwWPFeuIUj=qKWTjrdcH}?G`VNcPSUOSNI9A|I(|`_`A+?9DwcXP7})YVEqT>x&aoqp=4UC# zsHd4%^or6kth2;s-(T~A);)UfpJ0AHOU6K=0}A;b{av=$;y;Tf2Hox7rq8O7KBB#j z3Ln8izTK>+@!baf&zkui^fqWDbTVkod?x;uzk4Z1(iqEkIf5RaIQl3?9gTNsES=Mg zIt%_LA83Bl?`67Om+5OIy9#I4^|{!fk;RMl?`OUBIA7Dk;0ZhaCiV(%(!}CTgTCtB z1+X{hq3~DfEQ>O(X)f)MU@w^8Jo7QGaP5KU0QvvIc0lOMpkz|E0kH?wr<}_C-@Gql zA?IL>9rReE@Ys5Wb<^W2BWB-NY`IQB`nxJHUH5&Z|Mi~)>$_QJWqY#Xg7kEh$$q@p zb=ki=FF0Aj>A#|{^u={LH6vXGPW@Du?)$taa3hncsS@Lw39KC4%f~;BJa~)&h?T8T^;4w zdEI_3<3PuMxwikOOxHgD4Pt&72<1HjmJ&8%D7PlH9mjw_uAj{?_CpT=lZJeap13b(m9X%@BFOu z|3d0%(y9QTOIji23wbs68DzHt!jEo$A1{H7IIiM{L6nsr%`lN!bbw-6hXBc-!D*=l=!r$XtM$4=6mZ^Rxfk z|5aUBXN`&Do9*B4xPJcqtiO6*&lefrAy_J1W|pn>Q$e~q%5{FP^&X+84lL73|4*)o zlT`-G((iKEZ2z-z_4EHKey)6}hvsjmSbvw;_JwYCS&(}&ccx-n{r}bbfA7Achbb@4 z*juzR->K_nkJVfr?_bH{oGta51(Mw1k3uV&tLh@Ls|E#`8v7E_fQ4I{#PY@p~2hMZegvb-b(acRTJE ztkeG&(=FPWv@qyo(9rpNth~=*^l#FEGAQ)62RrW0@6-S7?={j4T&|p^eOUD;1;2uI zu;W?ywISD*4A}6O{QBJzOCI%K(rxwEvRYXA*7JqrSI^mKDBowNyZ&AyHhA24ztltO zpk;*j*nU~hD*6hIS)K~?Sw*|NAp??6|JTnmHuaEdw^>(zgz^7#sBC zbGEd?^8LS&_FSDz{4{QMEbTn0uXR54pWjyy7svm9_uCZCtb@W!@L`!Ma4)ScTbCvO z?bqr*pAr0Z-pd^G%33+AKWTfWFrIuajb&N$LJE6>zx8)J$4V}oX!u;2g_Pq=&%(-) zJhE=PKrrcJeY<)$=}tOm8c1x>Q}Mj!eLKIi|1a}YYCcn92klkeC<96kblpY9?EJ5< zZS+l_>!&?D_y5)EVwYA#@v`A7F&T~FVOFixUhQsJ8AZB(RI~n&NTbI^7Jzj|EqHB zc?#oy;cq)l4BhVFVT1ogcBtQV5PrAxy`lFVGVuJfs*chYn7nWFg+wnrTc7_1`#V(m z=JzTLOw&-czSM_2!#{9TxD-&93x-z!c;Xk=9j2`whDNFzV zy>fLPi8USVY4&pLdF*sGXd=94@RT6~nkHttbx+>o(D7$DAFld4Doy9rGGXIo8-MG1 zYMwX77V@mlFR}4{$ygf{6EqA zc6vDTrqIXv{_p+Q^eima&pF@Iw3l?pciXRp9uAu5`~_p-e?tzezP|h?tsG+j`?Zl@ z>vxea^$yZfu+Ti}jEkgOnA)yilwW<1S*9*a=hblmdN`G-p0UwIe{*4Ul6wWpQuHu% zkWSYa=vb%!UbzL{WqylQcd2h7@3qP|zem~Lr9NgGAogf|tuPY$n`IlZfu&I|$369* zWvKZS^1sYOXgu^g?Xh#+?Dy=~&iS1GzbNmE(ltGu%PH)?MxOUK6W0G~$NE6&Oz3s82>%9Lm=9sTQ9{accUOD!B z|KeJ{!%kCsU9D@UJPvx>X>VMs^6cNvXBF+4rewiZmb_Qd*?vYLozBJ2Xen%Rgwb9a!t)2fB zKREHYoWWr)$N9hFy#nulsLt)MKV$Ky$pdoF`WDjKx^JVqzHhIq^R>>SpV$BGvBFw^ zyUYeV9Q=-mi^p2rB1re&N1)l z{PuePUtK$wE&ok=D2$x$YhF=&!h4GUm|y5`r@5V`1~vtG(asyXOoNw&@3rmo1`ui+i z(zM`vHIM38^8D`io6ks@|B9xXk2MeJXY_v^>-stR-u!N}{`wiAyUwp-&7+0I&Uy8J z;diaKIB#OmTh<7f!H&su*U|=aOs#^0M!HRs`dQ!M^gf-(iuHZQ;#<)AE}Q%){#XA+ z-U@zumifGD2W@3(88GOspAosx*JgXdaz%da>DIN0zcUXgIpRIVLo82yuly&SRG)@v zsx2`2L-@(!MV)3or)9_)(}MhO$g}Y+Li^{#i}}BxtZN?9bg}=p^S#{H-|77Q#S2$5Qa{3@cfFge=BFODz-5vQmJql27=a?=;#edF};m zjo=`3H{Vl$A0*wpXYjvSC#ESrF!}vC{+Dz!kH+3!KZF0|ox=O3%~~+E(?$I^(hB8& zmhU|8r{87qH}e?Z=HO@Ro>{(K4)nF;(e<}@oMlP*DxLg#PVw!70{PC7<`RUTHUFO> z-OpKp=^V>A=+S)tpft#-De}#^jeSgeR-Dm;85&v*@IBG{Rnm6$M^3y1JBKtv{6hm zL+Hr82p!4)u8dt-ABHfO1nhK;$Ig*)jN@2WrZI%8z`8NNgz%C384`Jq8~#f2R5FgFSm=x*l`7i!>;4luG=_4eQ}C1lXWOh z$&9pzSv>Dp`b(l)RlB3w8{sqQPuclS z-Q#lw`P0txgwX z_nK>rMbBrY=kbgt_6ex3j_kUw^z@epRcUpou?dD)=tI3$qd@RN^b%R?Y z7q~VUhGF#wV`#mB7*clt1~Uw*+YbZHAlF0c^=F;|7+#-#VHym^hz3I#hQg(xJUa*- zE4D(NqE&b{U`d`CSR9q#E{g`mYokZi4j9V&Lz#aF-!Vk4)qD7^I(%2Hei&43{x1zJCBl)E|OT4e67n@hD7eJ^|BP&)_+9i{aJX8yoxj!EZ>E zlADN8lm*xQlo`r`$de1@iXqfRt|?oj(N2a?(n|%Vhl?yxW+KN>z9%FjhHcaywnOm? zGq88rQ6#QBiIfdzkVaWa-*J^~=`9?KzsLR?`)kxor>Ucq4wk*I#8vuTYHnR*M#+t> zy(Z5n{M9`Nzu9F%@t&RE%xjC^tpCRIdMsna4*u8uB8e^iZ}GqIp(&rj&nh_TqxoOQ z#&-z6JIh|d|Cao)j)u&$K2kROC8rK$^UR^UI2>_9wbw}-vXJ0;jO~0n`v8YX`vcUe zqR*(WiB;HeBZLkkR=ieW1aXw0FcqD-k2o7a=}uz1y88xLp#1Ca zqeH2-aIG~O6Y5XFh?*nOwq!Guef4csUNM$altGs-*E$rIX5@XDd0yf9>94YWuc0{W zT3qTZb${h;mR*Er^c6?7x5}Y@k!pNjQw*;$04ut9V<%}9!mv|#oct~PFLaVN!V1#% z==Ov163!6eB7u5EWPT$$sSp z91XpJ{nDvEkd^`Ra$)?e>L7fsgIOoV$M*V3dnf-bUKe>6eV(tze3?-oLE}D$MTUh1p%bFs0KnOl-dx*-fAvJwVZ{aO(yfK?=k3Eb2z$G?uYi} zx}#OeHfU6&5o*6(4OQMONB%B}lH|AdUw#us{_raK_+=#{rC)mwBdWS0ylVoI`<}&t zKBtk``xp-OJB_q~=Md6;H$JS~8zo+O!{q%})bk}?d6PW+F3P`J997;ZkGgNyM6>ss zp>^pF=vbjAx>p^D-jtz!bthn8gJ~Grcov2?o6B>_7QnUDLb$bF%&-Kb+AhZE_De9n zlLsbuUXD4PS7CLZKm-iihv1?65HgHy0O`3?=?nIWC z{cZMhwJpsW7ij*rcuebM#uon+m@0ZU*WS zrPmdG4H*zQP-#jAq+MnnUK=uD=r99A$^miQIa~tM*(U59#lDH_T|(%VtJvv#3(=u@2-%U1px_*YMDT3)U61I?@-aeVA0s&C5dtG0VS7kE zwg=|GXZu}j-E;%%SDeR+`G>K1VjN};3C5UqD=@U~6!K>e6o2(Clz#19%&a#D;hpwl zQ>#GCslOQR)yH6X6&FmXH3^FwuR>tQSS0j2hVgYLqZs9;@|$JQqx?V&u1%kNZ77rd z1F&FhJeJK&$I4}Au+IA`Hf*_tjlOrWDIf=1g7UE~;SU%xx>^SK4TEjJLf@)C9|IE9_FGO?3-Ab4;bLWXkuFihxA+A@SOh<*{hu5>%E zjsFJCBZQ|-`Wt#k(V|!r8hnY@!h@d>#gC!poBcD3|}?El@tA-@Z%{}MAjm19MY1vxg8{-w~^pslo>nnt3x zNn`T9YGb9nWr%d;7)`aklmlWCGCUSLhQ%OgXf#6<0@$zh=XJn{SopDgf6~!^Y%=`E zAA=5tuP={(kMy@U-uSFy?WIyML1pl|Uz2#TicM3E0yUd580 zyV1E~U%W^C?OJUld|O9gNyF6`TxB?#7jKRh)w7$zs;!r?iZZ-v z!v%P+J%hDtvaoI?gD30FZ`-)^1hy8#ZV*8>K@LO;kf%A?bc-Bz_&p3*pDVYeE zn1O%^hY>J71A$gZ=l?YLk4q&TNy9M*Nz(%e7_}dP)I~wmQ-MQc5I7`Sg#gAn1PSC>{?K)V?hsFQGyP~UK6lC0P^1sSs%9ZZlXx?}5zaax+>r(ev zuGqwn#okdix7fL92&ZjC#+zy^MV?lD67r|AQIO{&m=?u$Hj*?FeiywSG%OlE14FRB z&vq>DwipfssWmmtcOM=>Y`D}`e<6V8TqOW zn%C@%7WI0fRpb6>(|i~@wjGTwohPG5uQ}+`e-Zi*U5+86*1%=VMvR)c4Wp;|VZxkX zOr0NrnM-0Y&nq5_Rwu$^eJWOMIYNFTKLwu0rjV=H7J3ugLvLeS@GWc&yoJp^H?V2* zHLP2H7M`vt95XLNY4*8mzf%pKO*UY4`!KjQn1Nbl8^g_gGnRT~V9AmsEb>UgppmOk zyL=P4)}IWo!LeA_ej6&iT^@Dbsf$@3_+#ZnMy>{SKj65!Ma`aQMwx9|xdYGm zY>ftGTcAOyrl?=M0U8#oiw3q(zc_IyQ6J4qH%6QCAD~N>&gfg~LyTxR0+U)!;#hnk zR`ytnP5u1g&;F;_9~AG??iDjS3A@}mwx;filySC_5$Zq6iL@E2pT#(mwzXK=n3HJR zJxUv{mIcw-!t+Ldp7C+pd>rp-IS_t!mH|WOJNRFhrOIP|N59I@??zd2j+xAtJXZ5D zX@TbuzbHf50mIEUG?e3^Fwy6t^I3NpOUZXdyNUfF9)5$v;oW;P=Cxmlu}$33pR{gY zp(PrZsDm2slt+cvi*PLWx*7+{cv8lhMK}g6@##GjcOX9VGVR|Pz~K0RQ*4keRo_{SJw8V7-Mgs zD2R%PU~kw^Q53L%h!p84pooH?(t8oC2r70!srKHxVndC+#}qZDo0yq-=bb*!_pEd7 zfeX=OzW0y)+vlEk@7?=ZeeJz4wr3YU+XZ7RyRvm-v%qL8ON`>4;5L>$G1RgTdG;XI z6&VJbL8CEp_(a%_b%(uk5S*q(!96e$zQK#&?UaiC9c=J1ZPJM*PDmMDh$yEG=+dqi zujgX^>=Fd_2}iK`Oa%9yi}>JDc=>0-%CHaS`xPUJz7<>JF^cUvzOy@~Ij6#Rb`IQT zCBZ2m5)Pih7&FNWBkd+**l>Fc9Xx`yF^9mW&p-_C)ekm3dtqb`E7)3f=kM=^(U#_H zX0WsBf^j{~V9)#iKTu%FUjZ7%F5^STq;1diEQ zD>K+ybb?LSju_I}7y~)>z1tb08|xpNHf~CtuOaR64;0&{Dd(#RoAk{&Z*AUhNPD~$ zx-~aNKaR5Sk(L5LX>j~wS*%9bs}{|;;opih=GA@~?d`yj4_ z7Ah7Tq3v)<@yCkaRmH!KH!Jj@=_kZ0@v7)8zmfse(RKX4zW%T3Kk9XTTloUxBj*_l zJ-Fc-{f_%7$0+M`dZR+CFVD~<6*Nwg1}H|tWeE%Z^_0v{B!UTM*MwkR())~{nd ztId%fN`2dn;T~8Q=0@FV3Rcc=#xmdW$nvy9lFKN>Otir~$Ds%tXN@4+{_q{v8}8OU z;L^7z>+iHeOX@IwJtL77S_S(dv(SIg1VluZBG@tn`Lsbx+!rB_Hg{C_xk#L|69Wc} z$JEg=$VjY)d+(XF9U7sJks%zdx)OWc;4!!drjP26Fneo6It@e2l#xhuAA>CKaab1M zh`gXlSQF}kwP90Of6JA1n5Sa%Ja^V;_NZya^F2_sz?1*k6I)orb<098U6bS5b6a_B zD?dxWC5Fe+qIt|F&lW{_U^Ck$zJF7M8#ac!p&)E3@0sRB-y;nmc&1mH)~Iwum>h|bHuEnvuUU2 zkRFN^dMKuB5V@ep1BDhy7eX6iS1?{vHg_)$t*U1HPUL{lfr@oCze=M4wb%5OU&#TT z{j2bQ;rq%vG#go?Ew!&A{tv9YOh1jP%d40tuUB+=VxBr*A%EKnmjXnMiiQ*Y)ID06 zquqy1`QPc|AWvxXKK+7?8^Wqh3k>gU1n0ipIL`yHz-c6FB-tZ(mJ2pT`(azwEF4@n zAE&k_;mWaWRG(ggD<>D@;=T-=V4dduE5m3n1)!4k*DB(@Q5ok$I`Ag`bxn6%8sml1 z81H&b&goh#dwGWUm&TE9*veSnyCR432v zVqejtmAItX85KNN$=b`OQAOXP@Od>ht;VNCm#J?j2ptI4#n&pdp!t84&wBV*^Cfia zpA_1n&U5G~O6KlIA#EYy@rAUD3h8?(qJLQYIVoc^87rECo~^slx7P@b6dCvj%E(5r zHZj6v;$)WHAf$MVMSh4gYs0DA?@h+}gDLc( zr_mnF;9mTTaOJ{c*6du0>dPx|qk1K7Ue8zR`QEs>8aHmP!i`VZZmh!fYx$_YlE-@A zxwulb0$15zyUKfStj3+&YjN-1dfb9+U;}}m@^&}-uPu-(X zYyR7CyyT{WXNgH``L(q%UF!d&1%)1T*jH#kr~hdFAJwNRGDPG5f`2_4pnrB(&RJr= z5=Hc171Ms*LhLV}l#j`bRd#A@$lv`wnoyrHZPpmJ-8y0Bn8C=J=7SzCK09)G?OpR(@S$YxBpN>7bp*XxblCk|n+A|sC z6*;(maRu?fdB3xob)DAX-qQ`Z`{`QN^UBAS8_RJ1H02NJ^l0${oRT`ixncCR_eblG znj?I6DOPO%1>@~vFrbekifOw(Ieh^C`0Ho**T28RAHUv%s?rK%uDAwE%TaKjoQd^E z{}(eB6roL%7KnEpjT39pYZE6efd(~Yc0%CTW>(nqX8_L$?O)Tn#G z8m3UVI{l5AxLmaix2~_o!+V?XW{6lqIU{SkPfJqR#0||{FJ^tCIDL_1F&&s0M_`B9$W+H_wdKcDSlY) z;!R%fjx1MaBzid_c(OHZa08C(2a0^?K)GORG8l1V6PY6-HnbXh+vHi!T&#nNuU+h1 zHRn}_b>aUSzt_nEjrR+`mo@K7tU=@epH*yMP5&Vcs4_sM1&t;oSL#6S6>JTntwI`z zW~{vjWBkp;Ms4sR{V{E+9}mRx>CPyQB2QSTwo<_^byLCQ{(?EEKED)Co)zI!)*Qcg zZ!In#&&JV>^C`cn+mn|F-pl3_*VNz3Vq`o;kEi}RU)5(t{#GXWVh3@&jq;;{$7Phq zLJK9Ni4xYPEsdLo@?>AqY%mT`z8ou$Wt=60HA^_htZ9Ak@j5(wwvlyCi5p@_FeP=8 zrN8^xdfX)ctRhVuuZ+Qg^>cA>V8Ym zpAnsU8r{r>!#9L9b?*zj{-3Y$mw*3)&wsp+?N>jCvrim)bsvM2#aB^y;eTO2C6cy% zLoBCGe{pXTK7UD?dz8oV&tkkVj(MPotiQU9b(;%VkCiohNdpf_4^p4^!82l-Jmc1# zeAej{p1zp%6|->pVh*nH^R2t9aQn$R++{6Sp%1Oy*U^a3#(mPood@f9|4N)cvk0g8 z8;*0Vj%{6lVu>l6-vb_FtWkL%Y{*`iKo-UebyBnX-Y;%O3h?wm+gRx)l~JO%+*XWzY(<#}31~ z+0(F%bY4mNFC+F#h~urqz1UX=*3L)ug;jX)xQOz09d))vI7}UXM|u$TAl^%xw1o9? z%Zc}G9J@-|v|A`MHqa(rAL@p6p{^(Z+WFhO%7vq7*gz6Fc>yNyHU!vgXPY4O)*qB)( zI5Y+)FI>ajC!eF@_&H1toD1{LgAg9I8x@!TLV9@&GmAm6Hf_%uvebR@LUFosA$5-> z!K`_D45rSeJO5*nE@!kC-Pu&+D*XgMW?hYdx=P`j3`Vt>#ox2I%mw=t~lVCjM1> zT8H}@{MVkpdf^pP7A!$?+VowTH$$e66Sl{a7spJe&L`NXJxWZM5zo69&E!~Qqv~uv zPVCHLjnIXtNDji*`Q+*Igx8CV;Qc}~(f-&l*8__@Cm?$KC?vbsVR_(WZ05E7tEj7# zB`}wFKDLpkZzaFq675F2jQUhs0Ix^j)b3=;aOyC3*W<46N6zVewtK|)JALVxr{5pk7|OUE*BYD+YZ ztPaD`RkN@+YX-t>`@xj;Z5uWC7{1|)QF;IG*mC~Qn3r$>{TYwwWyRRV;4$dlZ6JF0 za>ne$W7vA`PdNGNFYt;;MZ*sopa=O!x{m|)uAM_YKOX0I#4z_SfjC}F8MO{iS)2DU zYjNKuKfib?6DN1Z;{s*bZOW*}Sd_SYMD4Zws?N9tt?~C?Tu)LM} z&j#u%x%5*+`%XZrr#%X0x?%Gi`W_?bi;VO^=>pzQd9gWS8dBWt;W4Nu^*m$x(R$KO zcEA?;6pn0&#@QX|IIw8}$}6K!XrY_?tEp?z zHs<$S;_o_Ix&XVEPRDl2+zQgdHu9qi(K*?+QSaPM9(8d2eA?`(xGr`@buMeCFQR`T zn)R}Yb=m}Fl<^8JkS4_6b!=%E4rPU5ZJ-AVd_7Pa>4)#`r{iz07vrx#EJwoZ(Tcv| zIM|*w;2#r@VxOvd&)ayvhH-r?YscC(rB|@6`ir#dN**Zf0{N`sUwZ04q?gO*zQmS- z{j3*i!g$sDm_2$3c{uGHV!vX6FMa3E@L>JWVV&D!QWrC%J2_DQ_d^lsWOKL|>4o~v z0)OgDo(LargArX#(6Q0StP$Uaen11`2JV?OdbDfRX%p-#nV3*h@}&zV7ZeU zHiXb;m^}|iwj|+1WeN^$T!`)2v*=Tz{v$dW^|uOs_s#@g$}CUP@fbK*c7e&qAE6a} zc0F45!nDD0^lhzVoU|W|+8JYBVkWLW{Su%3r(&e*mr2q*T&;M%pN3J&i-qyEBn z_lpgR-gcWm(wP$;MncT4r1P881}6X$H~$J99b8Iote~q6h9Gp z=Y0A)B7Jd!w)Fn&0A#y5VoiW2?jMW6zkgYd+vlS&s%LxpN#Do3>Cw~&S^r4OwNx-F zdVFoGgKwUf&lzc9`kFZGH*AKW{)13B+XuT6f>9jdP3#lH>^G4HVx2}~xM>H*4?jd(`hgu8%Uw*n zdFS$Q`h_y-=TF48>=10>_!U!sETv7gpZ=OlXE=Yqkl~qeFw%7-2jCvzS|%m3{|-)AC^4w4HLT)kh!0dcY9O z3y(!{Q6=^tI)$=|eawT%z)XJ}-8_y}JeUW5r`<2IB>Zp4hv5 zIzQ8ns9u35)ZIisy8V!R`%D(sfi0k}7)st8&UHhKuW&rYAMlVqokwB^a7-V*RBa>G zM&kDn|BrZH`~&x%t|dJ#!SyTjRo~8~Tp}&f9uZ%)*a|x+qsvJLf_aG#h<;Ncw7_{R zrEh4Z{{*BskD+ZBfSoC`ustD2;hkHl4{RZRim4x*q+e}KgcJM*^v3ZGA^75E0z4h9 z(3E2{z`PH3m0V!nCUfJs{!ih}!l(7{`Zj$3xA?FBtcLwx(GF|G9^7#i6Ikn8autlo zyKFj{(hu4UeVZ8|Wt=^ECgU*4(^16#R2W8En0n7re`m&ayTZ7k8kxn*;q{eA-F$W60O*M;`fkw5dB^Flh}QV4}d{3q7=z=RqUm#)jza2DrSuIPELzBz%?j1;M|_K);*lbob^J+32RCo8!s-2#shcBk zfj+pZlgqI!Hx?_%?-z~rK-M@VXn?+kL*deAF6R4gV;=HjWURY}G2{Hv`r~FQ-{=1qTx&GY ziqEwsj%BS&YdI#**RI#xLmC+{XgtCfpFl?L14Me4U?SHZn76WIPH98Mx7?Yr((&E8 zA$GDI*3F|nmh6vxD`zu4o=ANr7xx}gm!aR~$v5=Tzoh?#F|AXyRYflr(U{|B+M*587B0pm z`e-CiL9ufMk37~e`Fp*FLr$?tYQue*G8lO$Q0O|r$qtsSS|~ifB{9*PK97V+qsiAKKEHsz%uwn&^a;@~wr5QQ2Fy(XFK=*Vr^t=%DRK4KdKzNXb7+XTHdK=0k1E5Z_BU@t!~&P&d3)K%Wu$ z#OGUZ_vTuh-%UT{irI?Krh>7*9a+=Kvm-fg9ACz=o{$d2w|o9@8hx9gN-RZkqB0rR zh!{5*$@E?9FG;3NL4Oea3nyq}Y)@z0KFb^XR)yf?_5^%Vosav}udXp3a*RIV?X-(` zEDge;P4h@EG1yDHR>430d*UY%8rZtf5AH*HqZ4JE@8E%0H-mhV*x#t5f%QStaF;eq z+$`1R9o=UbPVc)-yt&A! z(Z4R8`5gXk)6tL^7-VEZ|CJl}ED+zOKk|L1@;^;O`V+9*qAWx$Y{0XuDNc?e6S8-11<9N9VH}B>v`tEl6%}OOk z7Eiq;GZeXVLXhl0{oaAR+})pYG?436XJ8wBv!%>`%V%y|tjid9TKC3allIKTYs4Is z_m$t(oH>kbK4{MMx*gH0l{H40avkpguAiD(qO5yav*Q((ANc}vmu$m8Ye&W=C5KOV zeO>$uudl_nT+?qN2h>)3kDk1s-7t9MWW;Sejt$4ZM((ORi1OZo$^GZjwjPRhAGM*3 z{XpS|Mjtg`PNgB-23aB6brf=GFK?!uzAbYG_T z@tLnvCVm>)sC!n0;o@Yl&|;cFS>9r8GDw|{-@3&`GLv8ANurQ-V*(@g^WpG zTSr|d8QU}Iw~n34*o`aJMY>=^)^wbrf9DDPPLH3g!Nns<%qf|T%B%oI7uv&k{uFj^vp#Tq_uEPn&r?#a8Q^t6bpVL1>*_zF<3LE8w`6Jwr z?@1qX7-MP?jI)QhBaYwYHMlQrS5qZtx6KD?&Q%Mpo0T<;md(1u+Rz5$Og%8Q*8&8O z%|i^=d*>{^fi*in$J$fhB4_ta1jOfIzz_!*e$0G6V!91=nKpXZ*Kn=rI{I{>uIsH! zC$;$3Kd-Jg?$Da~QUUX@boV6`SN(wevPX#J9u_`hGcdw@D!RAsgZ3Y{r7xs`qH`L4 z@BwoQTf)ww69R_!L7a;%a)T$*M@)Y$ZPCh9AL5mHe2igLq)-l04wOkg8|g)2=DU`L z&~}Z+)l19pknyp*_txOtu4M9f#%X95t)stpK6AI+m@6JRWekp#B~q@a_V)IKY4j6# zQsz#;Jp18D3Z9H(htiod!5j+4F0P$l#I^DBILE>K4Izx#&Y(U-y)2q?I4KY%=^p55 z(h{9%2S!gALw$iU81nwYFfV+4oAZ7p8U4-L(r3_|dd3FEA)eRZUvT|j<6pr z7pkehXlvjF=Nhi{G5@Y(xmVf4@Ay+V*-lpQZ{M{WHqP+Imasr9n&OPG!NUO=zW(+7R! z)Kc>KAkr4|BFM`ti2HSOyy-7>!n9uWDcE^)y^=q&>C2xn!WtvZI-)D}tv1vdnlk^i z`5!)FF0LVZH1B~?M)q(u4?)17RLq{R0kJa=ASe3<@+x0o{pnX&f8iw-?YxQ^DY+Om z-VteE4>b-oJk7VN7{bb1ZP`p4Qityl4{FBj?`*S<%dk^5WFuhzw+D_o|{LVC$@ zY^nYlMd!Y!y?q}GLwCVCL3Fpa^vzl_$JWlg6M~qZlsauJ z*35QQ@}Dc1Pg9dy{LW$28N4e2A=Z@m!034+KdgFR7ZeCuFBh33KrF`AO zIAtz<7ykXNxW7d==BNC)NDa9ZB?8(0+&)3&QPZ#k2E0$e}7K%oz# z7KT{2v;x)VUMN0)MgJGf>b19FRl{_hUY93xBj-<#% zX#QaX+KY{`(AI(L*MgBeaU6!UGor3zsLZGEr~vADrQt!$_3*_Se{YH1hC`L~6Ca4Cowb}f4Rf*9douTd@}^xu8A{%fM&E(6#b7vf9>qOO zCL(aiFjyORpq)zpBzb&m?&)CqQ3v#EJ`ncpC&R1z9L%;^h8V6{NMCpcOS!f%Z}(To zKm8gjsl#RLt;U=cWtiw6j=t12jawR`1=n^6<~1DG)op6eYuBaM_`hoJimor%R{Od# zqISOr{paiUTYFC2zicXeVRB&&b!Ff4>Qz({EdKIEDTu!M~a>T}fNu%;sR&4KSs>^#Q#4 z4CI;yFZ}7VW%&D#dB|DdK-&HTtb1DH@UH9h*QznE`uMMpQSGya)jFSvfBAe>kN?-d zPrLtZea*eZzxk$7Bz7!vIGIp<-!5Duu^TE=we!2&8CrzLZAISYQW?|JV z4@?`_A6=WaMi;I-?BCWDov2f_e4q69aeEAC-WLw-Cc?`+6tf3sBbIBub7HHwR{SAW z9e#z}Ge02f*i$UrdK3YvYhdpchCbGI=-93k_5TLSIt>M{9CPvA=<6~1*wl{e;=Jx& zDXJY^yI+cYR%Hm+Lhx9V3mVO6?^Jv3yWit|?!9o)4ApG~)lXr0;EXXH!h; z-y0E*Balrycf;JN#3kheeGo+vo><{I8Ho;d$n>5_KQ!~ib3(C|G5f7izQ~&~g|eUz z+^y)x^pN@SQ{yE<2b3491Kr_e*^jY3Q!J*8c+5ET7vFBgXRkIgk0gz`?97p)JzUC| z*BR!LER7n=9Lf*SyLmgTCr$q2bv_PN1jCBDQFHoM;v;hy$9t~$TofHf^qJq`{eoQ$ ztJ2rU@>Lxj=-*fWp0|D0-YGV)_@AozyH+jQgidWcDD%{{kpaeb=#37HX&P{zJ25{p zW6EUa`-Ncr{9s%;k&RDZ5cglupTlu^DzThT3upsGp>okQ>Wh&$S`b5@y*(B?jHSP3 z7S|y8W7e4A%#~?F8(LjE)`tE;;|8RG=7TWV*o%8A#3RaXEz&}dVR_yoxPBMm$aYHxeoVRP!9xXp?sPk{CSX6MxcWao|$7Ag|RaX%l3!al=ls4GN^l4>?2Yfnr-_g*r07A_Ugv zhKl@~G{zaH58h$Evg&ix@F)0x8$R{V)!ZxeqHEgqD}27D264S>+C6XY_1-16G<{N6 z&whc$NqOk3qX7fz+-*5;25jzq`*1I-5Nu+8(~0fLc)+;fb>?xMpnvTAu2|gtWF>XO zFy=sd;86Y?=6;4^M)!V*7&r`@Ljy5?{5TA1N4)Y~O*mg|x!$mElkS*gGzGJI#3SCm z2x;M`kiGs1mK}UWUFHtL^7dlV%mniGu`o6?M$1Oj2RP4yS>e02JXVfXOlz3a?*)JI zS;4yU-205(wM4&`UEyRh5_5WUUB{>tY@WClySTs3ai3#2?|%-LreDO>;A&h8xsK}K zYq%OzjmtAG~r6Zi5+c~cZz<}tGNlrcNj{2t-12sgbo!OfW6>dXiZv6olFwj zTWoOoO>(`N&`SjbcbWSC{|*1@cWCca-Y511X&^6aBL-RYMr)2?8_rj^rcD)_v~&*bp4gc< zv@9HZ=)b9CKF}`u;x6r4z_l>UqoO^wFMT%hyu2{6y#>Y^T5#Vq8w{qrmwj@?&)%8- z8k;sF;N2wzQA3v_ZRQc~iE|IxyT3$C=@s}UuE7YWK$w~JqTSnA89&KU6@0f*_`2}e zcVk_niCSK-;?R(OmLAPJ!MT$iq6dUwv*T(U^Eia+fGfB;{Wfj}+{7iHYMk-Bh@zpwmHAOxn+OfcyR%hMGW7&J&0OezYL4E`I&rP6F+#1pFv74G zac2M{?xix?WGEI4i-unh?q$(oBrFpcRpsMZA5JG87$iO49oVuLQc_Bq-WhgY{)_S01DtWFaZu`J{W2=65U&vlO9@d z%vHaI5%rJW1_s=du@`3b9f=^TVF>Csm@?f7n`cuVgiXg%4>#&lUD2<#0rwaiNx4D4 z5Z7l)JbitD52jfSKnJe-4jgL3^WoT?9zkD5AopSQ<6eC}IK{m6;w3IHXw1F$gw847 z9ELeyd+{m8S--5K>(s&Be<1?|pKpDJ_}6IRt=IpHch`ST{8M|&&cJc#7==HLHS2=H znaum1L%%Ou3HgPzGWu@zEtU1E%(dZ~u=2Tnh#fW#y}2i0XYyAou9I)WIc!W`*YTrv zurshjaQA3LJ8nT{!e#QaXGqw72cAg^?8qa0<5nTI=pt4ee1X-JnJc!uL`LQfB+T58IZg%e8b9%s)0kk<0~TD*Hf!(@ z=E>4FrjNgZwn3h|C&qTPgfU~~^G4cn?XC~^<@4q~!1S+rQC7?kK-Kn8bZ^Ui5wU|O z`ryF!YFr}rWp8gq*MEx+qv7{my@pS%|GoR(b^UGUwRcJ{*X1|LURYNs3q0+oC^!lj zGKg#SY46V^{;BJghX-))Z~EM*D^^6iqk?N>3cR>~Y?of>$h`!c6YtHbJ2mBacWGoo zThux@35$evBmuUP|(ZfgyzkBun# zbPZC5u0|^R^dW1AbABcb2=*1eE?6gDPnO2}lGu`YuN^_Bq#^l;CmlF;o=TsU z0eNZzIGQx3?!#Q57F}V+J#)M|c_O`UHj?|KAh~xcQrWTwq-1Bw3+ z5l#QiHpaWki2d?;^xL~SU@h0dlyfcgQsyDsw&}uokaf=QF+SA-wrxjZX7?z>O)SBp z?7K)>e+!d?(qYzZ0Ao;%l=)J4x9By*t~R&z=|I&11OxBF0iUIu>DIJ8Li+?`pX+X1 zpMDJ|JkDd2{dQ#AY*4VCO8lmgU#ATt?up|x!9I1IWSezJvE7JdyCS66mmp<)Ib$A` zNOs!B{NC-%8`z;X9;Z0-*oo(OEqPJ}lE#-I$-Wc`;|eijXd>(_reJ{aaLR)=T;JCi zMvQfKZ^pe3j7GuR%meeR!VuRhhK;s9?frxv2}tdgf#ud~v1r%|Y?-_rvE2K%3vGvf zhUTznVO*mR)g71G@zQWB*13yEn+ER)?Y?;>1W8yzKJ+b z?teNoi@I0{Y>bA$h<1#;uPyZ!Yvw5=jCDm4gE(q?J!5&ZfMeLM;O`0Qq?09VOV=k_@J2o>dl5f% z4-#C}7Ed}$n6jHbmEA~T%b3D_Q+O@gr4qwCj)a}bFf19n2=fMnP!Ah{zHPd}iZnXB zO+QTSJO#5YIYvDq5#1veaXnKI(=!oS9J5fX*|2KS3Gv)pFWoMKa-}85N*yQhLCgP^ zrjPqy^9F6a)caJ~KzoSxZ~IpCEe)Lr@0blp+HjkD7u`Vu_w1f;vlIcnXJJ@7?(I(g zB(&3+I=(CS0GMILeL?s;3`he31BMdo(`g6zW5LLY=+vwk_cpPjT<|1qaDNc`T7P_& zjZI73ly{6D?noSQzjTHF>tXZ%fPcZWhFPswWWZVRf2#PG^BV58d+LAI&TIYK@GsAZ z4ICK~kH+K&ecBlyf4cDdV0c>(z@G-g{YM67Eu(pTPO zoU@X0*bc2e{8*VUjX$Y#r_G_-*T;VSd-UgB=0^5da_{DZZBxo|HLx0cspI60DkO$h zBZD|kC!bFv{!?to=WU63+S{ov6~y~)Bu^vWz4vn8Phxu7KExCMu^xL6@4<7tmg2n! z>3+m>z+Nl~+{b+|r0uP3fqSsTZ#Ncs??$@kPNcYPXDoIH#5LzW16|MS%brZO+X8ag;^yPY2n>Jlx)!0y>ajAh`MYaEuND)2y|D+eGh#n;_yV|wtPO^=?ujYJ_6X?efrUN7kk~H@gIaXMkdE(R*9r?1FYbq~ zw3Us?J9;(lhzV^+VWh!8<@2O=V`1IY5~hre7fjlP^%M7VeKPY8#doTs0c~vbdv$Ez zE;qIN^yxr+6dmc$ndB3Xq`Ydxa4k^e;AMy%BKE-uv{lwF`~e*sat}oMb7da7(l4~Y z))Bdr{TVZ!46`=Pm=j}-qM4rf^h`AV`g%DQ&KSx4RR4egw;-MVuiJ0A9ySGQ8t(M_ z-#V|4+4}gei7D%SkN*9?b*z2Ac8|yf@!2j6O+f30A2S!H0cChwbRa)(%VXh1;`{UG zUf_`fG7!Ju7-nZ4Lib*y7)ur3f~x0ekTUK6&L{_F!d zyZ8|9664P{9mVtFWB7`>6t7B-;1zp0{;K5g?>6QB5_yho>oK+ycv!FlYl0%V*1!%U z%z845sKzSN|UEUagn072UKe_izb~ z29IK=VZRcFDt!O3j;)0PvZJ^Ka3y5{d&zhqiVw({O`9p z_~K3?hFdbuNepDhEu;U3xt^l`(4VO0dA^-LYxt91FsT1o|5(GP^!4%oEB?=W^zZ+@ zA@&sa4Oxr!hGGkF4n%e; zV^v?zsl~a5cePh_du>jn7nvdPF5!2U+(R#WOa{&cUcy$Vy~rFv{!ZN{V|W45Myy3D zZP1h{+`o}HS1|9h4~ag)>-QqfcQ0169^>9b^7WNR@oC{PyevJ2uS-?Dzua;Z(q2fv z^$3rp9p>l5{H$wotp8c=tGT8=|FW1gQ+xzp@%iug{;vuTG5#!OjaY@m!Rc5y zEC8LGwoS~jm&H6gG96KKz768DAS6zmKBUkJu26BN48@GhT~rqPBD|9sC^#grLEJYRH3IsTe*W zOwhB5IUGzJ5Hc{F`;~Q7d`oV9+|av?xgs0u^P1nL19i-QJx@COnlXhDHXf{Da0D|) zimxma@uLE{#;b)QqZJwu-b8w_>)I6wo+A-3z8ijd$^9~p&c(295?lBHbGY}r#F5li zi+@cHXgJf>v1oX!J^yQaSMI5g-OKgtU+o_4J=%NUbzY%Gd9T(q-HD%-m<9hs^?B++ zAq!~Be!#tM3=r5o1QC5Q5Ep&~E`C{PC4B8Id`0CgZ^M6mIiTWS=1sE|MBkcXHl8-_ zPLw$vpnktj@x!N*=O^23rp;NY>NdXAaoCc5$@6Kuruy#T9^dfll-t4>vNwhJ~Tno|^_6uIFse9Jh3b zP-IMqM(YMm=~sLoHpYWl1FVekS?;^e__~a}J`Maf{_D<1eL4`nBYS;Y_jg2e#9n?! zE|v~YMU<^8Od2=h8bIo3jCII;9h)_R=kV^B;nb6BFXzB%n3*D5Y#2A%UwM(ao-e5L zkOrjb_`lYx_!K;At*&0AkK5lm7W`}ePwl?n!hU@^sKLELTPl4ic7zW9SLp{@owbR3 zf?wH>*6EUoZ;o_O5?E5O?UyJ{`<6A3t>z~*7kg8MG&I5DfXm)nIJ9e%Ms7gjq*Cs$N*?cbfWEu^)N|;&WJ@CNUmCmz$1)D#vqI|eg59l$ zl&0WT__=~_Rku-&$){hiJtxn8&TC&1qhAW{slO<#jK|W-`B~Rquz$&OFQie25;{?6 zN{98A3jY@wKzh<-fye`06WQ<$Wzm;KtPivx6HXFi;odRgCm2n?*fL=|T!_~MO^(F__)$0c{#tE!ibyD!JPXpR`zI*)Z&WCot z+SBHutRFsTG8P1H$4tv4YN{14{L zXI;H`EB7!W_G|dRihtD)B)nFK^%MVh>?^tt-+$?xyzkfk&-!wrK22z!Yw)k*`+|LC zA1>lw@;3IDS1EBY(Zk1^+S6B^j5w!4czG}3nhwcz)z>FgEdRG-uFhAj?jt&_=ma6X zxu@jRqgXSR@hJN4lgaZ_#rNfs$?v^Y?2DeCNMGby+O^m7h&kG#Uy-o_3pFycK>;Ncc=>AAGwV0k6pzNC#vz|$!h#?TG}mm#qV`-c#*TsjiwoNA`o+R-_N2B(L z=-v&cmX&^geR*_e@;}{@UA&|*E4cna?2gY1S8V31mWfjS@$X)W4oJU zjx*QP<x&{7b`s{rBiUTmPE&SzCLl`HtkX)HzmuH;;qdf|_w)Q4wx2Ia)1LhVZ>m1Q z&lgB5XGt@pjUSFeoS;pL8#imZ^|^t|u@o^L)tnh?4;K>bM0?PEU4JoGYXtMC(( zrtdR{ttToA0x@o|8TTL(d-nt8lr}>*t~=<#7;`7qnUXf3r5T18TG5wk$QW*8oi0>g zAF7?3TD)ttQroNfMYa4$=EtB>Gk8tSz?@OcdE)wmWu7z8r+pigF9|^A{0V5=q#W(`X}k@lpKG}-WA`E4);p0^Q{Qq)$pldQF`s1*1zkThX1OwpA!Fkm(GTM z+dJO&E{*TM9si7f(QmbRMJ3k|8lXLMIfHu5LVUj^Sm<7a{+1(kYpnizK2sO>b;nq+ zFEzuaGf%i=%6=>p?9;E4GMfHO@!=EuNrHd+a}sFZCbA_db}nnL5&KU!3HHfv6+NFk zmY5eG&o?{I;Jd?u_iFrnp4cR=HM}YquM+$d;}<`9OXD?S{JV44knA6fq2}FDn4CrI z3%zLAXU}JA8tLO_p#i1c#2bF!FZ_--7x;e4ksps;#>`Qa>8S*fQ5saBrWLnVZzT9R%;hq=GSh?AM%EWq`8wO77!%t!Y@*dhL9D zT-U`v^`HL&|JpmXUj2RQ_t)$}D)h>=wC4{$z?4ywnE&t|#&)u0oIZ)`Ava-yO^C8q zO5euP__#jC-*v3rtKW;iV5*rjeVe*eI*CJ``W~90@=Z3f!Kc=)q#%kjkze=E= zGtqMoYgp~WqYdQkW#X$LKP@>(o#r_8kqgvQu8|)Tf5hq=^5{2$Q{wX{r4f%B_67gM zt4a?-3&Q_D!E3fR)pzk|_c09bYN6~6<2}|9-=3>hWq^+N%X^i^_r4MQ6YC1CQ4YMJ z&h*Q9{szh!rSZF@e?xuh$KzM=^`6tpZx;S9?PW377epp4}`F(Qq&yOgT`O$NU!V-*!!v z1uB1QP2S`)jN2w^9Y8SbyMcobM#nzefFw~e~~3ZQ_>WE&+pP<{>?dlx7I}N z=vwVL(gp7oT6lfx8uhZXqyy25cH>p?J`@DbVUB$x4C>gC`!I(ibA~Hxu^Mv!5bmMF ze0`H9t*8@m{V4U)5ysrJy?=AkOamoXWs3O-%o;cqZ5ncI!LQ~>Rwy3jh`q}L{6x*#h$bzdd{13qyr86y8c)A zmwOc1@QETH-jF_CpP+8E;{y?DB=0y9RAg*n$rJ6SU>%zbq_G6$_Qaqn(rk9kAg zVBU;tyNG{d=35VGYk(2$x?%uhW-eW95I%SsIx+{tm^rB0c&qwME#@`+3-+~Ei+fF9 z5+0`>8_?c%wvED^0V}Y29Q~maCtwu!W7;ss9iN^}z{V_B7_!z;XRgUEUbCNjDsa7* zZjU!j7t(ZXO&)0Yd>d{ROzNJOW9{Dhy{soz@n5S$z3qL!dak~H#?NB2$ol*p)F~{D zI>C@R2eW!IZ9%WGXSIm?%xXUjI{7 z?eV+#f1UH9_b9eNtq$}HasGJsQSMh|q4IxQJM#Z4_?dE{2LBrWSFo?g_v_I>eVX{y zXVQS^ML$q?dsTTD2a~d4MSEEGk;|H3EyU4n>xVpjO7j<;%<*Lrb*^jJ7tHfJ6o04AS6hAlB@#kY=xctDYl8YArdJ}ON942qv={et`cTIYRJr&r zjQ`eo4gakf_nF$w3#-R7FK6@y^8JlSo3fp23wALFnYvE!2_!~Vk>6iN0-NytgasFo zH2(r?)}6x-v}=DlFFqXdZsPv8+Rs84x+eG4!M*T)%8nnYhkQ%F=XWRRyE!Mi%`NgGq-k$-38vZX4|CcBO^q;G_#%J`;YsVT5N?!;6%=bBaE zB=!^LS7AlMIef}}u6_}It&jWj*GLaqBR!Bdetuh%XDAyKyMTE8diMq9N9@Pl{GGU$ zzY7o7(x%?T7+U#B+R!)fc+WA`skc!4?}GnVr?24q<5%#a`~-974&c**-MGJMJMORE zfzKEN`{Ce41^WuN$d4_%^H`^G@>$L>yoU`ECw;yJ*_H*%EPn<8DgC`eLxbFk& zTaZu2%}G&mh&3$M^m>@AIj4_jz3UoYrC0KXbb7w#H&U(({T|^xDy*~a`I=G1Vc^9xH`vQKDc$DyMJ^a6>pYkXD zMq2oppQXLgnw--$@x2_5&1HROANco?{b6lczkCvwxUn{0H0$u@l;eTuvAN|KVrs7B zvwPZ%#Z%@>JXyU5H*>b2d{zqL9Hzm4pe;Om4?)Nfdo1Vk7Z(>Y&Ttt&pC%15R`xUT z{4;S~rzteSbBsg$%>N@zAOG^qH;2!&mb^7uFg|SBq^08H@7BC6%(=$VoO9Hr6>Ijj zHsrpcMy$7C#Jr;R=tjM#EAKIGLf=K>R?IPN%DgRg-Fsd9*UAHZ+qdrAX>%+1=Uy#* zk9|L1>Z~i7i^Njy0b?|g_Q~$XdUa$Cvgg)xZ8^tCe{hX)Y^Xf(JnHjwtO}P(ZKk}0K zJ!7$OSDhZ>$TT4nW5%$$~xWgU7V0NaR+k76mmbB5{2)lioQeK z$Lp{!_*a_H1DnuA{Jbh0Tz!eWpRri#J+B4-M1|6|BgKNTk0xb zU%8L3svqI2Ymf1~>KN0xI2lubLs9vR z{dH7wF5UVM$8GM(b0j(!{??l>#NEzRGahi2J!zJ7Ax&b-LLWi{KlA$QQ&%Vpt|4}+5An=eBon#k zUMSaA&CS6^##lFoFT#fK46JAUy>;Qz(ojI2TQDa9YeM6YGcAH^RlMNcV*+|KYp=)q z#RgXSxjz5bpU2v{tBZfhJ00BB4v}0}w`gD{7C5?NN?!}se32TV)9~y{8cyz-gLX~0 z??y*+>?}G>Y_i6SF6O21T0Q=(V3oMl?Bg0t>#$t+vta+%_`mqO_@}NU->?6@y3Z=_ zr;Q@`7a78QhXCh5>YVRmoQWM`Y3I!0Udr8#`z!OWj*;NGmd9)3rjFUW@vr)OSPzA3 z7L!M>#&XAPtZAX@J;@;_6+K7c`_%JmurD;AhyO(4zpCge{&-1vzvw!|jo_Y5c>inS zMs)ITF5kh6Tc6_7C*N@2);Fy4`)54+@vnIH)8Dy&-~Zsnv+wcz&KGz|T6jSn=kAW9 zIJk`ap7_tiSki(K`JC+e<;dCqOI+r1J#I&Z|GV|GVQt$)*mUYnotpWZ#J$s?VOTXU z4po~f@r?ZXYsQnmx&9ch9>2oZul|T{UjHw?`uT78@`wMy=dXUj)6ajv=l5RVC23Ki z2PMaXxfG-YiCG9uX!!plX(fMl6xX{ogmdo!2pu;8a~vmO-b80aPMXZ-j3_4_J2|oT zJg-e~z}!jW**kLI_rauNQ<&2xFr@EBe4#4;7dyE2_+7e>%%?WDn%tIm^y<(Lkt1`F z);kjkjzMtgWsbr*+$#3l-SY5re0@kK=Xqef;^euke>2-{7x& z-{1J&zw_ESSJ)1+@{&3`a7{|7QFpl=rz~-Hm zd{W7kX!m|&<@Xyif5C$OA=5^*Blx>(v9IMU*5X{_`}KQm4n=NQw6Q?=h~-G>k%ReM zpWtL=!99XlA0^xqXE%i6&8u9-=>8vTUjbgl)kRw`EfjYP?w&yK1PBBIK|);dKp+H* z6TzJXVnhjn81C*)f#T4@UrI}{I>mLpwa?s1ZbE4P|Gn3KhckC(?##{1+WV}t&lWS4 zN7i@9Wad*N{tbA|!=^EQiN8E77qMLw{*BK+LHr-%7^9C3dG`?f8}P2z#6C=aJK5H1 z&uH5+HVOWZ(BEM_bJVpkVU6NXzk&y2v;)l-!pS0-pXFI?ivI@dAu0TYifSNVhIzuxC9Wk7z{?h{^nJ4ly;=35_aWxoc8^9Kbj1e=C z?L8B@-qVr8mN6`xHe~wdlww>NHf{X)h%VEK3_Y+W!6f81V#xdArHZe`cgjy+}?c*^M{O8G2em}`FkaHt0|w)#>gn# zKlBYA-Teh`jP9r3SNgpBi0m2P%W&)sW#P5R!RxoU|NITEJ$i#HzdXmyD?j7j{xkS> z7w0*gBWDKBq_5{EsKh)m?dWs3#NHn z$w?&n?>d!hiSZ3bVnNqA%;D+GeOmtLeEjRWEB~G9?^gPE@L#$XygSWBXtQ}3+G;HN zH)+H?iL5`!I)jzy9nB@*n+tdDbkh2t!+gWl8<#Qe%JVOQP|Jlm(P;~*NV3gx5p*^OZblg{{^rw@da$UzSnw9Zu0z7 zjqtx9JOSmH^R6aiP<@&OAc%fw-CH_pzMdTWbv(bT{|i1RrSJLdwez(c#~rJ6#ysnl znA45ApE-3xd=Dd#^I75b0n)}FM4jj4&ZShME>?wq`W zs}G*w%9FSF{pD+gS>YB1a448I!aQMLX*7bhdC4X~Jh7a!!yNG#jePO{nI^luE>hKP77m(;1 z2foEhq*%=B~g-`jF;w&0!OLM|aFiMclygXit3isL~n^HLMs% zB>96sqD(Y{U!&2CqhKy=1O9bRr}eu2%I`J3uf12%U&4Py57cKq6raxXF}2lVII(t( zgK0A?XWpL`6Ii1u$O8|~&%yDHelTIZuLk66o3f5V>b)52aGlQ>@6+T!)^gu%y6mVm z0P1{wzAXCx9sE-!l#NrcPkpc9U(@?~?RWWJ9{%a;Dg0mb|D51x=6d)NCbZFv<+^Vm z@o&+5kh1-V{woUqMd=Ft+3M#@j{o7U{OI47jp@BsAavwD1QY*a&led8pkGgLFze@1 z=SPUXH{d>;dOs}bHo_9wl7GUCtozuw^)|8bC$0(hsrO$SICZ}6CDsIJhW~WT>7NVt z>bL>NfHkdDN4@vWES%Xs8FkB1k8*utP5M5@ z&kFu!j;iT!WBe-_P`X>=J%#bF>wk%H(T)+*2Hqn5KjPmo-_`u?L~b-&r;dH`bvvT) zPaY-s4~ioGzhM3AD%Ags^Xi%ai)I7<75_y)KLckLol(3xrdcFle)p9KcVy0~an$?c zh<)Ef3i~0UUt?PAj|%(Ysdu0nu|JjA4<+^^GwxvVmOqhj;3-xfe}pr?y~I881;LE2 zKXq-dRTj$}QCx{I25_x~mW7>!=|NR=5@BW1meeLLTFaX1B2Ew9p zL*`+PLQc*B*!8kR%*fAhETtS~yL<|l!H$Ssx|STN4n|npVNxGY=AU!me1P^0#uW{y zM|)}KiReZ@A<<=`qjdaBU-%ss*8jTgsAUyX_?j<32>Fk-Nl*CoZjV)yTxtJj4sZkh z&+VMdILH#T8)6keA>v>5 z3I1n^{x9|gxq2mdi~jGLi0;ko^7wE5^U}t}!p|)Kv-WJ|vy7QmHG5%Ej~vYG#T+Fg z_Y(KSzry|j1XAxu#2c_ry&slBozE7M_!C0OdFHP94RQOQAo0jEEIa%R$;Y4K)UPk` z#K3nH{uR&pUy-lrT^+Y?sPmuvcpu*}jv&g>2OX<27dzJhE6|UiKJ)uGV?O;lC2FuH z0pBb0YW8i?4$HiQaAo5@{C)QU-V_=O-iLeR{RLz|$$>r(e}kWC$J&46F2`R}jP)3b zp$^XIUb8WFEZvBi(HUG9{t`bPG6!Cj)|lTh8TAeL&raE?VyScvBe>P^Ubrs`_y4v}<$o~Z|Kb~=<_9uIApcQ~ z_||d%PA~dj<`K02%ny%4Me_eDpOwMT=Kcug`fTs!^m`+QjqL^cvnl+{smZ9h|vA#CYQgy-R&JST-ZKj|lgrLoS}=0A~m=qZ*F z`w4~?fA}d5-Fkr+g>-cC5V<|yKFw!)%*DeOt8g}<(|cH@jnT!(9g zgxrH@#kx=uyWWE`uyS4kVuwychtl=XqGSVj)gI2g#G{zATIxDT4wHONTlih-?@@Z~ z-HZL}6UKmZUC1I8-i?CPZ;SV4{oskrg-`vT6Y7cIF3r>UPx<1g&iaG7%Xd@%-!j;B z{#pO)TuAlgJ4IpNSZ36mm;V38vQ-fOlm#QsBRc;b{BxgX|NKeC?N_J$rvm3q&dtUk zz?cv@3)fHi2~(3f7A$8?$L$Z1M17ygCfJWR;6LurGps%T41Yb-?CtOJpZ@}M zJVn?0(!cogZybq9<9crs`fh!W{?+>+u|pcNy6!+q$4!Vc&&5*nEX228gXNvKBFkb2 zqM3iFYXx&+?GxCxYLBDotJOMy@pXBZ|4JnD@Xy~O-5oGTmgC5pL)draM+_U`gI^Qw_Sl~v;3CQWj&I*tw--_{rJ64;cVWG>$vAN{OV)Ce~Et)5?yX|dET6}8dkL$ zU{rS-c=zhh8p)DtZ4m4&Z7^!Y6s+HO9E(%dVj^vy^Omhc6nR^_mhI8DZd2AnjYps< zV`RwtTUD-!_SNd47V{X^ryaE=>qs_cF41cArxSawj_<;_*FVc~;Yq>)>K3ns5j~b7 zkbdemRc(k53)a7LqyBeM_Mi3BhvM%WQ8=-|4>d~_Q}x~@50KQ?Euf?SVIH8_G4tob zl0!wfzm9)7UO)zv{@2D89rt-X?^Be%S8`!AE=X+}sne0MYzy<K^hgBR8 zvaz&FHae6uXN}m;ksLS!ujyBzWBI>Q{)Uruy)Pf{{roeA^|3)?*0O8JdZ%q!Z>4_| zQ}n1@2c5}Y^ZwONC&EaP6vVT}DKWKB*&xAF~XpX`B& zj7OPdI}DTAoLlrk&uZqZX>N}?C0U1)xGqWt3cpjqf2V5Jn8SzqhGzTe%7~*aa;iRx~+%3o0Bi{J&5CAL6+x7m&?oU!ry)sM%pf8UCp|A_}89S z!TE3DXC=>5&MU`SNM5Y_uz+*l2)Atr9Yg$kAHdY+#Ie_Pzut>HT)6W>jRCsORJc=PfW|!DHx4MQ8Fci2&RvA5Np0rW zt%!)WOR=>5R>bt*!#e9Xkh$P5WW_y4*0MLqOnl3jj@QVJeTG%@{-9sZb;JzVi6xzL zSoerNIv;+8{_Q&A!S_G?&-mBnMdl&TpFKlNUwEMHIoGkVq zN9>Fqfv0!kurX;k$}(4=c_UNomYS!;nU49QdXa+y_~&OG@6zYVK#};@xR2sAhPkhn zQ%>f;T5Ok!?~-FiI=>+P`TO?&z}noW(1Eq2*r5NwA9xW<%Q0qV1JosJi z|33UzWB%?5rjfKoGoE+o9)*3e`$xpyLMZK=p~SsvwDZha{R@^6>%#Nni2qpX{21as zhWiRPk%^@|mhtry-2Uqo@s@9g&s&o+aG`fOxPfC6Yl64UnK>x)MKN?J+Y$3SaE?3r zGP2^IAUpL9RuS`ADX*|5<2BZ=dWF?1ULh;-6;>_d{$w7Hd5VNltRrEbjFw+CK=WF) z@y(IriuK5~|Ls2=_nJJ?o=Y3l{`G4xxM>yEX)F%gI>ljG^>fZMK8Jm?rmTrP5o>7Y z-?3^ta%aXNZOSyP2w8~PuH)g>%o45X`(K}N!7Zv*g(ctPEW1e<-D)6w$c4tWb-oYgSfJ_}ABK@;Q(GjCNHx==-}?Gkt(|1 zB@h1x635}${bg7_*GcJ1EA#F+u=ASoQ_yj*>t_A4^!hlE$8kje8=5ipjd_s%9VI)3 zbw59Awx5FdS3aLg_ZQaxoDfRv`!9IJ@tug&MI4AgD@n4U2 z|KJXbG24c*Ewbh{iu^zH4DI`OmCg?pTMt`!#?Oe|^Ehvw8%G(45&SC|5UfjkZs@ho zOSmuU;8U#QT=)rP3D}zKf+c?KF|u<-+9hfsa+EK2GvC~9 z<~&+6JBDL|A8i$`@Mio@8^$PBq@B{6^^11S%EXRYtFUWMCgO)P&U#oFoSODf@c^TU z|3>e{e?BLYal9;T0=CVEBW&DWIMa`)cLP(#A=t6@p^L)5@PCPcJe4^K&wowCyeYkv z|C?i9XL29GazXw7k20_~pX=w10U`_BujP3&9Oq|U26S1{uPgV{IKJRqYwEMnc%a4v z1OJg@lJ`XJ;ojGc>m|kLD_8?IjT{gue{;8)tWT)rz%INFY^?ibTaL>!6Ip3lvJs|r zO2CW(Hp%-_sr$)!LQ;RkybXU~+0hpe+)Gos-$?%p{sr&R2L~@jSH26vMGVdOSRS5!6K-YTS31Vk zwT)yzmj&JDU$9>Q|NOr2q2r8wpEOGRor|F(*Actc=!hv^*%;@N#d^w34eP)fw&l4= zD~x|_E~VK%&C8o%X6F=4AIw~}qlo{phn0_mj{lG}>i$)C5VMaqegpnvjb(rwXDRU> zEpy%@Pmpx_8CG0)j+K{QU?uzXb1#teHIMVy*2_=vyNm;GM6b(uAT6I4>G%~+q9DzG zWUP4n_alt)@Z{h25qg=}A;JG!uGzmK*LjPbn_l9|`IoqL^Cf=ziDLo#Ghe^Nx>dw} zDs_MCTg(}D4i;58`TPY=?%K}WRn0K4_J?q8 z{t-M|eTZSLKVW_84>8*G6V~14CvlxFk zpFCt57P?Hr*iHjkle;{}?bgVQOv080Iaog@18X8v(4T%pjX1UsZ(+w8zZ(7vzC#WF zdGGhb&(OPxm%{$ALGkF-z>KkHj#wS$h3pUyq|^67{2wy?UGT%v8Jz#dVnFAHTrd9^ zGXobX-v>QjSJ~f12Ht~zT^2M>^R5i!%Y3=l_(8ehoe<|kzt1dmmuDdUBlwAKL zePd2MdyC^-A3e(L{eQi|rk`IS?E=>YEwm%I`O|06 zo%6Xelz|SFyJ4bTD&oVwMMl&^tcrhuY|a64(_SJw`6V)9USj$DKe2eyWsJ2>rB7NH z+KxVjhn*en-?^h?Di7yI_|MyCz`cBa`uATrwjmzz;~QXQXld+E4Ab@+hwDT|TsnBn&2dHC!8YUIwcBcG{>n3+p(D0c^T&yU0A$VFJf zx$iLMgKNaR5%p<+A7ed@MDzq%dJwNfMWsM;Dsn9Hetaozr->wdl0-mmEX#-*BL zyu%8{pYDTYV<$|u>4xk;FRYt6RN;Sx0sm_vJn`$*MYw%#4$NvXXC`e?DN#Af_OJ6F zWs59?e_a-I>`Slfb~Pt9()q^cXxo$#W&bpa2Qyq>$Gu!%-&Q<_$Cd7v{nYz<6S@W65sX^N+qH_67g>G9cVP=@hxm?Uy+5^bJnE1dcs@f!z=O z!s>5tW5wC;*sdez+Ffk9`w-jyAUjJZ!80awq*=>#d+r`@^;7G zeNdrTF|PBJM3XWtU|HV|_KflH>>Q5amNQg8*mOL))v;rISaY6NiastSF>c5Z+`N8W z>3n0HQ_9}iC&ypEW{ko8tMn7_Va#BC{Bpqz&mRoLi{HJ-pGV-?FC*~$w_*J3iAT5l z;fK?0uqU+!7J3y!NRJPgE4MtZ9U6xx4|1_?RzJqn)kN}=6dcXkjNS8=V(auM%y*dx zhlX9aMqQlooS)O?*_!nfx~Tj>Ud?RbZRUu2%#mfR!;JZlyywcFmgV0ch=`yQaOu4W zeHykysvp;zgFUfn;Yh3uaO0TcrfmP)7LCHwpO@jp7Jue1{S3{y4zXd?QR0*FU&NWx z&3bR7|23{s5WhP9jr(`8uZ;ou`L7IP0/uH4rc|2juf`;6>CA_p=D-oEZM+SG1> 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 z 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 literal 0 HcmV?d00001 diff --git a/cmd/koolo/main.go b/cmd/koolo/main.go index ef7661851..046cd870c 100644 --- a/cmd/koolo/main.go +++ b/cmd/koolo/main.go @@ -2,28 +2,18 @@ package main import ( "context" - "github.com/hectorgimenez/d2go/pkg/memory" sloggger "github.com/hectorgimenez/koolo/cmd/koolo/log" koolo "github.com/hectorgimenez/koolo/internal" - "github.com/hectorgimenez/koolo/internal/action" - "github.com/hectorgimenez/koolo/internal/character" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/event" - "github.com/hectorgimenez/koolo/internal/health" - "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/helper/winproc" - asm "github.com/hectorgimenez/koolo/internal/memory" - "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/remote/discord" "github.com/hectorgimenez/koolo/internal/remote/telegram" - "github.com/hectorgimenez/koolo/internal/run" - "github.com/hectorgimenez/koolo/internal/town" + "github.com/hectorgimenez/koolo/internal/server" + "github.com/inkeliz/gowebview" "golang.org/x/sync/errgroup" "log" "log/slog" "os" - "os/signal" - "syscall" ) func main() { @@ -32,7 +22,7 @@ func main() { log.Fatalf("Error loading configuration: %s", err.Error()) } - logger, err := sloggger.NewLogger(config.Config.Debug.Log, config.Config.LogSaveDirectory) + logger, err := sloggger.NewLogger(config.Koolo.Debug.Log, config.Koolo.LogSaveDirectory) if err != nil { log.Fatalf("Error starting logger: %s", err.Error()) } @@ -40,99 +30,67 @@ func main() { ctx, cancel := context.WithCancel(context.Background()) - ch := make(chan os.Signal, 1) - signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT) - go func() { - <-ch - logger.Info("Shutting down...") - signal.Stop(ch) - cancel() - }() g, ctx := errgroup.WithContext(ctx) - process, err := memory.NewProcess() - if err != nil { - logger.Error("Error finding D2R.exe process", slog.Any("error", err)) - return - } - err = asm.InjectorInit(uint32(process.GetPID())) - if err != nil { - logger.Error("Error preparing memory injection", slog.Any("error", err)) - } - - defer func() { - logger.Debug("Restoring game memory...") - err = asm.InjectorUnload() + g.Go(func() error { + w, err := gowebview.New(&gowebview.Config{URL: "http://localhost:8087", WindowConfig: &gowebview.WindowConfig{ + Title: "Koolo", + Size: &gowebview.Point{ + X: 1280, + Y: 720, + }, + }}) if err != nil { - logger.Error("Error restoring game memory, if client didn't crash yet, consider restarting it", slog.Any("error", err)) + panic(err) } - }() - - // Prevent screen from turning off - winproc.SetThreadExecutionState.Call(winproc.EXECUTION_STATE_ES_DISPLAY_REQUIRED | winproc.EXECUTION_STATE_ES_CONTINUOUS) - - gr := &reader.GameReader{ - GameReader: memory.NewGameReader(process), - } - - bm := health.NewBeltManager(logger) - gm := helper.NewGameManager(gr) - hm := health.NewHealthManager(logger, bm, gm) - sm := town.NewShopManager(logger, bm) - char, err := character.BuildCharacter(logger) - if err != nil { - logger.Error("Error creating character", slog.Any("error", err)) - return - } - ab := action.NewBuilder(logger, sm, bm, gr, char) - bot := koolo.NewBot(logger, hm, ab, gr) + w.SetSize(&gowebview.Point{ + X: 1280, + Y: 720, + }, gowebview.HintFixed) - var supervisor koolo.Supervisor - var companion koolo.Companion - if config.Config.Companion.Enabled { - supervisor = koolo.NewCompanionSupervisor(logger, bot, gr, gm) - companion = supervisor.(koolo.Companion) - } else { - supervisor = koolo.NewSinglePlayerSupervisor(logger, bot, gr, gm) - } + defer w.Destroy() + w.Run() - g.Go(func() error { - return supervisor.Start(ctx, run.NewFactory(logger, ab, char, gr, bm)) + cancel() + os.Exit(0) + return nil }) - eventListener := event.NewListener(logger) - + additionalHandlers := make([]event.Handler, 0) // Discord Bot initialization - if config.Config.Discord.Enabled { - discordBot, err := discord.NewBot(config.Config.Discord.Token, config.Config.Discord.ChannelID, supervisor, companion) + if config.Koolo.Discord.Enabled { + discordBot, err := discord.NewBot(config.Koolo.Discord.Token, config.Koolo.Discord.ChannelID) if err != nil { logger.Error("Discord could not been initialized", slog.Any("error", err)) return } - eventListener.Register(discordBot.Handle) + additionalHandlers = append(additionalHandlers, discordBot.Handle) g.Go(func() error { return discordBot.Start(ctx) }) } // Telegram Bot initialization - if config.Config.Telegram.Enabled { - telegramBot, err := telegram.NewBot(config.Config.Telegram.Token, config.Config.Telegram.ChatID, logger, supervisor) + if config.Koolo.Telegram.Enabled { + telegramBot, err := telegram.NewBot(config.Koolo.Telegram.Token, config.Koolo.Telegram.ChatID, logger) if err != nil { logger.Error("Telegram could not been initialized", slog.Any("error", err)) return } - eventListener.Register(telegramBot.Handle) + additionalHandlers = append(additionalHandlers, telegramBot.Handle) g.Go(func() error { return telegramBot.Start(ctx) }) } + manager := koolo.NewSupervisorManager(logger, additionalHandlers) + g.Go(func() error { - return eventListener.Listen(ctx) + srv := server.New(logger, manager) + return srv.Listen(8087) }) err = g.Wait() diff --git a/cmd/koolo/rsrc_windows_amd64.syso b/cmd/koolo/rsrc_windows_amd64.syso new file mode 100644 index 0000000000000000000000000000000000000000..e1ea885d522e0157007c4f0ad7772614b76ff0eb GIT binary patch literal 405304 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²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%0D#Z@HZQfKdC#t>j25QpBa~&pWE5ZIPj;Fd> zdtpNKVR&^JhPk2r=>Lg6rNpmL%22GF$bH|lqVUywnecG7!2s7ms;^gLI>A%0HzfoA zB1{E)^_)33=tQtp{Xg;7Jg;*t2Q)pIX^iij<9fr2oNZ`Su`*(McSVGg3;i$^FlNGd zV*RSQAJDp>^#6k!4Z#dg%KuTPkd#OMU;R0<5B-Pu3;+Ltb+>-U$kZ&gKh$UsLyxfR zM~dsolrglG9~7R1g{ObR{F8rRM&S=gk#&PDkFfFZ*Eo6Qdt872M|||z&-m=C|KO94 zXd}Y8fk*eame0B2yXSA=B5lM9=dWXY2QPH4SC78Ot&rkx#n>K=xrZ>Ec75eho%qyx z!AP}V`3XmfKrNqyVYbl@0d4}u5I!}va~*bo~;-&kSvxj%+_1$|_V z3&g4AF}QUm3C(L)#uVB($-0kVE;t(cdC@vgF@84VZZVfH@A0~&?x(RYE!T7)_oVED zwEefE50L&X8zY@_Q=as%KYqwI>RYXp4A2-FeH-N@_f4jW{vXBh-@q_%4Fus629Oz$RymJI?Dr2~ZbS#qT1AYYOWj$KhF*U>56kGIaUX^RDAqeW` zsD7gge@CaPJg&whG*N^5dxS0wnka*YFPGu`UIoUB3PeDYX@;} zzjY`2eQ1Ti#{S$V+f?B%?bL|JQ32~Pa_AO>bI!1UeuKm(w)o55K8OCy>Hl@&?CI;YW}#=Uv28{%4!; zUwZi|M$cJ?%JjXZ`*@9g$z0>F`vI|$@*Odg_&>#x3kEHjY3lqR98ZXD`8!fqUPJ#* z4KbiaMMT?&V4i;}W)6(Sk`aldT{lGc^+Y81^W??Za8A1^77nM5#l1d8KSX19RhwKEI1gNqk&W?3d#V&p8>biVY`Q_S3Wi(}Phh;*xkX~79tFm4W3PR_-;+4Ir217)vA z07eg{&NiX}hS+t**j~Mfw_%H~^-oO$C38&+lFPlpb~g0) z7}(sNV?S5gJ@--e(lXBX>Jmr0$BT?xF&uM;_E-Mj*U+!_=4s*Bojsa9K!+fAL;wou zKkNN-DQMlWI!1Bt-`Qiv-Y-jBgcbxFLl3Z!^_JM{W7Q`-KmMv*mM!r_VE5Iw&tGLfyf`4%-A<|4LR&@U#JEDYwYQ_m+zJ}CEcHhJTPQL5&rXuf1cpawA3QWIm7K? zHt`Q1)B+K`s-qKq67*?h4|ki6v<+>H*v=l@V>XNlNCxoyZ?Knp&x^m5tNp=?d=VW(?9Mh99HJdkZ3Ni2#`4jAi1%>iI_P+e8Ci%{ z)jOH-mv(Wi-j#Y6?fyazAa>$8B(D7u3uXLIjQR&pGPS9}=hC*arr3u1+Bo*bVg7-% zcd2S2BMkjduyAl4%z1<#k$>?i6Y*wR#^Ys_`;r&D1I*cU1EGWLF^qjc3~j%+XDmU^ z@ObpIaljal2+SfK$A)%B{tRoxdIiCswnFmFmb@?Lwsq@aRCqX|LPB6|Wo3G%$aYJf z>DrWY#JxNb;7}FwMm6BLa1h6k#(vzPulWONY3x+=_btm}zR?wK1L(9p0pyslK0hD{M^HonnGq8FixggQb<0we_LbVTn}s8MXNjh)y|es&z&abo-VKX-O#-_?t7lK=NR=R4o| z@}4ti_MM%boxRV!cV_O)+)+Vz0EoH?_$20_A#I4YXtP*1k>^#!?8EM5ThO~kOAKz` zlRkT6uykZ+WbWa*wqb*?xUZ}7y`b9~sZZ?+6>uay9si`gQ09tK4jx1e_QmabK=KW5 z)du5Rb;F{eW#B%tGTPBjUV(kvQq=n$s`sKFu(Lc*Y#%1|?8mck#^T`C89e7k{MpmS zzrdA!hyKdXc{u$muOuJcN?DGLOL~*vsv&XDDbweJt$kN*x!D&qF&Dm2{eb^K{(lR5 z)xHS+wl+riLi&NBzWY&ywg6Y2V>P8?OSXLj;o4~g7A(m?&&FeD|JDAHUZl^^Vf1x* z5X-o?bIJVkSf9kTUhKPXPJe{jwVGJ+E!fVUIH|~-+*h>Ab!*p=`|DmdvF8|!etA~M zTu>NCu$_;%ZeTBQ1o=vW;J<_TH?3F`jY^h#b#8gWjh561>I zaPDv?te?>tJ~KVJX1k=4Z^86E`rw#8X)=D~Jdpl<`^`5P)Vq)3M?D^q{UwX~jKqgE zYa`5~270x4mv#LedFdszp-(BVRp&5!SvuUh)4oTau=`g{LOks}(&oo=oVQ|N7y3Er z&htRWa}U#SY#lQax!Ft6joVSoT0u z?ww^{>3!iT!CuF<_lOQSO&>%9I2T#JL@9Ku!Fll^-KY!t@Qk%(Sg;_2zSY`Ubgc0P z_lHXX~Rp1=m$>_V=B^S)oB zOTW?VBOBwcDsR1w9UC^{laD?|-rc(#Thj00`yIH~vNGOaS@pU8VH3}Ei6Xv{g1y3A zaA&yrE21g)5;*jSU*cW*?HGj7UHV~P^h$huWeFZ!@WkCyS-6^*f+K$P1=y+&hPHSQ z1=qNibNz6HtlEbDP1~zJKuhl7b?feiZEH8;;|C9MKR=)6Ow30Wj(^GkN0V}eP`3C90b^kB?9vy1;hxd-_SjIE1T`2cqbB1vrj~h~g=kY9)iRv6BIWK8Y z(>nB}_CBJfkH_N9!!f;cH{3hE82#GtT#NR7l&>$5VI|vw8?Qy~#|)W(+U2VtY3~`e zKF8t@=27x(;#AZIY+$F`f3-iDIzY?#Gnlh1)&85<8~p&2w^$GHLpHeU0F+@HSK*ac zuy{ZxgwGiP*DeF$?r{twyL)pDpy)zl-}gBBOIk5Ho$F;e9^~F1->h#DDRO%J34NlC zQU14urn0}fWlf&XD?#IqHroH9kDC6qc{CJZJt*jpX4rw4{dN^>-^!`u`l;< z7=8EBue^#T)oY*u`+?%yQN{sfIbYGMW)u4Eo)vQ2&yUTa5Ah3d z={*Rcvj@???`Wh3&f)pk^n<@l&Hx>t5 zui#pb=V;IGw+k!AWMcW~G_3Kwf)K9p5gyoi?$4OW{q2n!wV@9&$`@%bp)7r{)veVS zBWJFG&(X&U`v}T+giY?FMec7={uv@wAP?Lj{z*BQoeST~{hISIi2cq)-=27!vjX0;KEw`>&G4SL8r_<9K#g}x)7KOIM03w$ zb@2&Ts}XGnQ#fznj$ZX>*E6v%|ND2)kLO41*mEB%c4lMDfMM7*m)Lu{az1Y&E@W@P zVLzVnv5a&4Gl%fJgA(f8)Y0@8(5G4(wj)h(BYhbLwyS|Y?R(*5R-W?tq48Jyu;b68 z756gA__%+!fn3{GSOkBCp|lYu*1`iiD9k0Dc3f*LVam9(-j{N$VCjCQ@p&VBgp1sR zkPv(TzI=&$onOJ69&M1kb}9l_PsW5P>#=InZFFfcTJ;BIT-CB-TeuIQk0*`? zR*Xu+hIKa(%Jn~ylLFs(* zk6<5t=U2q%{fM}nZ;_Du9Rk^Q5AD_;#}6N8IEkPYTQQOAScmoKjZkm;SQs${OD0Um z)dOh=n6eaZ^l84!vmNGsSQ8s&cSFFc83MKA9Z8p%hsjNBy=d# z5zTm3NeIt@%L-qF&1zkcV(AB>kcnxqqY!77mFe52V3kR0`Iuy@Fk* zzccU^{Y~AyJI4`3mZOC~Oc}SwBJZj%z&I}N7pw{h$H?KMF=fm&jOaTIHQ1l%*18pa zv`@j5p|sET97x|BY~MtkTX8OH1J*8| zf_Ywv)C1Sip66$%aUuIovWLih2`XV4e$bed+G&Q|Ds-lv%hK zdkD)%aD25d1y_z<#-dnEW?pGCIo~?NfLsuLR>wt`)<_Pzwi5dNP z7Fq@RJ)%voRb}o2@=8a*u_u`C<%3|qc{rQwfuwbANLoD_$M-Je8DL>NUvwMSgN{e= z%)va*=RI_;*quIb_F^f0X>_g74VB+~3(cyPqOHF+5~5Ei`O@dIUO4#}TULjlBFCm8 z_tKxL%C$0k!!ixKfDM1atT-Ofydd~#{I$-v%e#7(*lV6p_oPho9l}4Sxj)l|x6r+b8_#Vp zY(7mYG{@`#LGa?Z(1ZT|Jf~;DC$tb@m;R0@%DmzOk$nciT?Oj+-DVJdA0>hJr2R;^ z_ZRdXzftIx!b4|+_+&v!0wH!+^hwCkd*KI{Vhwr0PnR4_8OMf>n8@B0+ua?Ka4s)?1 z?k@Z@?((d`6*#bO8E#+QisbD)<94+xjz-PrIj_5T_Mgc9JnDT{3~c&7&(E%`_Cqeh-0RJA*W5R84t^8yu7n8#OJT#5g$SJGK|AG#Xh?sB;vXVp$ttd6>4^z_cs|SW zHJI1W1ue=|#<(7Bv1^Gp0w!;OM~9hkdA|?$^jB2Ad`fT*rxn+bE|?jMs575oZ8-gv zEu4$fXEvhnK`_q-=NY%eK7H40+{+Ed{m-LunfDUc@a&`hZMpvEO-yOL5Yf|bV&5j} zQQxQ36||{OyM_5Jz1SYSgI;ZVAS3a*(gERthtPoI6Onm6Co1^6(VngQ;Yv1b7>dlQ zbATDkwc-P<+f6yvHXzmJJL7IXXYi8^e?EJhdk=cF?xfC74J1xk8N@vk$jJN^=~=&$ z4}Rf#rU15YuVYcawn(I{L(ap#lfMg_*37|T?+64R=Gnqy{OB8_ma_d;px@{2jfP|1 z&?tCvY`C00p;k=H#KsLbc#i8=*iAmzlS9lU2=@A#aWq3}!S_hoAH;KT8({u`Hki*g zeL#Eq_vbuM!;ARs%#a3uezrdtdjM_Mf?2SN$4hPgsb^z{6-(+p#`I+sRA3{3_Ng-JxXB=tZ^$QHh6&f ziosv$2$Kh#`9bS{u{p{*@Lj%~|9|5xjOsWOX$OBoIbl5*vWiS_#t*Shp!P?fgU4{$Nz1B5KC$ocwa%69MNHWOjf*71CZIT&86 zKl`-C+IEq((vmZrq~X3zh1_Go{=hpW zc(!X*WfzmNwS7*aI_=p;+b?UujB$C9_S(c!>2Q5b{b2Blj0f2VWcu@h^_;DJQ2fJj zUJ&?t32?@GNe_`Bz-K-|!gJvL`=iABouZ5)5 zf&E@^pSuJ*lCL5t=^h64T)=)~RV8Dk>Hn%lmG&6Z!y8LR(Z9bN^#R8S9&8&{FF1wm zfw|b3{w3%8enf2kuSj_eEcRH(vw&Yk@Un{NMjOqX7DKRc#2n78`f^S^LWM&cg1NrS zo&Ne<(X(Q0Y?#^{kzVC^mfai5M^lF?jnp|(&8d?ry!^T`2grH5D(v6(ZZ!@e@%Ipa z{yscc`eBE+J8s3B|aQCi14h2k8*x$VBi~CFy{O{%jAl+vQ#&v4MGn3xN zjK+(2K42c{C3JJ(pFus4$sn?mMVfA!v7hbZJF1^Ac5yBD!Utmi?$W9=_qOCHJniyo z=K%{tJI>@4)rQL$pqTZax-8XZ@HtEN(DY>^=V&D^@1r1KLc> zyli}TS<(JIPoZ*=6WKts1_r~JRiQ`E33*`EWt(et%2s(0J&vQgs+N@~LsnP~5 z>9a%5c9F4_gbJ^`hn@{aV3lVg&+$12_xX`LzlHYpV-(JLqTgfOd3NVa zo*V7Yd&Hi6p3gr2>9{4FSLPWXum1u4s||rq_x(8F|Cy3~jlb3b!UHO>A9XP9D|D)> z*HamDje{kjwR_A zd^p!})~BDvp*255_eyPPm-_>TRPVsE^n7q7HVL;=kK)dm3pksRhU~NyuA#k%yHrf) zVq*|E+kx`?Z_r2A%gRSz`QLLLBHN%6d~d^&O?i&^R_x7ufaqg6SnR$LJ2x-D z?R&e3`yOJvn;{zcABE#Y(lYJ?n2S5q2a;a!NhJ9q64y>|fbWd{>fFXwrCQOSUnqQg zCLuBS3lo3pO=$y2Gid{~4v;>9^rdHy-NNq|+qco*ugp2{0reZA8qb*u^*KP>+hYSC z6JL#?<^d}vhU%Wg#9xB=e^A#>&q_Y^9P{e2gvMWNhRF%%>G!-6`gL+cYU+l9#o|{sq0`?zTge#XeA@>o_2>nFP)g~W&7LAkH+pvDcB5VnW z$AODauzANR^lmwYzMCqTx{qrzIR9IX=gGCJ(SvfyxiQ)qhS%pAdUblEb@@j0$5s}L zI*cP0dvX0xCXO9Q!kQU9v3)^#hH~(j*cBOj<8dj8{^UJ@TBsW(ZRRLYFeZ!-G;CJ!k5Igaw#bOL2xe^2TA z5--1u3GLc*Enx$+qW|TrLpRkJUfN{A>v`B4xJ!F)1U2^Kwc-DTJYaj)eyw@OF8_kR zoHtpAzNiOuok0A5GVo`;?fh%U-|7nlTt@AR_0XkV9URMEi(B`0s4;OKc_5Gavf$}% zGR7_O`8t@g->{(DcItzfLds?7FbB>m)d=GhUwX;W_U zPEEKIyV!YKa5*KDV}Xu1omc~3eL4YOe>N7Uljxsgcyq+9<^IYR<4}j^Itcbk-*f(| zL5U`qHgr3pQy#ESat=$~mm(&@gY{y2_4!_&Ya7G!%cCjZl>5h#l%MrDad-vKybZ_w zPemWFZzFo2ynQfuHhR>ns%*k@o2-OSrvz;67>CUrV!6)yy6P{bNV}VLui@V<*^$Z>O@4lX#H@`ItjO!?RPOJrX2fR1IGt+!VaD!y9|LkG3Sg&W&& z=TR`v2`2tecs4wFApg^7(m4i~uK2-!%_6K>OMhCY3K0@>2cx^MM9sH2R-}H`{UJHK zwK~t9sr<@Y^h?4yqBkmFMlCn2?KmGh=dQ%6sipDVSBvm7E-;+MH-8+8g|4she6JeZ z$02jH1|P|q%yw1#V%3UNgtNc9VtpvbsS9xNY9Jnd9>;!Mtiry47)u?czLzd;rfq&B z3aA6@*cW^pj`WyC^p9DKeTg?QwZQ^xBlg>f{g#e<8Dinv|1grGxNnI#3lBKPPBuM2 zdL<KNc()|iU+?2M%-92>`s5~t3M=6U!JZgDFG&CIBC&MF z|G9cZ$~1XE{D6H>mwT8SbVcHU|1tZpGVXJT@L z<*%}De2;c93xD!})&rBhTs?huO_s;nw*r`s?eBfBq1PzkjzKSB^A5mpU)0e!XBXp*;I|eVRkRY?~yoP1o47UN`Rf<0kw21)m!IJdt?`1^kwbSo-a6SsP{O z1EkU)N@GEDo+;TWo@bBl#b#o^r4xC8*TECA>6_v^g?*aXO|<-zUKyla2IW6t|DVv1 zKIS@BtBMfXBztq;Z3nKqK9<6>--w6RKAV{9KA*t{Mn7MV_q5(uF`vCa-Kz1|y2E;& z{PfHVyK$#51d%~J6Jy0jgdWX>Prx+{Y(9g2C`ze* zk???8gTq+HM%7+@2On1IfSC=(q6gP*%oy-85_gn9*ecG;Hhzig6b#&D9xQ*o z1^@U0p5vRwHQ5Vs?xHUq{xMdy^@4l8iMx_}*75E~p}6;Ps2al*aEw>Lex8i=?mvk@ zS`7F6H?7IDF-l`dmnCRer7eck7=^8!i8*oKszc{^1h`}&VdtkvC7pEtPw{}zkFqaz z)Y!eBpiViCpKI5`=3zW{oac`$owJ7hKHGW#jg_q7kih?z9Jj<(#hZ-@P-L zXI#9C5&dQ%CG8(->~Gfr`a7f_tNR3E4~pCH0RG*R;Z|oVDwV8^4n4=C3~gLvT)W`n ztpMabjYckMnoF6wdTkrdr+Xo%a2Lml4Vf3*iMi+`;-1g; zKBq7k_lW(yPuO0maZ7}f{o8l^5a8v4=3K{7qY~HruSv$HL*LRy#B&G69$;U&0ne_T zMcmm2uYH*^+zF;ie9-<1acum!o)y|LuIG@2RrMPbV|)p*Po5zF)dJb_M4c zZGh^>IP6(=ohJG$^#J$$jy{RiJf~U4L*0kY!q$whF>=Nxl;(Px!M$7J1m{QdX%on$ z9Xa)O`0HG-=)givrJM`_aEM{D=+Q=jbu-64&s|MdSAxsq=}qb=e31!Ra`Z@HeIN zRl9HEZpU8em2vbR7*0RZwcdW4`^W2`akbjY=b!5LnKEr)MNCb+bl+d$Wa6)6oS56k zf9l#M{~CXVIr&GP(R@&ZpX5Efcad$t_BA^>|Mv#h`Yz%);3s9zP;$>cK$_?@^)J`1Cr6eSuGv+^2BP z)av_@UaHNc?2GP?jLPM@|5{u_U6yAImB6BD9_GGpqaP-?STf2vV)^gr?;99u?27OJ zZNAFyLoxUpd?foo9QX^~>Ro26$`T!rk;6IMzVxSG3Tsv*D|@f9W3oS!&TmMQz&>nx z#?OfNzKXm{MY6=>kkzIiU&yBUGLiIO}I%Lbsl9t_lpC_`{M=ne|BS!mmAM0 zY!A-?-O!_MO}1s_srTa%a*6&Z&i@Smb3Y^C!Y`0LE~~fX^Styh)F@dGW9m)A_HO$T zI{hM24sjoe9e?TnlXhD6$GI-&e8Fq<1^G7GH~v8R{E&TD2F9kIH)UM6?HX?t>wAoK zA5Y=VHAELA6obF!C)w+%OKOpZ_9N8O6`vEAn!QjZgJ;+>ZD zvy%Dbm~Rj^k89ssucQBi4ro}fJ+aT^+Pz;mXZH(^e*O#2{SOd!>?&GtT=PEHjC6j# zGMZN?hi%@oaQmZu$oqor@Y7wKKi-7w#O1hsSK8s-)WZf31P5_GXORzf#OCoF!cC}6 zpN_J=%$O@@fA7UVux;*u#WUjJo0JFl1?zC|pkQy8dt+R0$i1}toVUphLJs?(d2AQ* zzB-B9k1r!@|7QAR7*6~KAa?m!`j428RipZ{FZ&uQm#vBwfyqd|Pk&{1>Dz>R&;q#! z&G+>8ShX#mYxcHtJ#Rg@)S1FHKMB~gG9PKFLMx-)7yU2zXR+VEZcPfRzFUrKWL`oQ zj`#i6)84@SHe$cm`}Qp?m}co}Ufa{^>>z;9DH zYSJE9r+Nc;`5s2Xk-zYKn$NI(em3Uz+=_k;N27hqp>UnL89_%LAnUVVaPiw;ahI-_ zZvBlu|MsV%alNLTPkfp4_MH&5i2JeownN*h<>^a%1g_jpME;itQ1HbrV&aQSr`O@` zed=P$f3EO=*%mD1TzFK*BhEJ^qgRu0Xk4xhT5~_TTX#tcA#&S?5x z6;vxz2`hcsZ~6LroF`wWJ^6+6lfTeE!QbH>{upkf!`T+J=Q)vmI3K+Q!E-OMO{Wco zc9GPypOH$PxoO)e)aAHUbe60$pEb^1tY>Kwn>u+;6oj`cnHudkntMgFA?aqx!Z zw}Qr=X_~JjR`)r+RAs9^q`_+!Xh-zl6vegiwNd`P(ip*Wa6)LiJ#h8`5-t=X@g~pV zc>E2n{_R)X`5DOl6}b7$ci7LfUB*tHjVfHjR_lUjlKpsO(oG`s@YN~Y`BN@Vrbi%g(?q0%%%IJ6 z1MU`t;>ra-teH3v{i`;>+~xzZ`NK)rK6(^-H>ioS+)FfZ)_i0?{0R5yrZDFx`W>X- z$! zk!$}9{7G|JgD-RP(&n4ED13;U`Y$o@v1FA0i}Jwp@t1tMOdVU;+wK)9kL8O^VBhYe zaP8~DGwR+$l`<94v)?eduk}H|{uD$XJ&UMgXA!_P){DG-(6i4VR4!c(l{t?!b_n;t zg{5Ht*JO$QU&FI5V#ou@o2TQj?@X+7>qh^YeQ+d^? zzm7F8*z>A=LsGu*m+%0`rP)XCBh>!@CJdd3W;N=e@>?ZPo_oV866XrsKT(crS1WQ~ zN0aJxF@E@DM9`Pi8TK_UpZx^;qmQ96pJ`F449|BT%)QT(*!S9oi$~TXf$QcX-ACYf ztQYR)hj4rtM%>8*pHfGEx<`c^;e)4papz$yj$|J}OhOitc-HgP!pj`nv8^ZHXv`h4 zDep?=sZ0KJ6uDpJ;nMj;9NoPL=QzH*Td)fS)H64)`XPnudVSpn!EX%DV^~06Ez1ml zE%6@Xkg$S$uw*he^>U}L594f%Qry?vyjd&EShO5F_aDOHt9NiB|05jFe}v>KH?ckT z07gxj%eIs2P2PA7&8n28|BTnryk-N$g=OF}ZQfe%D+~lbCHoG{ipV1IurMNz7i*(-?a z*^+qgn%aLN`(Rrot}y|noT z{<%;0BkzB%;r64e$WGnL^#Y!_&HkT^33Bg;smW=E?U;;yw5!y&FL?-)XVhy@y4561Htvfm8zpQL*? z3v`+tTS?RZrK}?SA@Xj%Tk_cRsdS|eST5@>b^^iJ2#*!U!XIky5pfsng>S63ihYu$ zbL3pXH{sg0Az~Jf!kP5dC}g{TryvMf(evoPVG1!?jmwv0{xFRAi;a%$`O||uBkUyd z|Cq^e9FP9_BX#aC$p0pv`XZUSo&9)I*XPRk&TQxNzC4M0U*5yTONlshXeDmk*rM!@ za{u!A9Z1dfB0OQ^ z1O2?pqp;;WDc{=esPH!Xp6c2xOY+NiojH<^scy4*UgztW^Io-k)#b=KXX07GGs!xX1GI*{0mQ6Nn?R%as2`k?r8AL)a%7jhJOFJWpUG64p=T znvW&i*Wkl71)j=(OWd*v@aaDbJu9{3{N}6Z{eFG!bu5oxF>Yj z1fC1~9%i&^jVO=tw4u@;wZ*yJRnUs}C+(y64+_SaU%N23lzqQ9> z6yny5Lvr9OWT&s<8ZfTw{yY*luK98wKm9nY7(*Q~5%XIOM2U>1bZ16xT6!$Ka0j>GSj@^zYn{a{}z^srKH~`NYiX=V|;* z8WxL>9dF6!{ET(q;3L)ko8_s!|HQM{a_#Tb`iN;-_iOwVwoKQ!>vRiu+dcbx^nH7p zoK1El`3Bb*4M45(@6p~r9#_t9!rgm;s^6FQDQ)nNLviiO7V^MSoH@A}x9_L3-+m7d zzT+98KYfD-BKs292HgLSW3m6agMuGE#l0WDz}+t|vY*Jdoi<(72Vg(q=G{P?NL+zb zuG`6oT7U~jH{djFziDCfxxUYn>sEIl=TSJvjiP5b51bp!{@^V7>*GG|6=UJ&I*x10 z>u`PAo7n0y0GmekSNnw54;p|&t0vR`0R8?~u8XLpljw`GJoiM`LN)I3oH2GDj;G#M zZR9h3c4DUKXs3_57CbdJPS_T~Ufr|tgZZ4sUu0SPfUwHb<(inObek@B=yQiWYq=IY zb)6M2nD4Wv7xy0LH1RW;o_Lw-jQXNFee(MGP2ieA+I^(o$FZN9gX27*^aHQo-hp$R zCpdSGeDL@f?tlLj4}SV9?*IHV?wfody5RmlzC+%ZSxU#t`cu^&Jf@wWYj*C^)_*&H zC$3)irSDko*OE0!406wy2Q=&i!Y?`8$B-4dP+=eEIfm!6Ou(e(-MNnRb)JpX4oUpK zemLv>);o$14zYi*VR~;gt5^yCi)aHc^%mN24WG}tFhkGtTMe2T@?)pPGxA~KX|@MN z{+s$;r9J1`#8&%%RknWGO0+(=zgw;qh9dWDnvbpfcNEpp5%QPfny0Ch@;Mr^Puk@uW>x%Wf;%JEsK#Y8`FOe_k7Z~lh>dg^pi~g z4U-08|MIbjW?Rzw{R)^mxD|bP*TMeXCvoY_C+q_oZT<7;VW*8D*LGY@9q=1GpxY1w z2R^H5PWs9_4O^0dvzA+(N7u=a?V|XrKB$x-!RpJ)f0iY|@1yW97dcMI;5;7jm+_tS3kBCl!5$*x`>!R3Q0^muxt$G^lXPF70V)&{(g4T z-&69s320Wi6n*8q&h_n+jP;wu-YzqCIz0Ef2-YV3C}T!{UwDJMMEy6?jPra2XZbJq z7Sw@g@HP1GEXF z!zubcoK0JJ#dqF?3;p?>zPN>U9pWbTTgr1D`+m9X`{i)0<~@$*3%j>f1~4bi=RP5SS5MaY!lIJ|xmnh^hn zw0*@#9yQi)>hZ78_&*F9FQJ=~8^KUx%vj+q_%U71bQL-qSQf?Kc-HI#IMqR6B54XQ z<2jAL#>T+f;46Kt@9A$+b(MOWyeF}NG3(6o)i;>$&}A6+ZSSP4oZ;HTHH$a%42+6s z+q@?B?pvvfpgBfm@Ifu?V5=F4#`r zy-|x?m_7sN($*l!oBN@ckLEs&+Vtt&g6B56&}KLU2iK0HAHvd{hvZrk+C(h9FLbfd zUC~3&v)IyA9+7=BO=xBWp^=%cdBCKp#!q9fWKHsF93-E-O9!X-X&zJW*`zl;sS{r977qgJR5HEj@!9D%&-M={T|n7 z6#glT?Lao$e6|7KeaiNqXSo0LHLve6{W$aNQ*%Jl2UI#=$-7+3S`g}w&ogi%HyK&` z*3-`i_wsL=gkyG2lAvrT*W;KENLObV}Jd7dNl?A~R|(?Lkv{Z#)LqZG??u zdLeY?aQKfM!u_AaxR&n^7|~~>!Skl>(hpo_J30}S*dFxj-V6t5yHj>vS;zG$*X;i> z9S^7j9#RK9{F&JQljDKEP%r%H5cR}C;!9oeMLO*US?n_$NB*DApy1D!8LrdLbQ&iz zc&7Ibp24wwGL9xJSNr;;Ex2-a2W?W5vBz^P?Ld=wCZH$xe(xgvy^$O;h4}H@(FLP0 zt#wDvSqw+eP=jmv>Q$%)Ilo8wY~tMMIreddX4%K?L(W)^3(w-dZXdYN zAKru!)49**mb$NG*W?8YA1Au#bfJ-^ztRDuuQi8n_SK9$CjMsoVDO58l`hMQS%w`0 z`?WJ(8awM*lQ-?p=xgUZ>c7dOx*V-*^fMC6StMskv+eYW(vth*->1)^1@i{s%w_Jo zekyBt*&ckJ!gk;a9{lhL9{l5bJpASFc<}R&xc|@Z8U98)!C&y;N461vdxXMo?{fa& zB+i}*M*5z`+{59H)0}&{bvuZ@Ta3Q{m5V;K4NXIw_XMPI{CAaW#S1>>+|bPcr0t%A z8&|gDTn2rVjTwrqqr{)T3nFF@N8Dl;jBnqV=f&4UHQKgolLz{C?$2||CSi)p44y$b z0Uvf9h!z|ZR^wWt_unbaH6^b@_IM{m9aH{YG=6q^+3BIL<-S}O!NkN|%cjJJjZu%; z%vkuuna9lkN)Pb9vn&>Qm%NAXHiCnXlzmC+CHjr`?ZN&%@(%re<9l^k4u00(rRpKN zlDZ&m-z7{RH3v0H(Wgg)YS_MgD%*rzoa>i$UD7w;-Yxe13OO%ypZegz&p+WI=LZVD zKFfB4x}JSP8Q0(9I`nHd{goXc_aoXF81gv&&*gaVGS{Q0M$D(5;3b?F;M#PK0}Hqg z=`MX*oX+wh5A47_+7FX`rYr3CZ=8a7+70(E9)W20VHi-i7MAp;y}v4bOO>lme_uR1 zm2*EbPgF_fi_39OWt|3?-li*Nw(fyyv=@&WFotF4TRPQ{1KnRTXkw?O#zNCb;ZO|r zg1_wlGV+-;CocA}h}QcWAFUgVI@s_aW=8+e;0-C$2oC&p8Io?VuTHnhw(*)y(|u2i zr<886mCgUME>8RzLI)Z*&JM}Jlc4&y;um!lzHT?x#>m_T*WxSXFc{~cfI*R*$ z&BKH5KUML4jtL9?oXs{Mje3K9L5?HyxDQ3fgT@{o+I(me%HdpaKKluUGT+4Upo|%B z(Drn%Fp%ltICany5$+=qPruH`qZZTG&q(ZJ{~%=cP>gHQ3?Z{da?M9AOz%K{=mQ2| zX8X<<+o~ldf6x{_BZne!(RhSSAHnnCxW|?A|0xL0Fein!Xx`B0NC) z>;K07FR?qB{YaBfw4NyreKt!FFFxp3WVuZ~UN!}ByQ+@W2EWB&Xv*r%uc zR`wd?|LGv{zstViPaG?9e87IAF*f9Vu_?%0k@OEaRK4p?GRVa zZsJ@3{mTc=Wjhdr!`r7|AALTah@g)Po{_Sh=Xxb?o{b^R>S98hmPp;PfNMuwk+9H} z_5z0GuJE7S53M;yXu^5Gn9y{k+w3}9VQ1oHmkVdPvh#rPjEM>9r18=CTlWQjg`L3< z8dHnLq`k)9j){Scl|v_dIyEyT&Jz*J_`Q+4GO=1LLNEE z^#`;O$v!VNXCQWG%Kp=2+7PaBPtqRZ$n~HXHY11oKW}nBpZ! zm7SjBHU0gDEIQ;`Ff2~~HTIep?D%Wki_qK&3prm|A9w8|G<923F0ne3DN)3FQCns z?jrxkuQ``|hWl4#4>N5KNof1#1k)C_j|+pmrH8?+bvbx`w1=6}QfXq2Vvrpr*z7xxa< zNqADX7rGwy{8~>)na<@&ntqqgSL9iJpYM<{qpU@eb9BUK^}LCT(5YE_R4ZKp)yh>w z`?ei0bX7H1_mMKb%3+O8DRY-6B^K%=^yYs`8pNHRx(!?yM7({|B+P*vgh`Eo1r|SnEFP zp=HcrXO=XPIU}~NZFQ6SsdCLUJBGTyV8`EjpP66(x4u*8q3h!O9=TV{`>bbqPu?%I zkUoM0nOBHqUu&iN1`O{r0?p{xyE^wXR4ZE^P3zUizz@0BciwdP_-{nqq5b5Gi#U1j z9xmU%i5ri(j^NWPv>$Pe(O|f{PQJTdw3ET?j<7QQV0@{1R-qCcFg4&Ssj~H zL(MX!cy>&A^l8@%Tf72sES2lKIfgat!GNfpK2UV9(@R~e`wlwl`;NIsnO}0uF=_1e{F3_bTqpT2^-}3h>rD7Q!QWZm zS?}dD#&i5;(fiNgHTCT_{PpuiXk*sPy2m=nxKa2(Y>Gmgqx7q@cULObd+flZk<-wl zO?Ncn9;X^5OH)sjA%11K->D+kH&;cwX7$mna|iV4)e|4~?Tx;@x}$4Ho;BK{0b0`c zOT9{EX_sQ)Gfk`4q2Gi-Y=3x`C)f67A1P4leUu+A)=T4Qk99pIcF33jS{PL z;SUB)bImgNQx(WZq`!f^!2_1Q7hLGe(fV(eW3QLKw(QsD zdjxx_r>b``_^G-u-HyBU9!vKa_l^2F>Tk_!n9tk4OX{O(Xipb@kp6=3gv>RZq5UNz z@e1PU<27h&47`_ZS9>w1xJ<|B4@YBIui+TneXzoIaJRu2(R&2O(VjPlbCq86*Q+%i zF(Iie<0{|xK(#-j=LL7A_cR@zLo<8b?AN;Pimv=V{a@Sg9sdnXjeN#DfbhfRe+PfT zLt*Y5JMh=?f1dcOews;Z^?tcFzst&}%QL@Q@uuWa&q)~${M7f#f8j624jp5(IqE;3 z)!+K;v;1DJZ4rKP@UVWDX?HN+t8A3kwUI}cXXgo7r+$gLLU=@EQqxuX<>w`cjZ=7s z{R~;pCu=<9TFJTM^`g2?o|o^GSbv9etn=9MxANQSEHsv9i#%`Mmv2!tmiL+XUu0}A z^O?ufY$dtlMQ?moKrRxx7!)-F&yg(R^0rH|`tqZ00p-A>SwUb-d3gPcXOm z!1k?0>MqZj&pY@^*WV~d>jur2I-mWWj(4-p#7^i|2 z5iI>H_$wYLijAVFneP0YuA7wMpuJqPEUBx|L4TJ@)41`zqLF-;k=J@g>c)F2sCvpX zQYRxAIO_WAXC3#Ax=6aCP8xfO)%WW1i;L~=ce<~!lJB-(+cAD#x;;;k=dEuOT997k zD@S0O{xA3Bz5E6XOVLln{~GbXbW(W1Mmy%U=%}yd+k^(zI#HpKK|@6s^IFn$aHMPO z4B8uXl(I~kTF*#ygCB3JdO8m-8>IHA3chNnYc=S$DI(7H<0fGwH%-x*jb1 zsMLYwTWNC7pq->!?~!seZFKy+H1nPM+f*#|W-zejcUtnQ)0|^R9?j2Ej!{oDujmz} zV_0X2&Az|p1Fd`X-ao%99Th%;gM7PL zPvg4{`kyuPJLqlDNa$qHn)yupEr0h?j-)Y`?{Wk^K5_I>j5-?c(pWmD8Fd!?O+L{4 zrr*nSyDrn$N_G{_tm`weK_iP7?cdLO>v6uOg~1bc{7vi?-lU1en+AQ=yNh6N&_m&` z(peT|T+>|IA;DfSzj@|kT;bXS(E;-Rx$S_^mqE#%rbUrh&Lii0k4x+b=b6V5qzvvm zma^no$!`UrgIVulW1ZJgw&Pj-ZssxHr};#^hjr3C=^QIr=QH;7BHw8H7WHjXzT$zR zm>O-7BhBJ<-8Yi&wY|qtcjLRP_w(Bw{9xw+{a&LS=kIhbPyN?@4pR^4K8Vo&64M0p z7ykSEF9rTff&WtAzZCc{1^!Ec|KCxdF26XNVa@Mec;R<1RO1zYU0!^lX5$xBFcMyP z;rcn+3eG&j6^<7!o|ZWSC;PqCM>qQF+ODGPY3iQj|Ltd<8BaNt`M-Hz#zM})7(3{( zM)9%r4C|)HRYuIdvDk8*g7kM)V7l)6O8@IW3D$SB&dT;=#YO4qD3kqovFoybcV2L^ zg42IRU+IhMbjH6$bE_OFQ$M52m;biFauls3cDg=8`=}0f8alsQKPTxIWK6}_o?ouz z9qPFvb<_3J`DJWj=3^O>U*o9Cw(xM!O=u@$Bpt4ueMsJ?y`1YM4Z1qYv-7(BTE>Bn z|8i~rPn)!|6FbUL-(l8I)$w24ch3LZXUuXm9{M>&JE04MMMvBFbv}En%TU-*o~^Me z%TP8Mjw{61uo{n>bd_~&d&8!-{Zhv@uYJe_22nf=l{jj)1*}q zK9{s&$`|@rwi5d_u~2(DbZp);@;cRlWoumYxLncSOjq}c)JeYE3}&6Q4C&`|UG;yt zuhW!%*5#>msgKx(A5izxKa;W*8oEoKaqzam%g+Cc!+f0b(HJ;Uh6$VPaRmMmHwYx6DO+-mZjh2 zu-X1+vW?mk!cA<`NYUW+2OsS`Hkm|wp{QuFm?W~%H#Jc`ip+CVe5ET@$YurFIuPnFQ!|x zGihPa$)KV0_gHzK!RX(l17%R?Z4Y+bo!_Vb+uv)X8Ms_IP5ZFwPYQlT>tM&T_-jM1 zEg7)kFZuPmC6+wuzogshuVuBk@~!8K$*-QX(NMn6PIvviMr`o7@qVd?)IrM#@3H-| zo>lY}8nZkV=(CD;c|!&ypZ>3(XKd;r)o!z{79DllsM<$^-qts1dN4NV$LDNm#pU~d zBkh?wnfPhk>{!})QeW$Q>Oa4)C@zlw|L(UboLL8jm*B%PRp4G)UA8Vu{@btBe?BAl z>%5ma=9RT_R)5m=OmRHjM@2LU)$)b`WJ%7 zZ-(Edr=7n44jpy=;^?RE{kySq85$#dtjj7E8yi+SpTxy|hsDRdZ!ce!tMRj8t?(sX zC04pl(^zm}K8?9CM=Z7i!(O1@BXM!{_;=Fm-=gcP)0}DcTjl9zB>q?B*z**}|H9vP zni#s>!NUgsi|kOp>mdAY>3c)(J7nP5XH^}gEiifC=nIRk5jm2epON<%-{j2u3Qyj% z>Zh)CUYjhiEQJ;C+v)VbaqUcN=Q5o!v)|Xx>hH7v*J&Cb$G1NF4fc1a^3Cs67@E39 zkI8hb%GER`zZ*0(Xl>EcyszrTa*X+L(^e+5)O2NRufuY@um5#n&*qeyjPUYA_E5fp5=ei(ByyFx374K_4$9I_wDp>=1rlG z^ZnoYujyG_tel=BJ^-7Q$1s&i~i=~=p^@wl%?ol=pdc0G0?G2 z|E+S1yvzI+tL{?YV%}?&Z+?%my-R(}HbCsr`dVQm^f${kVgpN~UXFX}Kg&?_Ddc~d zhtPQFciLm;y4mm9ubuNb|9@WI=cQ|UI+s)2f61%U^>Y$C=x*|+$)ooEkmK6GSv_a! zbzPQ&|BZ5-)2(M%zH#lKx5gyOkv#Tq{jGBB`ToVVe21N; z_PScvPI(;kw$t9YR^{2hozE)TGfl~Ytt@%3<_qgx@~qI;;(v!M=rk4cS%Ws3|LuB8 z?iu%GUO~-4X#TgoQ@>kcMFU&CwH(^>Sow7RVq$xKO;`JO>ihP4LNgtl>!H*C-B`DS zmY!C;D*S2>23A5NqyO)qrKX#dqu;6NY~3TB9DHe(#r%#mK5L_;9a}s9D}Hd|aXEv- zUXJsB#d}5G|3IDFVSmQrPm>4ap7kxHwRPV{cYWVpSLbV;M?bIs+hc{b{&u0E@G)au zmgKc#uld2^E%VtTyl%>ZbDHtZMfqRV#TwHY^T3w9&MfN(kDf$%mE%L2qFzKiHSj8+?X!ATiu;^ye z|FC>3GXE7#H6Lpp($DDsI@a}b^u77rX8rXuLU)~C#hOQpi=Ff8|HAKDZ*ktl zptr0MGJ_qHXRf6U=9pRq2aR-_B=xht!|8oGj}`0tjK#O0^<6gkQT(s|i@X*6_H6Tc z)ehRq(lTJsT|Xmop|8#Mgyo9-+S9FT6MttOP;$h3iicR9`d;}@I;lPl(^Okv@`vz~ z#fv)4d``=dGp0rP-;ihHTZHz{hUfEtQCZhKr0HV+Z|8ftufNmz`;BL9@*>}B3-)hP zv{CdBJ}#P1(Vesx4DI(U`ZHbOP0Y_~-nQpu9TlC(zs7nIV_lEhMS zS;Rc^K2B#8;#4|AT7e3uQyCx5$H_ws$$2WAIGD@x6c`e7as0qN`pPi_|4Z75#5^(`GH0+UcVH8)?PzKg)NX_tWpP z_?vl*Z*%aobvC1aDoKDNfsTA@ldG2_^U7i7S6Pc0MkQQH^`Z)HlJVqaXN06{Qi|4^*@(j3i>|MmLFb#X$(-1Q+jc3E8V)vXB?4HfD5N91i z^bCe+$%vYENQK?g4`cTX-j~4ZXr@Q&4W6&%~|TY6)m6d zZd$A@cHpji<41)iL_1%|r}&HG1|TL`+LW#N_>mn6Mw=WA`C!Oaj8k z#3S4-9$}*yGlY$j>jZ={gpJQe!l;J8F+5Cq>W~p8A3vs$ESJyklCq@yv3%bI)^YMd zC7Usn+1UApEXA)lN`HOXIJoH?eYssk#?C9q47-kFyKmzJ^~EX5O!nadB{R|74X+egMDRCtHH7ceXwTL$=IRj;*J(s?Q7wV#LSt*2sAi}4uO%nfdhUEtbqIEFVE zf?@RsVQ9U97{V~PUVjWSgIo`-KY)1#VnhS_g=shhBO4B77zUR{^6X%As@xiN->t^8 z0Za4Dz>=u?MtL+WSqD9H>AIAJc`HrD-t=_|T)#bZt_s8H`{V=FjUlkAGwfrAk z+l=dcNdNO6^8EubvcXV{ZbY9nO-5sKi%FQ-W){z(TLP~h-q_U74}L?Vl-xv&rYyJ~ zpv+JfM4ntIR}7&pa!uJHjdn4Fl3pq>JzQjoG7~wD@;xaTF>IsuvK@+Fl!1NAk0No^ zNu+E%gEY!Y`p&CtOK;&=d=C3>?5|NTou-abI#~9;5?ASWskwEL86`Ki_L@AS@K^U7 z{AQO4#d~&sGp{Xvv;G^;>#>XxJNRGsizK%6zs3K;ho*cAKda!VkLG_J8{Z-P?ksyn z|6B6IIvO(1`bgRAmz+AB%QJ`WA~WKKYOj+vW+TD#7~A=D_5lu)_6Mm`MW0b$6RWTh zMhG2Ftaz=$Na83#VJbRvKXEpK(w)S1O^=NjS!WQslxv1&@6|+|w<@B#@a8M;qWnv5 zqTGvrK-u5DiqgM(1*Km2J20J5+q-J#;M74z9Jw zVp4-?7+Gr++LdmO@-M%k$}7Qg-eu6`%e4;0r5Sl&WS*CJe)`L--|tb9buB4%mb$<6 z2FrejXY`dsjn^xn!8Wy8bRS3f_;c@b}@W0SW+6XI1+oRhL%1byy zgo^~~6_E+jUqTr5NjPa5!L~@XJ=8mbQS_ul_VEs35A{;QvLie%=p_4<7jQK6298rU zPNftObJ4M~r-`V%5U+pF&?nw%Q3mb5=?Bj2;0#(kM-Sd+){9@XqgECLh13WTfox-^R%5t_bgzfaHE>aj@@cB=$Lm z!~IVqZO}P{^w@(BtM);umtHk_|0VT&sh3_O55I+qFPB8MS1Y348@15V+QF2cZvTsDHgl7}RhEhBcXk5zXiGT(X65ZM_I?ZI&=B#prfRFt)=|OziA|sa;lJ zUYFHa(>D+S!}lY2*nWfzXB$9z?o#@KeIm+0DET~$bdo-ok_o1Ti)^TS#&tO9EBeQf z1BWbVnFwe9Oa)U$?CBBgLq@WHxSM00c#dC^I9@sIdy(ht-J*>khhsC2L!`gWey+Bq zS>poD-xiN)z0BC+|6=%3^B-eJTR<65V`0NLgz&$yhe>48)bo;GJ!AW?+X0ac>9dIp zSoPsGd0xq#l4Hs@cgN8QapU83~5qOTzX zA_po>$$+%W%)@I#CJY^BU`RP2j=M%kU^?4`UBlUy4~s|e&^QF~|IUeN*y(-(JH1XJ zeDfuQZoP_KzPAt^T7Zz9xd;l*Lr4VAcHjMwzAPUhH1-jKV;&+f@*#GF6kjHu>=cWH{>Lz}-c*#J+*Ez79C}t9gduh4bFVFBazFqUj*rLk z+38rd{0!E6U&Y3)x3J0gE;a|`VQWw!wujt@&n|}0`|u5W2*2vF^&V{G2Yfct+Q4a(Ui9^URjvs~#{YhJfFb2^tqSuvf=e6ojLG@o^W~Oqi$gv>DX41bD8XL5gwo}tc^fqZs-dAm` zw6_eAt{kJOwwH21OhQJ)V(0J}1PzO3h(ZASwf?*g7#RycmhVqG`j1bB|HQ-apOS`v zshRMfegytAkHLTTarn+Z0iVUk;j{b%ws{=KM)t3^tU86wD^FtMsuS2q`P}4v3Y*rS z!iJ66*s$p=Hf%YEb(_y)-L^~E=yMgDeXnCn;0^i~zk{G?%1#vdaMe{T?X?G8D)+WvrRz3vRw ztzRScf2H@|JuvJ=?4|{Is^{et*{9p7J{?1 z8<8A)M^V;{Ks;GaB>Psv^Ae;zh>}40h!Qz4)1x@vh~_vhmbR~b%h_hK?{thdtFx(v zv`Lya5b9#BtL-{i%ZJ7P!n>lYpBH4@Zt}m%W6G88-)P=<@V_AgV(U`(SgzQ_kHy|m zHn-UMX$YrnM8=zHEJdDHeG>AgvQd!dBbXM&b~chU5`GuG9yB}}K7&HAq3;f?=)MN? zI=HK`oJ+$I7{D=K&uU%KvC;?lpj=ZlFVhfBOV>x^QuWZdbOSUi-<*8a7A*Dh1hv-dpo9k3V!hONNR(QDx{ZWBgN-j1;|{4i-=Fs3hv!0e?l zaQBMG;x&oz*pQ0VTaS?6$WMXiu{q=_wuj!tj?mlK9()Vi0&ii9&kbzeat-TOoQ0=r z3dhXLQI>t~I&ap1XVZ;X(;*CQ4QHWt`6h51vjxk%GO%=M5*B+TVeqKcs8g{iTpLV< z*N|8&>aZPE-l&MWZ`Q+{5B#xYY$}#5J_XNp7qE86b*u}ziFJJM2G(IC$4BcUu3>HH zMXU&26{E**g3D-c3>)T2 zf6t51r~4dq?=THr+e}2~mSfSrsVmxZ%-)V;`42d*Zdt1rnp0+*Rqe<#KHH#S`Icx{ zrWqQPY=}lB>Y<@6G$=_NN;N=>vQ5yo;s@wjtqc0q{tzP@jl`5zQ#cl1gjGG)VRL_f z__O~h_6NoLw0p&jO~URm99vU&Mano^$q4lyXUOJIjEf^Bw%J%TnbrzoTDe=y#(mImb-qOCG8Dn6$uih+mwc z?115B8yd>-P?+d*(fO>qjHTqeqTR&)5D&j0;qdOW1@8Zcv+s_p>dM-l6l3fS6a`Tc z6)cDa8!Cz-77&pl9R&nY5L9|Ef)zo<4k*>$dsl3zvG5dSPP!UT~Bq$5uU+=E&Z`s)yS8 znPYrkGmPuo4deQB%^|^nBklT-#NK(3r&VoKoll;24n0L zFO0IEis2(1Fl@+3*2WwPTdP4B(bpQbefnZlZ%f!&_TumFfiV{5Y-X^x?1u4u%;3QP zJF#DPOtLa(>w(GrdtwTkv$fista~ZPF6^fbP@4<;sl4vQHi=_4&e9BaJ-fiRduI&o zYK%b~`+gk^(S!AmO`A5S&exds_0_c+^O$h$Q*Re(DfY_0y_&$g$p@qtYM`=4;R{XKz zcUAGPayP`j2{D-&VfJ_{asuLJw`cPQT*;$}!41 zo!+R>DtY@BVqAE)vgU}O*>(7A9LDs{V~tM7D>~`W68{^SUZ0PN|I)xEG-D-DYHG*vYn-?>G$M<82URHvqoF`@!9&H(dJnVf~#pXiXi) zuTK=R!>ZvhG!z2{PeNo=8G&*SnunyhyD)IzL`)wOi_D}Nxc8e) z+o1`pj11vu*`3(y0goZQF>~|)gge+E%4s-ar;S3A`&eXqkH_)=N8|@h!P+nvtP7vU z`dhB7!#o{Z=DV{-vqxS=6#qZo!iE1+xS`ft+70o7Q><~9M*lSU)Rb_iVi_QzP$o*2^36uq0b zr=OrDIyP!TI-q~xop)+!qy_Dsb|17r*A^YA6ZXcW9*zhdHive4F6p5}p@$O629XPj zJWyzXbRo1Mb_L@#<@5I8@ah`I??es=9jI7W^Q$x(PWv@tB(wZe$5MsV)mgY!HP3!O%>Mv?>aLS3*q#t+-GLvd*R0-WBFjH}0UP;+J} zuAW+gOZzi%l69I7tO}>S6o4w$U#m>;Mpe8I>A;)#*EQX7S*#bzV!azQIj3uJ?ByBW zUlvcgVJl~S@5%($|BMe{&l>Qgu^kD4*p2Nc3tTrL zJN+K4sY6Vi9)s|yIjHna#-rku_;lA2e3ZWwg_BZ|#QAlY5DNPNe#lz>1T*QY@9<$8 zggXxB`vR~%(U*;5z~8bXL5_X&ns@E-4&GOl#FoN))7a8kYbrAkJF{5NHivb}S<`lR zE*pC}mKwKO+qIPEmIl|h-TbWFm&<1t&qP%g`3lFkJdNX#!m&y6=Gb_llr=9)S@XJ# zG*Zc$X4{keSO?9YO@23@i3vo>d_US1zF6Wm14$0k5HWl*X7zV~r-dyhb?pz^4rZ`u z)gH!8np3X7ugHoIi4CENj--hJ?RqlaG6m72qOojhKJ|zS(g9;T#J-|OD{)D&Gb(wm zinW)|pqjo#;qz*2T8&SOF4NFX5IPX7i?3B^LG%A8pY`ys=1b_-KPj|Do#*f~l+HVV zBHBX2b5h4;F;+AUecJY*Z?6fOC^GO5l#xwfV`7A<#7U_AV5EAC zLqUi$Ys zG>(=m!twGr#w3!MkCRHDbvpk$+tDd~e=bgPXTjExTFdvW#;t3s@X@6e|9N?@Y##q6OHyDh%66YZVDT z9COZtjJv{v{CLh+;U87;ydE9+rzzF6oo1@Kp?^d;a-Vr)N&_Dm*uMJ{e!T1h-`-tVqq zU8nW9|7;`feY}qKyb5sj=5ky(L-|8GJyx<1r=^Z?UO0X21JL$^mWY^BhLt;h!9@F5 z4774Y32oP>XAa^YfBgji`uDf^<5zo8T~>*#mDgcmF&geuv#{aV|69ZoqMUPmvFuC>QKZh9G`i5_3evhE`*5n>{O-i*-oxwTqpr=Dg~#F8p8P_c~di z@qXd=vgTchHHaMGvx@Dj=|7|aRR*ZEpwWcnN*&C*ifuu(RY(IdjJ5Y>jK780sEyvI zKc+qP<3U(4(-|evPI^>?Dr2Q+`zPxSaA>XrYueQOer1W$`mm zk>X354aPyrm*W+2jI(62W(nt*HLdSIS&v80H?htsaYGCVrld}?^!Gm5fLr9B)uf3N zRk1j@VIB@`iejC+1U{e3TDgUI{!KA%T*yKCjPWpR(ge=*trVX6Gh))tpoiHA_=b?C z?tg~Y|MM08^6y{p=?@RE{tJ zkMlYH*^C#)GY>S0^;eg(ZgU~)v9e|_Y2Xp*LF)59d`?W0XWYJ9z&f46)0eQmVm7W^ z%EfhlzI|^s?mS(Od#vRu^r5u}IvNq$ctE27vl_n!wHVn@ofunymS%H zkmp}Il7pL+8Mkk*#Us}Ld-NG=gnm(qkH0O)$E@=xHN-IWmdH7ao5g&=nb_d(kJU4LvBt{>>wSGuGCL6G)<)s}xpoh`x1nciQ$ZzFZR{Jbqi2)aWx)3DW<$#Pn~Tsj!?(nnGr-ii1*SaEoHsj3gUe`$F7Pt?N-W+ zjkHNOgt=jTm@7(14||q};c#IT^BW_Ws~HT@V-&oTCMr^Vuxt5j%IJmU32Bt`D{%XM zp)$vhgl|fn=vUH&KN1gY3NIy|?y;u$l?y94_sQ6~d@iq(@#-( z;yk7X&VzZ^!H9_7gUTy^A-z0-SOU0X;CYjFJv z^^Y^ub%@U!#OVXl?Nh0D&Hp0UQ{({Y;V$cy-?~k`=5j7|T=Mi|Nz~U8nP-r}=T_nl zYnb2vWRp_MRIsnf2&sWC?|RJow~sg`cb~4qjhlJQb6!kcFcy1O&BhMV6=@snqwRH+ z<9l{z67xp0`P){KemFKSw&9bnSqqW%GC!hhxUfG1``1RGGL?1&=d_ZT5bRgzT2-Py zcBN4cr?Hm$!Vqkn>5sMEJ}C6@MxnPSP8NjYmoJv$yHB#Pw}g7;sGiiT#ZS@PmE+kkt*A33KF*zObG_c^c1oQvM@iu|6u{{GV~Tmzkl zBOBvUo*aTrbG%4rq}Q}SoFK2ieP^vw3;pqD#l%$sE+5at>8&w1x+WaQR)=C=_AG?k zS;Lg|ZJRXu5WW#hQ1#&N*m~j5n4fqM0~n9!YsuKfkg@31V-WiFb;g{e2+V{P6iti^qY{QT1CES%bv zfQyu6cPOKtkQXa;n}r^frq*#5T}f*8-g{2@@Nf-o+|B2>{%I3UKK!@Ksr!lg2)2$IqJB3Io=1eW}_l17=?a5Sm*0S zI&jC;vibPi4@>dSpQ#7lOo8ht3&kfsZIrXJ{z29}G|acwaIWb-^>cgb*3{I}fgX+M z+YI{0itM0nB;O}8LTa8Ru-2~l=dF#}qiDX+w?FYqy)VXB!SXihKO3p93fW%FEYvpWea&f<;9lB8Ax?^fXCoI)bot#N9#j7c>=c5r*L#*49@M$ zz`@N6QIQphBI-893+dZi;D)kPUmVyJK^rwqvFC2xTSpyN=8ifqajxjTl>7Ikac%|k zk4XzRZ?2^dpGx1}Y~*`-U^VLmZw#A38#^554rSu{N3;uR|6M+o%N&&$>{vWYu^+b4 z2UrnBpJ})&Vy6tp7;|G7G;V~>O-&dF8i39n%@LPhg6g0DhI6m}jV-6X<>zWdW*tRB z!BrF-_zuTD{ui!&_h-Z|+XSQ5#!9YQE9L^3k%qhm_CQ{wGY)Ty=GvBY+CsUkHN6b? z?ytdvXB&u5sYg#)MLvH1a2gJ+okP7blKLa%(}P0l=A;v;XG}i+kYjNBDfKwsD>~49 z>OhZ$_C@!RM$9Yt=eQ_xKzHrYOVWTej@bk1fp?zJjuyIku!g!8ZDW4VW&W;XWec%q z*-Y%9%&jCXY$rde6rGc8JN3>zt`eOPQVpuPmSf@=;P8qMz z0%=10UB{P&<8XF3)&+W?(ANWHQGWRLK?eTzdI|pe{R$+`8KdYMjzb(+1O5r|DE6tU z_q>VsYZ%wZvUaRpQ+fs4s=r9PuH=EzE|AYE{-vk>LwdP#{&Q?CJivOPCX83Ti#cP4 zl84jIA@(a5`qFpq3=h^19p1GgrgSqyhSLP<|9&VYootElBE3-GS?EuF$rBM1Z85UD z2|73VkTv4l(GO^g^`xbvn`6lb(^+3S1{LJ9#k5_Es7Gz3zjOPtU>qr5gv;lbvL^X@ zJm6djuYW}TC;E-(x6%aj3g7>NpQ+>v0OZ2BQGcuCckfE{rOfgq9goEXi*7La@B_4=&#rgtzL+s2p1!SB zjFVc!sDm-)CuQNwSIoJg zJ}Rw>exM5K{}r@}D>-(%bAp)n7>@lLB5fxK`<+FzE z-@2ykMI`i~_b%mFzC-L}IZvJG!pUct11^TsU@ zG+;1_=J;TDVlYY~y@`EdnEhtbK%CPUj4qEE<9f5Qo%jvPH=yPxZk-v z7Wv-($ae5R&cx|h?aSY@U^ccThodxs-?K1)zH7#T*vhE4Rnm?Y|9chr(uTRNh@3PO zqq=wEfBis-WprxP79))(A(Xk5*%@~cI3pj%%{wU9+I;XKYz7X+{D?S|6j$NE;nOIu z+|N9SOboLbiFO}0W&ZNJurr;E7`I)Bao)z*mp3{zX^*D#pLJ{90@JK57=Ihj-{^s= zB{OlPG>Y`Q1oxg5l9$s@`8n-S@_DfX?%ykb2(BAqe1+pF{(wjH={y!YfMfdTm1-NQHWI&w_m{3jvRc`R+a z0PIQ)#g4=vg?DbFKCqSeDWQIFihi}VkxuX%*bgT*hTyYXiSTr^M01YKKyxeXF1^US zP3FdN{hz{{g-`3@^-cKxZ}H#oSq=NYq8-+VJ+$*0Cb8DHUan8OvYhSW}=w?sVJPbF!i2g{?3f;c876e$^U%^Js9(yIdUKhqrB+nUxW+0GF1DM zvay8xLvVkjG)A%e#P1>VAo{!TC$ak!9|q^;!Ive}eKw+ocHZ@mR9o-L#Z}n8BnB&I z2=3kKdv-_eWH02+@WQ$<>Sv)duz3#k{V4jII5&dz?bJytIaiw^T#@227Vd*BxNfC2 z{nGC$zBt48TQCo10CS`lA};(mmacye5C0`FB0raLXu~GC`jP|CoN>>#O`E~6MN718 z)&ecw|Dg6BYK}%$MPGroMep|-1 z4pZN`K%RS-d|e%nQat{OjsBQBch=x^#Ukv=rfwZSo$KG|cUT`zKAB0M743*`C?BaG zeRQ*cxr(ujc~O^V{H!vAGH_`q_H2m4@%`zveG6z;(AUJVe(?Dwd~|yyV+=XC{ZSqs z(H^)<|JU^^i*a^$3=S8~!_m_DiavJZS{`oF9zIz`|8=hLcJh9S3nWThK=ge!%GJ0j zTm!`amFwoj^-I1eo+FLeXWJa=&Gn()I8Q%Pu+u;|4(N)hBf6u>yY#EKGeTa*7V_WE z6}?}@r114Re%%ni`k#M=VbY9tUAw0B+Ii`XY=HiT!{A~y4-0&^GY|O*GS^?n*zx{o`(X=}@ALl)t~DBH!{^!($FkO?tsIl* zYu9VrXF_~)*%-dKnr?j!+TkgtO>BJsA5I5Bx>*rG+OYz74 zRdX00Poh4Phx?DH%h2!g^lSR)U(x@!nLA_xJBFM32EiY zH)ZsVtylE(y(>fMFQ#0keY0w|3vz>;v6{B+(S51p@0;F1k+^9NGt8(NGL^c9FtTXIt>=+hIOQt)3+{Wi#MAch!s z!2EHeupx-DIGEU%7UF}A{9LtgCQcSdqHkA2H0Ai2wrYp;MN4p*J{rkWQ0!d6Babyq z{$8))__ywR(>>Zbef-NiL?5cDeud?!tC_>XbyM_ZMA#0eFOz;q;&|&k`f7tb6uM4y zvWG>RRtnE=O-%Ho&m(cl81glV&o87eGmN?peM0n$?OhwmxaKnYxasHnQhYVkM+NKT zMbaKqK8uZZ^Y$w8npo^2U)+@)NS|Cf4sJ<9!K|6cWbOJa>N?AuXJEBASH?2P!SW8gc~8e_Y4hGpB9iaw_1-n|QhcblVU^IjO+#RdMu(y?IHUgq6D z$J+fb5E{Q3Jl%~+8 zpg)NIg_E=~c4RPapY4tPt3z;VM#mj&VQ=J}+TSnQ)+ ztKgshJ@JzW4QyNF2lt`<(1kM2cgP^DpG7`N>~GT1z=oh1xJR2MK2)`N$5;)=nf-UD z_lwU*)qC{$zNY`Y3ESGWS{!S9|BS3L*W>A=C+(hw@6pa{z3dSo`q$;NpTgg5CK?k1 zgN;n+zjEWA1>)QEM}g0D{-+tpm^OiHVFmlt4Tya!gSLuqQ*^+R`Jvd%ekt2DP@9v=AtW08L3DjG%!jLyN1Su1! z-%lVfclW0p4di;&S=dhBY#H<43Ygm#=Q0+aHvKTfq$6|jnlK0DUFCPRWDaAy_gZqj zZfEpuV}sGAT*o_*>!+rdD(ha>?)(xfj(&!DOSfZ?jU!`|lEWvwzCQki*VkcNuIV?C z18S?gM^9eRZWuCZD&jYtz{V3_A#e3vM0;<=)B*EoTMt8r586@2zNhd*qYoM}r_vB^ zgDnx`IvRPjm$%SP-<~xKdkf~^NHO!L=%cSbl#S~BdOM zcH@fmQ7+h+Jrk$t-+4;E)03xbap`C>b4uo*Dmy^Yh4wO@zde<@KJhR7zmjuOp5zaw z!QJ`4K0v_m!SqE?Ck>_?A|0%s<$*^hQgEbl4oq4#fmw&n^ttTERqEXu{>2v6S}n#k zZ0q&4*A&bO##NbdRl$Fq{HVpY-n062pk3E`kwNE=KEjy6c4)+Tb!I+pQLqv59tsqLx3lrf&<=k(7|w&rlG!bdw{!ALh0c+$rl&X`&x3Ogla7Yq-{Q9euh`*Y(z?lREtCpI6r#cWTRg zset)dw&yZRs=r4;`D4U!4-21hnHXt49lhFGq2q_`=?iJ3=$wY{y~muw*0Ar{1pyMtYH$`R-*Qv|VFx?ecOwVtnl0 z{k1s1JB2)+aT?l1>*?=Zz}zi2=88v68;hgmNt7$9y}cuG2K@w{l(~~I-(dujgQw#7 z;SAiZP7XwAh6nnXv_@CjfiaWDQeR*U zhP=Nh+zVgb;k;i>!2q-N^cl3Ip0SZ}h!?f^7hM0>_}B4v)m~QZg&OKF+8TJlxrS?f z%)jke?p5~iJMj!oc2gDnJ9O`XO|!hQH9QcDr#T~h$Or@vA4)s>J$o;M8SLx>ExO6u4Ni{!pXEOa2v>&2IkKnqcUPz`qy3Xfcep}4Eq4l^$AMR25@3s^F6$y-! z#!`0E2Yz%#2(spkRs86~J9nbr(}n(uX*j<*694+45I0UNROrK~l_AzIt3=KDmx|9{ z(fq7vWOt&diY|kzco#@gwd>Mr{9mt9^YLQMccN{`30BLI=(1 zCorT>VdyY>%uZR2a~#3WYcX|DH0-*$a(&hy#wI$^W@tv6 zfw~=ihVAKN?!$Eo4n4YKrtJVElZWR8O=TR0Ia$oDs+2rV(n1Akp@{h=`HbJ>&6iUUDFC2zic zXcuF`&&k(be76~&(r;URB$fUq!M~a>T}4~q?3Q5I4>YB{^&Y&e260V;7yk6ga{T>= zeB>^iK-&HTZ2H*X$nG2T*QznEhWKxYQSGya)q0k$7BKNlZ$3ihm>#Tb7K^T9H(VWtQ2rc9y^AISYQLa{p312YB)|v)?28_%kfp zb_@Y&YvJG(4l5gbbneiF`hO#3orZ!}j=A`5^z|5hY--2#abAC~6xEKd+b=~vt1^UZ zA$Y9G1&wC3cdEVi-S6>rzpPKZq2%I9Y!m@=Y8cnjrcz;=zAN})f6)Z^h2cMNaWDY-8gSL zaY^|=A4GAaCsuk+MbZR&WO+}fADVgMxnbDGnEkeBU*yl4Mp(?3+#ax}#?fCB$~8#-2pv0uxial& zL#u1Y+R;B~+=w*LaxkVEdvQ;N1Vr1fLweY8tjK?if_*PhaOx$p_ufNz!A`i$O~J6S zZs@_B^A7DgqV@ZYb^c8iiwX|;ZVl7=c&t08>MDX`!E;OA-Y_FF5il!2kxNo;#XLA<{PZ6dV#d8Ylxb;3&D;B+$$xHYpK2X z8-{a#6%!b|(}eGn{e<3uA?2l6i)I+i{M~7Ndtv^Bk>vl*C}vEim@%o9o=%9fAI*5& zB<5TB({Au%{K}8MdM`v$-x=A_nDTcZHqGQlt2opbGy4vMRU1P@GXLfF z)jYiTdJ8@y4V zRiC4VKf(W-@Tq^U_FkbEUDK{#<@2>Qh#Oqf?s;>s_b#!e>65y4?lUY&&PP`r4H!`8 zZqIo$U~}(p#l5UTu$lQyCwHXaA>)QOn8$UJ{;>ZPoc~$u zci)4_o$Zu&ihk0!r3of>8b*DsrSjW^4iy`Kz2IGFO-FFFTRf0nfnzR-?d*f98BF{Lwe}Z)Qs`V zHvFHIe|%rNci%<#rcE)zq!WF^R!EvQ4lDg!kU5cS9qHfBWNyNG#tygA$51rK4{1)5 zV8eMI*`+gb7^|z`nv3n?Yo$K4WwsvztcIZ*{RV#aw)98k;?w6F@q~G~dot&uWEN#j zfFG`I3qy!oKhpI(7-?b5b@#26|7B-07JJL96~B+NW=oH!zZsivrU?!E(reFMq5l7W z!@v3++B=o^i9JCY$j{z{!9Dw-Eyu7O=c`Ba=88>PHkWo!+-w|P9)Z2|-&8RlXg7Uv zmv=AZS{UY0(H`5MF$eixUYOjmC&n4}XpZ$GS!nb-Z51p&|V& zy<2vHa~FHW3=GE>$2B>7fA4+^A1=hjm*6?lCrsa)W*$uFsTs`i1}>%&;7Y zPF(jLILwykBd{kUlD>>U?!)TGz50A`ntAIbOI={llzZ<9om0L|7(M|zN=`G*`guKF zrylP93mG8zeB(33zeWphy#8OjyWw-$D&L4Duy@5S~d&MBeaVxSC zuaKWTN8*mV@Jud*%~)4-HZeyV`e@X>2UI&$@lWdTui-6kwwTIwh`IG)**9PAu_o4 zRr-+CNV8duRHYRt$MQMNrT`g3*I<0735>0oAf%@o%&0F~aSf%#hX#}bBhZIfPa2Vo zUDFTZgy$6;nQ<8vE(eigmj^#fKk6{OiO*(=?xp-z{$7n{4M-c>f7Ns}g{PArn6&SV z-o1ywo;<=gel_BXFJa}OmsmrYxpM0(WMr@E8p^2De?gcCQT049|9h|f$ z?=fMFVo+OSjBL{t)~!0gXMhduW%~T6+peZhV^YuF=*jhLp+kl;PnNbZef*WQ4f5SR zF|M-(j2SDRKgynKcYU}opEvgbrhnCovSL91s&|B;S9|7*h#frH2M2f5;4-lu)-*y;FL*F27Os!n#UX;OQ_;!BN1_!Cb3Pdw(ABPhGDf zB7l2;)8|HAu`OgeQ(YtDzvi$0eBn`6O<=Esy?!@Vi7IN8(=i$|s6sK+7Vy#|+j zE@QvTacmmDgIF)d;-Tx2He?M_xMxoaah|GcX@Ys4Q+hd;^TfMK1G?iO`N$Zy8iAJc zxEDYN`lbfJri}rj`ZR-ei$)mJ-UgN*8eyL0T;vW}ikyMVv1a5ZlutT{LmpRf+W#I7 z`CP$j$IS@rtyG)s*C-PYRuJ`D(d0){@VS zQAjX0&YA_so)+lJy-|V&4S4R3X7lQvc$enxVGgms&7kN(8;Ml>Ovb~Yw zuao@NE=@XOg3%Pr>65}7v|Y%}zmFvD8|ocbh=C)V(7t&)(us;$jc==%f4gp@*tUE| zqYarq1F<?uH#fARRb%olc*X0eNa8IGQx2?!#Q5 zR^4I7J#)Oecp{^J4pOXAk>X>8d8bFp%GAvW7rVz=wC!~dHM7xwA zU|=kB+FfAHeXnFMUv1pYsNZ|`9i-&guJ#G!9yZ-*CpAUjz~S6GPS$q$kNEqV>HtIcggI#6{0!NA*az-K9EdNl8dFsoqfcin>-6EoJ#m~a*r$$@V!IxxcAJo5UyM|TQlw6-V9cWmDNfs&-@Ai(13T5m z<5XuJJMkQ^rA(THm8Q1DV^~a@d zyfoa(_^4x5r~8Rc)tWhXCY^i0X2cZCh+Kx)4Ofs;_6f3bZXw>2`=1WWrY;r&Tce>c zq8%geYfrt!hItB!<6M!S+wH^gGY&%cNNE9XRS(cz!i)$VWD zH+--5xgqwI-$uGRfBXq1j&xM=RD9?ctD4U|oCS>e`cGqgejx20Kcq88Fr;l4h3B`T zFR*vZUhwT2j0Gc>A$8Fyq;9?k&xqArFKf*_NYyVPW30;c`tzvrc2(zBkF`0~@UPN< zT+{TNp49E<^kJ;ieLr=ak8sfS1ox`iMvNCCbvXI_h}DXok};h8eFS;^Xwt*DB4kW1 zLz)Y*OnV^Jb01Q?_Ol&8s@Fjzdmdz-%mE~N>{nU>-yJ`F9}=eTMWU)ArD( zvInVbnbWv$3a{n3RAEHtQLr}|j-}%kWB$Mp>R}_%zg-Vll14|gv&QtU(=f+^W7Ine zF}>pu-zOEZeUgyPF$=St1It!jkifn5GVC)cS6Xwd)Nv9YwES;r`ndl!Z_vg|y-$@5 zw1;T_c5Fl6(y+R^C^ znZoab;cYXB``=k(;o!-zYGy?2%ie~~VAo*`=JZ^IIM)(nth&WGXBFkJJ=(ngp)y|@ ze^Td8n?tp4i2a85=+C>%jqI`H-opvor&ZuuU=8+B$H^aEL=3G#CUKrYKA%qfr`nRw z+Y$4$x6@oIiT6E7nL)gJ@8iCo#Pp2)NFe^>JoX~NgXefH)q5{8{D|j(eOMZ}pZj1) z+gH~D_hPBv9xV3WgAC7INOjx6SnN*5Q+FYAN)?8i*kOdxKrExay?%5aHrN*+Z_E;e z_4B1qpcVIsYsq~Ey1|!gV;no#DmqfM#Uf-|FUNe+M0ds>W_I&KgynpgvgXF1c2*c= zG?F?x*Q#->^~XYgoZiG!^yx$!e;L14mHSsVZh~-Idu;Fxz$zC%c-ZvkewM9~={#An|4yt7!C$^# ziM3fSiVwqSG}riYjn%L4{{}2;czjd;HVik!zp~zu@7C_u@89%Z{d3yA>N(~_FebU9 z_$16bnkxRfN!(X6VXQm)bG@r=yY8@TYN*h-)J2(Y=7xxVNk|CUi`2p!nBW?P_FO+B zbJdRHsISLr^VAUY+GqVa)sD3}Z$({y1Y=NZC#*nq@Kx&0+#`8xG17(?Ad`5{BKAec zNgYkwmY7d>p&sK&9!+#f??Gf9WBd%s7O7afh%g@&I%A z0=R~(9fr2;gK5SN2NZ4`(Py6D{B}2fXJ;tJz2zT}5oCyX|IV~6-=j=mUJ&ijq3wI4(+Av(mUdLn#_iFC>jeh2v_zt$?3H|@?nT*Bfxc8Qk|K4KMp1E~nH zp3XJht(5qj%(wVurMGNlfJmDuT;J}8iG#UcuUS`AZ=8$&{U#Tm-A%#>3&uH#fvouD z^#3r|Q}iGD6V*J=H}hu=f6@yE^*`$$YxtDDA^v~G|9Ox8{l9ly`#oYu$g{NFPtgzL zI>AkeyUJLqIWO;^Pm8Vy?iq&2fs2tCcbfZ#tV2gbu?08>B0H6_YN+Sb;atPJ+N-*~ zHYd`H%#e7O@H-3cp_el@6XydjW1G`HWQ`<$r*4xuq7dmL*CCBIXzDcX-$1R`;hLt4{KPDabFVo`l@62xac@ul^w@dWh&lZZ9N8QFQwmhl*iJJ@beLV)-^fS z|19^_UQ?fcRYIC6If^g%{I`7n7ez;KZ&fAs#pEEF_Tog#0rV#_Hq5c<+(c?Cy+fZ7 z>jrdj!(5AKBn{0#aGyZ*rv4*18$}tr+-@Ewn%bi=`LtjEFx;5?8Z)_eO~zQUZXS9 z_wd>f|JwZ;jn%|}ab$-%AF2UzhAHT;nT?T zQ|!0U=B!e68(-=;Y$?9v`LtcreD`vX?*q8J>?l4h7G5uSRk8Y#yjhyU%avY^b&b6H z74fU!pICoE?7rZ0`c0t+jSjS4kA4*XFEl{fQD}k3uS!%}_?qwkZrcgGET+AXnvXeS zC!>4owv1miq936f2DRvkF7zFbFfzf$MPb;HmkwL5=j_NFw~Ps4$ea{|wvC$8ulO!( zjfb!XSUKaf+;^Svbs2ko8u)Ge*PoAubRc|3_WHIN;E0&Wef*9*EE|!AXggP!G;P8) zfYi|#>yZ08w`c;-5xp?WsSnp)&V|!(Gex%8GH!IB>JoE3UsC5G4M@}Rf2~*XDR|ae zeZ5E@x4(5P_}BcO+I_!;{f2ZD zVp$Kv#WP*m_f^Kf4*&JXw@&UhJg@N~Ri~_*2j<4n?h3Tz`eWCF*yOO2zIys`XxAo> z+K8knW!zttJl^jheRl__=g@b_mQ3EiEO;-DXCB5UMbzU3yW0*cO~I}3a|Pe3ZlfHN zPrqb)L7x4B*FGmkKNs9ne^FXFkEK=cv#z~l|BB~cN}~=XbfVCd4(qQJ{x33s^rXoG zkq5davf*pWqR)$2A826~oFvA=y<@~rFot+vy^uNm+-GeF>w1`QPtm9eW4Vt-7;Ao5 zQSW&VeVez0t8owNO%qsG&l+Zo6IizCqTpYj2DI^f`}o(N5AA-nr_DuKKVtAyEDYX( z*%ryjcZg@+&nWKm)Da%TEzqgihl+k`-r_@y?QMeb1Na;GAIzE0x@O5X?qNji*YbZA z|EeEIc&!fWC;#u*S9Bk~|MGcx->?0j4dp~bn$SMi;$O%21^dcAT*SZRZ5*hmR^niy zhfg$hpszXw@lHkX@?Od{9g^#+uTQF2{%^-zov%9GM|4`z2}1gDPs!=Wuy!2dQS{xX zkmsk4W33g}T{^sz-+Qar7d=0TzQ}d7Yj5NebF@XjAkP=fzfg1;Vw^nqrC?maI*)~S zSDe5XJ5J-PJ?HSvfeZNda5cU=dIjGdzlQHm*5HRzHTeFFwCi|%?k0Y`aFhKFygtju z^RG|y+R1D9?$~8~$7jFYe-2;mK7&_Pr&QV@y{X@K2rr8c2vUpdniw|dQn=VQ`N#cu+Mja8^s|QTU_Z5C*>5SPn zLCUxZPga}$oT#$lZFBOrXXL!(mQNTPj401iM3^sP-KzwQ>t&9)&RkPJYdrUir(c9~ zCVP6y+!?oQie@ixug_23Hs1Q@ z^?8oSj}GrQWo{zZXt*CkfkQd-#|n`&iZR;Ba!}%Nd@!~D~SbYaSUA|SuHp5UuOZrj`8N+R=(}f!9Lv?dghj)!u>UuT5 zsE!}W{1`N80k7$qm^+#|Ph5Yn+;bMJI<`Z_(g0*Fn1uGt8k05|_ix@BNfBJ9e~P|N z$?@0hUGe?saIf?_--_^E4WAkorPt1B{oAf-_^&?qG4aoL>1^mXz2i;q()j+H@z3}d z{Z?C6R&foX0Xj05GpKJU60DbEk$W))Sd7xGvHI`%OnuzfA7jD3)C`-+JmJ!52e4eQ zPrpv;82U5ChfnM$3;yZPNu+(7#FnhsxvafL>_6Kq*eAbL^nCJIVqSbaU++4LZ;uGx zYw*(rVw1Sm@Ty?ETJTSdU;5|`jn|0rZ_i&xihnSMnfF3bN;a`C^rB&(J)f;@q>rD3 z29$OSKlA&3;dlIek?*G*`Qi8#e6#NyzNkD&*+hM-=m2S8KO1}MLzVNBVa*(T(-!Z; z)2eZZV^te?^eKOZWZpI|r5M`~DzKx~vaea)x?O3~4 zzZZYObTeoAHuoS;a%x7cL-M#SNONV*4RJ4iOle7s)g~~0l}JBllILF5u-cEu8_CoAWiQ4AAj@d9Tv=-k$~k#JWOjlmkCgXZqy=e*@)=()eA{ z|4e=AhZEQE)!sA8Zx;S9?Ntfa7epm-U88}5SBdwH>eP*SHR0T+b{X^h=OEP86JgW6 z5boi}I)DA()NeRKhfn1?#)NoYZuN&|nq zb{7wK9mR079?JZBjv0rq&RtXSFS0~vN}9s&`CU59|9qa`tu>K5x>k3NbisRt7G9se zPQC0L=|J?NJ@~R@KMDiqGRM9N26yhveV8MVHOrN?SPi*<2=~xozP?GbHq?o@ew2FY zNMr8VKALI+JpyT)8w@T)n}c)P?D>zd4gKJTxi2h~R*vY@+>C4ybn zA*yFOw)v!BVjm0m59x>MlDW8fBnm^#q;}9d2=JKA{r6>WE9xa0zIC!d*?U<#_l8~{ z+qKWWg)X#vtIra@#H@VQp3$!TUa!d~c}~N>!uyXsg}37jC7*K~ZQl5P%+a!6k1>5* z6#Y`euzs(P@!vYup3(fA{n}U}+iorL$J3uVn!3J25z?nKuZDRGNz7A75E>xnlR{4+ zDe?l67P5Z(qDwfqOn4{toGSX*4_+Woy`k#g4Y028vno9(d|!A!udBxm@PG9# z9_>D=@PFCA&(luD|4&!%;77_7krOIyu_rBwp7Zm0(t(D3UH>cm%RP#0_(+itKa)OQ zpQLWI^CWHceR#IM60=5)gE`kpJJ~QU%zbq_GY73Jaqn*FfceARVBUgjyNG{d=35VK zZ-9{8_?c%wu{Ex zfh)0QJpG}QCt)=AW7;^^9Uq@d#HMUl7_!z;SFXt}S$lwcDsa7*ZjU!j7t(ZXO&)0Y zd=qXJOzNJOW9{CCy{soz@n5Gyz3F|wdaj{<#?NB2$ol-9)F~{Cy1Lp@e}1jE&etBuV7z~?>C@&+Zxr>?eeGPQ-9`4~)R z-l1iyPOQN=j<$fBwbUhDPo_$It6_}4xECj4v9Tso)LfBC)l)w`}?Uog+_ zQ2d=bUv15WS4a#?rLXxNt_iY6Y~Lirj4WXNX)o^Q^uCTCsB-ab82_#F8vffd?lZlI z7uHNrBcXM8Jo7?zP&3!!GcY^rurQqL# z{Qqm}KfheN&+B*a1E2f;l=w^OPvY}GpA-D^Sz`YeT~l!`GU3;9p*{^zCMh(--@|u) zx$8LV6+0_=WL@d+nLUbYCQbXH2iFzlO%3Ay4xti%yJ7 zvF92%cZ@Rl81^6kp2A?tmAMx4A3ygT;unzDvnA?U60x7Spc*R^&*Nk6 zbM=exYkk~bxK4V|8tH+w@za}{JVV)_*agJvS9>lpKjHxH73{+Og57wujyCmX#?UHG z(T2W>Cwq^xPJK_s|1S9d^2}9ycj78uR-9z++(CR?xCakb@4$mKJMjr)VBa6Qq+nmc zHu<^W{wH0lk9X3F*ebPhg2$w%Uqp|i?fxgqgL8STL*I(ExvA@SeJd8Hb>OZKFphLh0z9mnNvNC>sk6Tm#!5Cx9iRLu)6=XjJeh{T}Z>drVBO1 zzcydeE6>ocm8P`&(l+Yd@FF^TdUsxp;ahmHR%hz6JSY{M=L}hgid6 zZLf#P+H?AN*1N9ZReB|FNT=s(ek0|&;9om0_x%^|Qr@S#PnAz*4=3{gglIH`2mS{4DKft;soE z6W_~`xIET(_JO~Z>>;^~^b zxRtvV6``q!pD+XdgY4khZzw{BI$#B#zqF)?afU1S=?rO*v9h0t=bwn{dQG7To?{&1 zC;lI4`uLY;zCLn+wd8Hkit%C7W~~(;e~*^!Va_#<=A5H$ZCJCfts(afHDbLDBjy!# zL=Wmc-Fc63Gx{!?wqcHGbLMTS>)z|*zfK<$skL&p*^|AT3V-54#b?vj-*Ts2j&oln3 z)WOryO~dDEdA;Hv68fkwZxow^^mBoJ&uf>sXJ*U_H0M5u*5oA%`ov+;sMWCRGp!!> z1;^Sr)yIAv*6XfoGDFShly$ljyE!3$@=oNAE#iJOr3&9q6McucPtajs@UJwX2R5OL zg!$DtwB|B-KVz}fdtM9v$>U!W(}Mrn{v6}8)Kh+7|1Ej!H`GQOp9F8tv?60$ubLlo<1nzK8 zo})2&@V6O5eWQgU7o=89FJn_oW{a#pTeta{JyJ?@WmB=_och|n!eEQ zB<^;$hVg)F>`Akv3uzKt7Wxnx_=(qFpT0_2a2;{eeTZk)BALuR_rkcgYF;ijF~+(n zVlg&GWMTvB@2!uJmX1R5+`_quSQ{3P+!>KvtKtRk-jmR~MMpi}FE+5s&-MAg{yf&r zU48sZ-szC;_K4!Ty2XRCu+Y&R)B5*h%@?T=Is?zIrsLG^x#-Z0`)+hL$FAZt#3pOJ z=we<9uhrwv3Ra0*%|5Qhv<}PlKMVGMjsHu(i+}1$^8NbXtNX0-e%dI4e~}@~cL;C} zq|W&+#+%q9j&{ym?xozzcz`nh>KF;0>v+62Zt9r59sjDohxJgnW-(>V8mw^K&YBjg z-jfn?O3`x^zE3^B7W+a2diYNw{;P|x;g6Sv_lvGW+z9U3g!jKDZbT>l`pR9ry!|mg ze)=`{ZT*>be*cW;Kl~NXfBZZ5@B1ITeEuC?-2Du%NDD8il;t-<&!V*)t7(7*RTH=8R}39y>X)_B^jmnt*vzCbDV>1&Rn zx!ik~G;nM00(|{A8+O!z3^+FV85_8cP~G=Ou-p*;8oo6it$o(#=USYr_8Q+KSg!qi zUi6k^aeEvG|{0PrK{sxb}`yV{}(?9UV-~NN2{`nu)uKqXv zskt9 zC%^X}|M?I8{-1yIcl-xG@b|p>%fIn4Y4I`XckLKX8c37&zSeg9NtchdG1NSL=TRh z6uOt*Lz|gX1tvoYrSW*V_BO7|3?__ zu%0#Qnwzjk@#kN|gE`uP=JVlX5zNPOEj8ThIzhii+T(x5zrNR1pY;&JyT)ODPtpC1 z<#*kz>3yB+80LTpM_4QW5d6m9PcS&68u|q#&McgLTV*E*EUcX_DeGy2W z*RP#-uHMk~fLxRR1^@CniH#jlcOasBuffc2X_&^^BB4G9m5)bp93A`QJ4)XZ_aW2I zBVrNjnkU^wL<)OYr2c}-JI>+JA!6jf3EVqz0YChB9~b{3exAL>-aa8 zf!t%{$;De@QGf5NSFiEs&0lbP_c25b9;0%;1uOFRO72z@UZ0JT(Rgs^TRgt^AG|gC zKK*-T&ix*dJ>%~(y!Mu|@J8g|%{x4J@fOz}zr~gRyui&XcW{6I8T`77b`EXijNloJ z_52JKStq6~V-6SD`yoS`)Je~QRRzErq|GMtVyQliSmH9pVm#PWxj&l&&bS{Rp9D{z18?sI!`wz0u z?AmD_`2A)SG8eh1I;Wjmbin>Cmz8cduF+5s!+DPd-|r743r4tCyoQejzbEMbQTpFV zHgvtO&3Skiy{`@8pWh?AU;Ik42Anwb3*zUbqhiT2j61IY?l&qPyGx2TVM!2 z4MXs#26g#gztDDI?2kt~#&_}e3wJ0-9M19>g}aPpd;IYCT$#~7uV$lf%lm%g?|lFJ zL>B(0?EXMrbm^}*`2MHgaF_cCf07fe44j6htViE~If!k_nIPVQJpuz4V|$Q{Mc5I- z5zHQHp)puuKN0PT|LUxDScz-6)R;D5zojwESDM^nEavr`!!^ysu$Je)SH_sn!~OgC zufy|??lhM*z2?KCsW%2RYs5P14(#Q_deKwd@!Qoo*t^ObRf^DuQnL|uu05mn0d#(n zhjlG~*Z6T^*w1?|k0%MP6>lMKk4yfS@E-&I^I>1|3pjLrug#j=2GWQ;qAK>uTyGXHx_OSz}vp7__XAD(<0Qxb2nXU_%PJ$VIJA3nvEr|!Y%UQP%v$TdBVQX|CBuNANj24Y~dy{gwH&pO^_2b3pKwkrR?8M^%~=3au)vn z<-U5a$cpiID&Z>hTeK(h%bxaGeVve5)`Fj(y}|jv-?E>=Z;ZFTfJEOwSXXa>0rlIW zZMm9AaGru~L9y5|X9YGghBSwJ4x1P|x?^rC;s=aFJL0>0XWZ+$~+3`_hPKWbv|SKoF)gdm;3(EWk>A+Q0MFRvgrT! z@K2dgK2E_t^}U9FP4DZy-{o_;_-CxA@PE<&vx8$;>)|Vy&_^?d`@Vt1zeTfw%J(Ds zuQ2={HJ41e_U`@uN!bI7!*vu zBKBWCdV;?%{=~hoP3(zgs&wgOTPNJzdJIo~d59N}pHfENmpKYV!LP{oSbtUjUGjGM z?fTmD;_X}f$aUb{pKtKWhBh@1k+ZX0w$b4T$j;uK~mU@3IvG03GVLv4F z8%&M+Sz$js^)A#P_NNg0p~QY<`duvC@+T4wJj2T4k8$R=SGZ5UAehnhr>^aFeB}e( zKRhtj-*T>(^xyn(<~v+qJaXFTaQOFffq50lLHPu|o3y4)Fpjow0>0aL0DoM$spLTH z2jlY?%io8-Iv4+ZgUA3+k^A>Np^xbD-*0gF-d`Br$Br=v{V~*L04ypsU>(+IWM?0M zT~ABIj`#w{Qp#eM%ja+zhX{?~m+Eh?MB*L)sA$bYO&dcdz&JFJ@MO8-A=fE)0CZs#QCK^CXq zuncQR?ZgR%f5CU*_}Aq@$9iG2E*JVa^to{SYc{uzdt-gCV?S4hh<|xb@IO=Zf03f( z>J{NF`oBvex;3@S<-d8?OIsHUUbDQ%+O?I(vSwP<=!pg0voWJ5Ym|)GOWYIx3i}5T zNWCAi#DIP3{je13e2$RBUl2;pGiS|jh~NJdiASDe>EY){KK=}+etm_f2EL>4uXxV? zihND)>bQMNo&WUb2l$?O1ksK@=um~V*tri_o^b^ASl_=X>*?1nUY$J&cwbppvrpr; zSn3^wD;xLW?|TpNw!m8OA>123pHBvq9O!oVTil@^YyXXVTz^e5#$yPEI5?wQjYin9 zcq3-Sq;p^REBt)O9C*!M?(3Vt&a@_Cm~-5bzpHD@wpcMW7U@0<;8o8?)g7{D4brLR zQHbas!Je^NZ8BpS$h&tM2QtRL?)#Iy%XXE!VLa<&Pi{6FU8}WWU!@+o_|FV>$Afe1 zF~4IH>KX8#m9kUiQt2EO4b!sAha{J-)Sr7@(LKZ3bG+p8Jl-iTpie}R5&3SKjLocEe01LasZZ&(Xo%dq1jATz_!$n} zdWn|>bgt?L2F`vM~@Y;ZU+3y<$S#5?&-hTo-r&VTun^5j5UN8a%F{6Trj z*}NatwVT1Lf(e?Jt%87FPB^*dDB`oX!lGVD>`ADJzpk@)Y=M{ReZF?WX>}W$^3#v;Nn)kebPN z3d6p!%qW|e@&CrMl^_3<1tZQQI{!WV^Eu7``HRZiuSWk*dD>0RO-CcZdIfA7d9fCx zRv#%(2J&z&*GIp0dDl#^ukE$eE>;!6zx?xW z9EnZies5#OZheV<)p{ebeHt>m>_AF~O^7$o!D91FENQm}%Q|gEro|4#u>Me&^5(?a zXRvMA4o8=-R{H?P=jFHjS0b5x5 z!e3YCpnpYOF8<#t;(dMBA@1Y1rl0FG)^qg2DvRw%Y_kpvTQ0}KR?D!+Y#CzOtU!!e z-bm@Z9!Xu-qgU0w{M_eoHt))P-18cK^)=wX#J>oME;qV7Z_Zu~tD5yOvYQROd-h|G zWT~|_5cZZf7&&}0*6%xxg(+(>fxgeVOV=Tqysd4Ec4$+l3HzZgL7*vfWXStlR;qz^ zRqLWA>loIfAGHPhNH$_E(W;E66MwFb?}E73AIs~)lY|4*DOMB1yDvr{o6YACf=83{bALBH?k4s9UFv($`}A$nzZ15M zoQHZ}_>Se*o1|q*@$kFi8!mRNOC;Pz9wf`@BKW|hMqx+;~^~RxfwC-S8+Ya!s59ZX%9q{zHzoI(;vHb6utD&B~g>-+mQF*e+#X%{saG*REH7`?uh=lItn& zE6ZL;UhMlYkG5}w+ct!bCjPw-V9K;hO?!HuOfUYwY?$jEfF^>v1;xgjLW%>*#0}Qs8crk9x+De~1_Z zCJjRw)(SLlXo}s^^OQK#F<;m$a*z-Ie5~VL=3E&l6#p9cQJltL`)W1i#QxQCyHtLc zyk?~H^W&etZ~ss1&3y{(*-J|P-a1?-$Mjx|aUSc@yh3}m|D)N#?{ohT;lC>DcaJxX zq%WHJyhHXV?2F$&BJLJK>E{e3?$w~5XZGsu@NSG(1MbY|bR4Vz8ehmgSsmwl&#b8^z7%Z!NNju|9*f(v$p2!ohhJOAXtF|L&Mm*9c zPsNIm`IzN84sJ~?(TcJE^_Umjyh;^V@;=VAn}|^@2f&A1Xlxq?jBY&;X7pt>D$be) zEe5e?WqE~veZMA;^XT_jTN~uQH!IVeb+FPgdB|q+G8=>r>c$?aqWfKP@qZw3ES^7D zie+=0l)khw?}h_Auc_yi`jOUZL6J?11u4TGovF!=uB)&rCa_ak}x7fGiHGcfzH6Gr7 zgWn#$AuoA@tLI;1W5z441tJ^ouxil@%{3{N}_n$qu z4`Z#GU`1FhTskls7Y_yE8|ntMiT!GKZyT4P9*Di z8Ttfln+-$Q*u8LO98s_Orp!aIWA8&3g@57yk^^}vV+;s-~6KXZE3+@9O>wY;2guT z?eYseW(=7zuQArG#%xIOe=27E^>0s|LY?yESYxUlW)0knwaM?0wfqgTm%YZ#8?v^D zvCMND{(niE=jVkF9cS+Q#E}y3Tm&7skJzPp2Tbu-7Rxu7b{zKBJ`&ZpX>^}PV4fu~UmH~2{#l(Az*t|!cBI)#V zthn$3D=)poO3usAy+qPCe4Vdtz5EQn%R2B@^t!AEGV*wlj$h#<3ex;X)`};8KgMVe zPyTJ6pr?r)68yj8p8Z>Lop;!|=@qV=e}!8&U*VTuxE63e^UW))TSe@rQuoKb!|b8w zU{Sdj`xbwR*g10*hmmzf$xQ(Qln?j(Zuxz$UcAJ~UE5i^swoE4`WVj5K7nV;k1@2> zN9<4iF-Dnw#@>5nkQHu*?+*pw$*=41^Th;2`*ff!TNjD5%oWc&pqIU(-KjEF%X?A z)aE{kDLk#G(&pKT&UKuq3v>>oVc!`4I(O9e6gB*JuGkSXyRaXaBjfx>(C0bnq>AMU zrT!1){#I}rV=mVJPTup1y#Gb6{#R=NeVoGa7t`uND4teWD6y8s`xi(7>Ok{{@rhPoF_I+H<8T1MMqy z#RR)lED8G#>Cum{YROAv(FVv#dxfmzS4fY2g=JBHV&TNg7-OBvn6%FH9eoZDJ3BnM zdsoR+F3yecpZlBv_wxAJ-+$rQh9y`su0B?Vmcp(jRd9G^EgZ|Lg9GW+u{pLp5`&79 zYkvyA_8+l7WfAfnGu*yB7k@oijhvZw^l~x$cT2A$f>HZ&G_v^EEe?|8$0F@ zUuIpmE1TFz=NrFAJEn{%|EEztnBn|7?&bXYvEn&=UFm*#o_b#&A{SEoXJz6xnDDo^ zD9JUJ`#QZ^I3RrNZn#*^VZNXA?9IczhJWKVKwmor{~x0p_sVCoA7i-qeuVpko+a;XY3Z zG%np7mi6pl&m0fWPT?44IbF?zOvj;XZ9C?NHRJnAGRCC@#tt5go7b-^oo|eDO4)nQ z$?I?4FvsA*RmKVUFlVqH{&T?$FCGrS%iq1opNHf5e}?15Z$tUm6OV8A#ZRYOV^3;z z%=apSknSI`R&F_5J2VzgALd})%)ZR2tAXT2DL9(B8N25$#@1=kh;o?#hX$RwM_r8h zoL|!C*^2!XI;;9XUQKP`ZRUu&tdV7`!;JZl+~-Q4m*L+Zh=`yQaOt%Gy&JSesvq~8 zgFUfn{s^oLaO0ZerhNa~7L3HRJ4o&{~A}x zk6#`C#`F8w*Vcf%`d5ZEfjBmPuY9jD{&kL|o-^_Xi5!RxynWqiw64_{Rk@x|=-3(7 z4co)lZ8;`;Y)13)U2-{4?)sRI18LkyyN;irM-^+#uw;Ha_kBaj|HG$VB=^5Z-LJ{O z)T{^eb-qFZ@xSCK{hl209C4I`w6o8#pK(5?n9H^M*GE{i{V;|GOh+f~2Q{qA-sF|5 zbJRe?dQH&D$`(UIq7b$HB$j{AePi;XUDu!E;oq+zu>^u~EmqDT69&#LSd`cF@$18f zSe2XtH`{(_UauaimMMn{tUDt1ki@W-V{P_|jQy!uz5?1dYKUPD4%o7G9sd67uR?LI z%Yx!V{7(6v=TGk9!S^Y+akvW}UNdLxkUegl?1%l!+9PXLJuIEf`uTp9kQ`D28{?Yc z?9N_zcw;c-!4vl{bi?L_)iA67CzxYj9A~!=!P(6t;oA6fa-F8wz*=1gQZjI0PAv8? z_F=xK7CS9H#iR~|)Pt+QT;QhkfqJ)RJ*^TN|IuRGG@T`On~c(2)4G`S$K;V);pe*@ zoon}IU9vvN4j#-rm!a4YH3BP${gsp5v246E_rJ&E&F?8lU+9jnnXB2elQs6UhOEYA z3|Lk8&*T2O?$>1_SEq~4&o>HSTI9!o-6Pch`ubvwd*fpr|7tDBCl3YJ0PVL8=-N+R zgJEWExKGj!gE~*dROYJKw3t8)6jQGW{xyG4p3c|({+caCK3%mp@y}kn?mHCz!)9Ja z*mC-Qmfd47_`8_1k#_H~H%K@}894S*;a{+yOrF1+`@2UT^R;~^(9dl+Ot`Nv^If-pep7LbO`1vP~ z{=mKOHshz`199)$26%Gc0oRTVL}FlVjJ5of@y#EhSDlYpzgfmdu&(zJ`Zr+@#SR}c zFTWJFrh#0CzzXaAUPY^^O7)c z{7iJIDe*&f;nb2j@lAVhKcE5X&`&zdl=x?zEbSg@d{xK3=>CQ!n_{GG5<)^wz^3D5 zIJIqu^vPb#NAtjz1*5QL#!x=i@SjEwbaiJW`+p@NU`Q8LD{Q#4H}hVE!y9zJ;MH)f zX5%%$@Vt(HO=je?+UIkz%+KV;_Xv(DPa6NxpFEYV*vM88d$Qn`!;wFTFx3XP1QBiuT_2-&}2c2tNMiT=Y5!W%9v+2 z;-CCy%B;(nvV!`b_zzvqnC6{-Bk_db|FwpH%D~d&FR=NSSJ?aeON7Q}pkDoE{63AB zO8%`Hd@SFgk8=00oXkI=aq`@xv7$5u`1(pn$Eq2))IHL5Z$ z9PEqx*BlV#S`Id4KSE!=KWBDZTtDi8k(L$U>opd`2DqVxCho2HA+;WZS6w-Q&I6*eP3VhrC`6}XC-0ZHW;A+Cot4CopnCjAZFws>VDe1 zQwC#u{5WKV4Q8B$JJ$erqz8K9!G&o2=Xx}3*sq{8b4X@}#HhR%rP~Fo3jYSZ&12*J zDjlaX=f{2?{`K?dSXSpF{*NjCpMQNYKA-Wi(*L>)7|r@xBJw105Q+0wq6YgJG-Yq& z7}tKVXPqzizS9xTob+xDJ(WM$_?qc5kjIHcpHTl-(eNK8_^17=^#6+cO8_fO^OpDHL%uo9*QBpM`mFh1r5~TiMDFKu zJ&8X28uNBNLDc&HAp792xbo8z{K@(duit38TIWa_{>f8B1_~X8y_TQji<~@u^a$Ub z|Calp^H`6h16q_Wj)q0q%dbjNxYBnS=vs?0IiI1yS08Z?iZ&*P%uT-LJ`?++wkY`# zT9szK&2k^3E%Duf^3bWu$FQjW5r$Y4$ArGs;oPt|yjwHBz3#_I7+VFu-VDdyl=f&{ z@k?~9RRNK`iy_6YHYW5gNq^^OjAv!acjw1xmC#LjP;nhkM#F+scjGc zG5aua+5D+yF32J7S24bS-R$8C|0{z$n49UrIstC9LA>$e{!*OW8Hk2eOQCk9 z8eAv0)Ap7AUxIxd|D1_2eH7#^$N0X2`@s7Cm;M=j?GQb#Y*vN;JUKDOyYaEUF39IJ z8RGBAJ(jge<3iH&cXQ4$v}@RcKL1ZKb$~VNa$3Q%VNZll+=mhUma-06J%irRI8fpE zXI=Bk)~s>05|OUk5yH6t@EMm7mi~acpE+I`_YqIu=F;QT|Hoe|{4Y870$b^4jAoyf z>eb~t^7a!nJ59&u5J0{}tzM{Ea)m zKF8zdVk_k7ahTniz#tkw3#$Bdig zW9rP#CS_5b^-QXN&YWnYVZ!5@U(nb7zE6F{A zG4*k1MK6R{a8Hap=|F}x9$XoWkv+>{l4CDyn$wJRj*_r0wmoa4OYO1GSqt|o#=L#0 zc%L{ZNzd)ww%G1irKaAVf>ory@+ z;OyCGIPIe^-qRhr94JoC>)WxsC1zN#zNhmx`aky~Eb=`0|9u3L`$W?AO*l-xBm9T> z7aL&tx!3gH+(QS;KI*&moFnbLx^M2obN+QgldN6zYu4-egnq)3_%^c*oZFT|Gsaq` zdXL4@31gT`{1qzk+Q_KPnhyG?LYb&4b$&ki7$%>}pgd3}YEvde9_mvb8W!XFz%`;3 zhnq!3oY+boJlO_)tAB}^p4IT{4Ijizs)9+*4#=2p#rS_yM7Y#}dD-%4!~WXAmZ6x@ zD+(^nh*QS8=HXwtH*HhmxV-3dDnFZ&c&H!#Cu#<*n@`x!y*$mANZJ1qcN5#;{V z{VT|Sl12&lpN7W|;xNvwy{h{&%+Z^?M63Igi+#aA@up)~=6v{9Tt5%{A_F@9^}R2d zjXy8P%Ky*vzK3rk-JTEk^1P0HBmC=Yk<5~>7CB)C*U2x?hJ6>LzE|h~OPJT|iYb%0 zN8f)X`;q7057Tvs#?`fT!L*bqrpo@8!xjV&--D3gZr-o=Z;>`zKx# zpRbT}?JfKlq@hf)k_BW-)90FBNnaE4X8rlRInPHcH7olM4&nO3*dneqGM1jyI9K$Z zr~oFApRHl$Nq$%c*dqK{RuNue}a?K6f~<^6V0ldu-A$O!h1|WnALcM zTKKX*nGXWZh9j)=XiVzu&iW)K7~Zxwu~rt@)9NEVqB%Lo=NQqx8}rj=!IHh>q=sNQ zj`D_Cj`hd#Tm_Db9J-7sxu7ga{VQ27>QEl)bB$>H)yJ6Y+Yv`o$6=It1K2k&iu1cY zv4wW>=zg}`KVF29tvkSv{gFCUu8&rw8e(!we}uFOL4U?^O3xkbo@v;xR-_7?EoLDs zZ1&)#@U zXCKqxVZ=XcdrBRL5QYE$D8FX{@xSB*{XZwE|G)Va7QG$SxpZHWb}r55lZWqr!oK!i z`J9|X@K&GkDznyI<9EDM_)m~Ehu^#O)Egw8;`ejyi6s|XwEGF>Z~qHXoBm)-#&4Ln z?pO5a<%1@rKSPU3U%<3%JxnqihMHoHWEGR zmc!9y=I|y@uftlu8IwXVYnUhNH*59dwY@^AiC6eAmI;xEN?a$@dcotWJgzSCz_p@J z(@Hq7l(}_oy3e-b@gxwG$Td-`{{x62rxRpdYEL9W=DI*I#lBNhII|Hln?#=2?V zcy>D;Thm6OQqj-Rq((h#%05oN%uS_djWMQVfEY8zu+qiU>&7}>9T%ei_0JjWZ{zp} z9rJ?a4-Mnb8vi!q_sc%OfgM+1LmzH&UURp0&5-TyfyhDK(XD|60w(T&uU!sf0?ie^ z1Y?Eazh+Uc#inyHqc3~73}yVM&p{RUA4K10MAk$4J6|ds3jUXV^9D25o`Xq^`bv&I zWZUX8pv4)z&xP`HAWbIAat~RfzI`e1}ln$5k8 z&(Wq@MI?-7ydPs--CMPQgB91&fa7p#6V5vG-|}|s5%)R9b?=L$v16D!Up#l;!dSKo%7Bjf zf0{*3L=I&38`ut;XH155jhft_E{kisZ7{5RMI=v}i}jOZkUAoQ{V_~nQ=>cPTCkpF zV+ZDC&<5sbWsgg8TE=^9#nh=c;9|P~{adzX%^`cG^H=)2a*vm50OQ=YFBy-`F=LTV zJt+83^l?SZU>DZ7o{a~L$LQFk8cJ}_bWT{T;t$H6EDZm|mTqeb{_^CYaQrLm=i+_fxKDzpPuaAN9zA%76YDg8Ervb&wb4x%Y-;Z8P|e zUdz2f?hDqk&g--Q&+;U)zhdZZo+DupL1|cG9mv8$e?JSKd=`{kix*`x>79 zi)oYT+(yT59>Sg`PeL zALKy3FZ&gFf0Hf)`aa%&GaJi~t;M&^k38K`{w>D2iuzJYTl z^LlqD)9wu)!sk55e>^eIg*JBZP&~aIhn*Qds6g)1qFys>$T*^69z^de{ZAP%*3G&d zpyjB@`as+n)&hCIuIm*C(sjSloVPY;vXiU-|6lMgzrlcikqdndklLk=eO**6cb_Kp zRGo_q?)eRA-wJ)q1|vA^7)IGGW6y<#iU;YuU+3O}SIf%XG2J2!Q|&h*cnIs9k2!#l zCAa8*xyu-4#{Ljz@xp)3yu_eUGt^#g8TwE3a|lj!+{<%$$C`gfe=Ku;{Oec~{L`my z)|0tp%r7%wTfSE?pJX)h$pD{UcKRi39sJ-spgg7xu8KAd8Y0YZB4&k0VtQC4!pATV zs^1{E)@z5*=6x{P(F+p>c)-`CCf3Yr$y&6G0UI3%9}6p``;GB0*wth}w{7&t`R9Ui zVJrjkTG#rOu{O*f0~@zOkNRKX+x1;B%&H>$5{ApVVIpdj|;wG{^Z``J}szg6}FWNoAdWh$dV z*(#{Zxjy$7%F|cnSjUWYQTo8&$qVBLxHDe7CN{;kB=4?*B<~OmG3%tTE;`#-?-#_s zF>jM&ZRCAM-ft`q^7nPBU6HZJ6Jg7`Cp{Y$#W$-v!?k^R_;vR{Htk;v?u85Pwd<+r zf`+^&LoDYr9`OnS1HM7GR`!_Kr!(Uk*k?G(oBO)r^KoZAMJN&@|Uakb$K-CfBD>T%JI(C-=K4IbH(w8TC~BcNuF3a(F2ov zcSN_wy)h|#AN)pc=DoI3`zqRX)~`2xd90-}q8W82dpw4D>_o`m9SCOKAOFOkF>TZD zh*$WhEb;=?$vQH+YFuSR>rc)voNxQPl=&WNnne z{>;)}w_mSUTxkO3E z+OUphQX*2~d9#jxTh^bAA3Bz?64luorX+SHG>2*BGUPIW=w7d- zy8hD3My^YpV%6Z$Ap}#WTtL{Y@6nU{7M`8V6|T2X$FHVua~1im;y%LrssA%V1|ySv ze-*jUD(e0P?k@1}-k)+d8Nc0{kHLLgsp~u1eH@PMzeQcH@p+y5E1fR5Heg%ByaD^l zHW2J>g0seKzQa^RIOH9t=IWXj>vww3E(d1w@NEX%<5)C|N94}o*z?(8>Ontc+wVpC!^;wQ{uu0#d=blwJ| zY^osA%a6Ts{ZNbhLYi#q7}nM;`8z8R=Zm7E@c8e))!!v~@PGaB2WCY^q8#%PCM`vR|Mb<~Taw{`na= zy3v9=XspcZC0_rwtMW?1Iy%Kl*O*b~qm z0W*$Z%#dufF5i|ov3m!qlEw2zJ|wAmTr8*e*<-eHF8}{H5?OcEF-T z|3P~zE$+gY14+#1*F2xk&|!G`^l5I~jo?ILaIP>GxoIudsO9eyek3xW$$@YR#t+nO zj(O{^FsDH9FZh=6#xOMer<^GS|7Tvn-rg^F4eDspkU3Y2v1?f-b`k$6e(Zs0+7FFN zSHQ$UIAfWu(YkaIY>uvvK(A^j%ly4+tYaznK>ChUD^eZ< zO~)WI{4{2ApSxF|F!XP2#=Tp~Wf{!)(Gkc9XFR9D<`w*B5c89Jb)c@ZW*ie`Vxl|d zI=W!2c^~A24aK9|tN}f`tBQ5D?b;UyrOtyv_vd1IpN?MQ>5_xqTe+guj8NVfMB1m>H0raJ${2#XJ5kJ!52+g|G#aO8n9wM z?dIrYoY=gFHSTv~XHquidjzoWdMn0nmLmr-VJ>h3#y@<8y{lW}`UyukwyT4zIjQiq z8le22I-irjuQYQON)xAXF^g3HCF8$KWcwLqeY}qkiV?$FOu4>xX!ejT`%Nxz83&7s zjPExqhSRItz`9ilCG)b@i0-NJMLG0sJqpw3oWsJb-_YNF4r{uasvO>I`m?ji`z4lH z_INd)kH&juI9apK1N#k(a6tBCPu7ochi~Wp9M<%)2I0mx0Whu2{28t>vsr`d_(9=5 zI^GMJiQ%LBSqFD?_sajfUdRcvhPPL+IO_Qs6!SGv4vILHW)J@8zD1Kp+EQ1 zD=~)Ln7c|1Mf*lW5pJ7K%Qe574GlABAD%2aVtSQTI z=-5@2gZbvIq5|te`(XBh^N8K}7=zqn(7kC(B#pM`UXCZZy$9CJ8L9j{%HCBzA2+1< zI>Dk=HQ2RmgzO1}+27X_VZEK;)}$+Is5s)$tyzc;@68-{#%8x_k8SI|QSlBsmX)3- zX7tC0X+!SZd=8_%#$(a!72LC>e^jvcL3uIYop!Xu2{^T9#SgkKPYhJGf(Z!8RHo(MA(Fk$e2!HDT0C%nd!x1V%f8uUbW(;|0#zM;aE&5+DW63r9+NDbhBMSe-$?I3Iur@6VLH0Aawk#m`)p}J6 z21;=6+HO=hlFmFw3eT%_d;#n$84%omtBqwc^Kt6gJp6lFcE@mw-f-$U5EqW5;nH?j ze19Mq7k7+fjh_8DnY|u|m*-#;a}FnUbwqR4Rj_LEDJ~rDjoa5IU`X#~tP{iovOy=LPGc>rq{Fy;{tEvtgIx3P5*gUFWh>e?Xv$ihC6q1^4kV)z`#_Gg z=!YnKU&eNtpk1}1tnt8HJ*&#u42Pf`QVoqDnb?0N+uBK8VK+NX2Bv8B>QvKGsFUxqQaHnj(0 z3hM_4viD;kWgyUlTxk4J%-QfK;u)8@ly*SMx3Az86oYc)9da)MXH zZv6J(0e=4RCYF*rw5nB?`waBUm#E73e5Tg_Vzh@lSvxVV?H*FU6+N%xpV&6&eSH?Z z3+|1FJeSSi;Yj{7qE|n7v#<4lzIHf!JQ`Q_c;N2UCAhR}2(F$uj3cXZa6EGj_k(iC zA)?^X#F8@b73Pksfv10jVQ;n@yvP~%W-)H6uRE&H9+JI)DvZT%SFIV^R&R>Foh-3q z!)83Zdk=ShX8hr@(4-RD6867xoC-&qV5+e&oTQu)kLW)`{7# z>|W88(nm<~8o`qR-=a6Au52U5#R&%d=u14x*aBnSFE)W@7v%934cGsGf69iQC!qAZ z(K&QIF0;b6{1(F~h<~jgo&o#$_&+~mSf6wmkhswJxhqh!OnJr<^1AcBRA6kxxLzHR zLpv(Ydmy^iZGoX9lMxwx4X$10Qbx2jUtg1}eNh_2+JqpKc0iyT{h`EvkmnABu;-oB zv`Q4;3w3YGnJ4gM{g{env>ZLrd$RV6-@g`XTy}2Kl>D;}DsoRsb4MoO z+#YXSySf8s&Ys8NoqKV7*M6MZu^)RAGui(=obfizU{T{!99+|#biJ$DYG=Trw=0v?TUziG5ezC-&(Ib;G`O;n=k* zMAdK;-7mdcQpP#6|F?vfX1@+&=mA-SBu~EiNdnf z4AFG5U`+6Dn28;wGq+qqKh~lXKSX)j3R45-Y4Jh2t<3l9*w?YD>vUZP@^Eg9dBd@A zAPyyO#Ji4tbxxjJJ+FS#`!XQ<|6soF=lewl=mXN$1_KW>oL~N)gFC;2Gr6Gfk_sGh z?aixKVtgF)Ls=JQnoBQqYi5b@5xWsK^E?KaPUd|or|yk#7?FdPWt(Gybs|DsssBX= z+{GT=hR6k1m_rA^5)SUzoAo%$!?SZK{CJkNLH<~b zB@yh;?l=hhSMNb=Xf*o>H(?Ex&-i!gJ|WF65FIY^pg0_lD^SO`Ems4fy}jsjn}Ok$ z{n(?kn34-!_9dRbVaZ1DvWdc?tXoJu@dECCiLhv4hJ_<+usW3eDMFlye`jn>oq&@k zqq)~R0-4nNV*6$Vxnq^d>-yEeSLb;Z4lvyi^P9+jC> z+^j}jtX*}8x<5bub^oW#N4OU@W#U|v|LSY5OY}pPt$_IXt5lA8uCK@le@b8Tv2J&M z825%49VKJ5r*(W9@SnS$@Lak)E0Gum>XXD|FK`E**D!NSWl~wJ& z2(@3U`9obP0~|qK+Yy!cquP5)B1aJ!NIU-)vo~IZ!>9-};2wWza^aHHd(xYz*cZ;D<6rc@VJPey_`dM|RAOI7itr?(kt6!waXcou z55v3BvS-F%d>02; zmaT!nepPVi@_4*_oPdPz&gjRw8p~pqW8WI)M30VOoU}P>43;IQD8kreawE!gMgD!Y z_;*=UZ-mK=DbAt~H90s6{n~V7e=2=XS6ds(vd?b|_Tm_Bw*(2BA0qAKQ@D&?1Z%VQ zh#ftUxw|^{ov=P?IL@AnWo?p3_G=Vh5BX5A2Wt!2FpjIZ>hss4WK9gH*%@~AyP;jB z253^U0yfMWgS!`|qBr|2i5~MEHYpeT8b{Z4rp%0=q|b0A_l+7>t)=d}=%+>|^^n7U zc$&;mR})V%bi69rDGdJx9k1mE=V4zyE4GD>e|0{7UO%5;Sm*ZotX?yEkN#en74H}P z^Yz?w$$J(4DGTyD4*bHN#+T5`jCId=9fX&NUT#&f9BWK6c91!tyHkTP!Ltwg+W28E z>l+47Jj%KQ5_g+--zssRtZ#Eq1iLUd#$_wlf-MMf-mKyyVwT^cFOsndN(SC2J-+Px zODx)Z7ye6jz%zio2S-f7fMKCO`V(xhZa>N*1*|v}U&=WDi!U5Lht0Ta+GHvC-STM#EJ!+PKw+(UaVTTp5 z%dv6gZlo{DL3Ho}M2ui;xu-AYj19rE8L`;3G!q%oJde8vY}?ev%prAIlZL%37;7cE zzas0=bgt2dc+5e{zDGzq{ui7^%w&wZ1yafL*GzFij?(?Y`8~LwIU5(RvyNyi_t2Ts zl^yKP`aMp}>o8G1DZzGi_KmMstRfnfs=|BrIfhzU;?AXLES)xhy@5W4d4uLym#OJ~ zg?)t)!HEpwh?v~E?hN-XdMbNF&MCZ9;%IhlJV#z6STbNt@UQbG!*hyn3$}HRPuwX# zzu=GGq4++J(`s+o@S3jkHI765&+k{CQQSv34}Tl;>NOeQ z<2|wt+~hvMEo^0Ok4tZ7#{C!J_5Xx5gljYBwX)i09Nx(k855W*F?}TVZ<_&kTMM{& z%}4a=-!O614)UZvs&+(Kb??ZZ*rVCjbTopUHXziQ_@_-AczKMap^6V8-^UGUw(^a7pTJxTt?oPss=e!?y>%y{yvTG=(>NyjTgu|ejbV2 z4{{tp(vAa2-n0ic-3GEwRB7f#g<##zeOO11zjpmjB+OXMx<)?e)~F?_^YzrYWSq;{ zi9m}1aPHO{r?>3Ew>g`!eL*t(ySc))T7B3xFA4L~pCW2>NBr^geC)~@fmyzt=nw9K zh|yk%3JS*J$eD>aFFZpn;p4=@sk;gY# z^ZYvubzx5tzE`tfv=}T0;zsQ^5r@Y3FLwftH;yaw7W%t^XZkJU5_Cm0n7x$Tb$dQ1Q!B z7|_Ot_}@hQ%UZzUw2`?2TM(7-J(5qpR2bHExNsDmrx+inp3CF#f_>%BH0bwyyk3_F zo%3)`qwK7`bRX9J`m=6d16Vd`!@ig8V9~HOYh9F~zlJ)o7;A>qtxq3sD|Dw%vPtC{ z=waR&DUtKhhUj(%Vsv+F`0nG-s8&GJuug^7wVS!ntG`S>$EgOE&5GG=gYb->wB-}jd1-K`<)K&rq-LT zt-GiifyY@VMB~V!Z)LELB8T84Y$9uAlBbFtBl0BYDnVa~|Cn%P`zn2Jggs*%%CUx5 z(dn9A&u<66um5xLZ@|6cGQwj7<1#33B1h`He0;>8y#P1%2HybE=UC%!onjm_((Fh0xzep9z$(fU6y zZpbF)lQI9AIY@$k+1IN4Wl3`4;RtbAk5CtKASDNs0k_SVG3#3-9eAwqb7EZdwcuI& zG&-*JV`JZq@o^e$0W}Pt(RIGq2uXZy`4w`WQ`cbH(hMWJ*ddWN=IV$9Y@VHp{*3Ff z@5~%_>o3vQybCtQq+tX7{K3>^4JuT@qOe)$)7}D8gTirc^KPsd6T%ulJ#dUR!0F75 zII#Hu_8+4CV%3MXLsix)B>$;c5q)YEXI-7LST(f;j%VB8=3x)qIpu}B-#Fv;iT?P0 zmnDv-G)ID8MYyuZU0v1#DkgYh-Hqm@TEWF?9;PQ>LB@@jh)mg!0nD3@Wlhe@-z?-l z*hu7rJ7X<%{+e(X>|E}LOE;F{>Rsyo!%>W1U~Dw^09H(NVvW;kYLC1ddp|8?jP5kc zWOy|h%{{fow9`Ik4AB?p(Yhw;v7dEy#(BieTd8b7J;qtbz0Ajnec9it!G2AGec{D2 zLw=i%SDhMdNM zKD-_Y{*RLTOc*?o@o%3o&c7J3KLk;|H({~cex&-JXRW=P@b`>mZA{iaqMn?}JmE~n zk8D}whpVhvza~A1xx_XIn7BF8nv{0F*jL`1+LEM9+~I-M~Kf??6`oRusP!^`O76hG%O9xoR>%aCKk5N;%|i42HO zNX>kYoGY0lom@Zlz-gFqZ*-AQ1TO73jpbA0F_yg$TGDUr>r#~axy9Mftuk!7S|e)e zJe?ttqapKy)8oFl0?Q*EU6&i$xzx#gCbLr^T;I3~S}j zOS67ZU-%BqK+?en$iDFe<04nWzE2-yuAG4HuE%2^_ouQVoUwW;`F?~8wk3_lg{yJ6 zb|)2AeoVsFMAmK#;%mgecUM!j$5^+x32RuyA<=d>lKSn%@&N}B(<2M^x8>Y zjY$V!o6k#h%VPTkZ%9#Hm=Mf2a3}h%N0K(&#U*zF<(>MU*2Q%8**(4K6m`! zZ6rixFxR89($`is`eJ_nEl3Z)hK-qzuzlMbY~KTHkXi}twO-j>>r_KB{h_i39N9b# z*Ke)BO4g0(*JS|0VhMuIv{+gJokev8rrh&SURS-(;wtcF2oVY zbs=QLcFc>tjKrf)6@~@JN{~ys8$`l+H{7S)gbh#+YvpgGl#KMRg7`?3e!dt|E0^qyjFd5Y|sp29X!#hMjedh z-e^zi|3+1+VPKn1sI>7K=P!JWLv zow2(;P^ScILC`NZq{&z;vDtwoy>}qNW*3tB?!gMmz{>vnFurv#Oo~)c`n(1I-sG6o z)Q3OO4^Eve_~#JLlbN~)=FONVqWrdb_!kZ(e?y-x5+iqAaU~sVx%Pt*_Vm~ES?BJ$ z-K*Kenp|l3&*Mn>@UQSK7&ojf2AR;;2PGr&o)3Mu*c;?MJ2sqy6*+*cVNIDg6ls%z z)v@=nWBY4t+xZS#cf7-v?QgJS&s#*#-HRHfD>LVX{dX)|b6=ggbF;ni?U{I7y|tXN z%d91HQHgc?IP}ti44df7joTz0FEh> z4k0@8Hd0Q#L>hfP3eUu`uIrbJ9H?Q0eEp}hLj=tpnWf<4d zl6?<6I@%$A%q;AUTZ2)(Juupi^(-fpK)?1~u_umwfPKR;g7>o{>x$GVT7tECSTm4z z!?K{6nBh1CX5}jI?`n-HLq@@GkUP9s|HrgkHRZGSv}l5yIU)4FWFUR&QY`R@L|Dgh znA~~<9P3)6vFu?J@4_EM@5fDxwkG(H_c$SWoEKFtH^!3^3+Mg+5{nI!Ch?M{+8n%wi(9O z9dEH!J@*_QgZ!0Ws7aZxv0$(b_tjZ9W_b`UT~EffpO#^5HvN{C)bXrGl70RO=Eh%w zy#;;y+`IWdoPBkC7T4D9J*PcwX=!nHEACcY3KVw;nvmd52ol^SxI>T-H$s4f1PBBY zAh^Z__Zk&y6nXBm_RN0YNucNZ?)_u`X5R64=2>emUj-Enh<^70<=yh=-`th{v3<;| z68`|_0+ELX(r?W8(Ity6W80zcC=0!UH|ap|??XQCBUq=6NNwYGAJT#zvQ6xxUfjRy z#%qLUzD7by28Q z%X6|j>)vd{&M6DfwNgD)`6Lfo&4e?esA8{?ajr$upIj|_T&11laN)cG3R z8ZJO-+A4%DyR_ML)I-Ve!mBw%HqrQ3aiFo5Z9K<12k3Q$e>vA2njVz?ZsOfWlNOmQ zHYy1n8nsmaxlVz)*fHxWq7U;OMalay2WjB28r*)2Slg3~y2O$E@4j^^u|L`X){Gg< zTuKk5-QI)Dhu(;!Ow{k2P8jXB89_H$lOg;8Mhx76dc~TP|BGGK@GBQ3R=%p(4r97) zq3`Li;VTmw7<>rsv=hx9bqvc_-@x|hAK^nf5L>8^*hdBTYS`&O(}Q;sYIw-;T%KYrVTZHmKMf#ztvaez>%ECpcf0q6% zH=34ZTxqAy*xG*p9d49foFQ%OP5H;2qJ}KW{zO3>u4W z6Dl$jD6yw=GQSVFRrsRJLp=}8VjO*b`8|(ud|NbR>FJxe#!!+t5 z4ve!|jeAdgk@bLm1St2MiJF6;#q?z@q`lL_nR3nwWIphst&=?GA$foLcG^QnG45>; zV+30>w(Vp34RW(K&1CpaxQ0Xf{=}guAcEgC@-Rmf`I+!Ee$VKmZxBh^*f%~A&NW9e zzv&~@BV^XZ#gu<9pd0gSB(6=K{oP^M{cBdJi7>x-@>rc4X~91+spNFQy{x})aG%Do z;8g3w2JhGW-->-6lam%q>?<13*OPn7$RYpB@3V~c*|shKrE-7HS~DMDRJ(bI3S)g* zz9SitvgEtc>yhOD^3IOLyv3{;J}CBCKFW>%!PKtJSVNDtHjk0Gd1EV5?(HT&+KV&f zPb2zu#^9mz_-&sc=<3gKcaOx^HHRvBNZXA??Lo5!yOLM8XJ5b4D93!OvYZzebZUXKyS^dc zuZcMSMi@{p7pBl(wtUzK#?n-09ZuGunob|_Fn7#pGZ7ORi{GVO8-;l-C+JuQp|?6; z)Wfi*i?MR?SsX~Ge)aS>EZiIl2kM?%mXAeh=5E}1;zNAz!L5gTaP|BOgsgH>ygy`x zBkTV!M+UK!DHeN&Os>sU|U9aMctwWD95liJ#BECdPm}*FZn*d<)KL9o65TS zwwwb*wv~B4TIPdbzSr^R(5^&FCEt8mtP~nEo-_}!uWT4L{LB1p(1I*QhU>}rpOcK8 z)HWl*u)>^)!<_gx?3H$Yt+8z7*MeiYj<)?s9JD@8%@5qKmzwWqTUuy9(H5_z=KzW0 z6TkB40i&q*v+n8_71$5!EZ+qu7IeWziY z<9uv)T!;<*sI#^og`VW$Zr`xZVey8jpSK`3PicwRy-naXrvL^t{+RU%KSCwe%&0;8 z=wilc&T2amV`~q`zzRL^Re|cXspM93oZv>=M@oF0pY2X9TaU;! zF7S5igU+?etGT>ZzG_&|Y$NC8G=9U^#6G_nzoUVDeq-Tn{GL%J{*|07>w&*xS)bkX z5lG)`BPYYK-`O!QbAZ9S3_Tz(btCt&wEHXGFBl`g7VPH4AGc}VukmlgFOOB&<}nJx z#HzN@NG^dKr;as`)4y%!>+>wjYkO!10#waat%_kM$K{9}xE*@b2m`><|PQC@?xrNRpR{ggo)mTe8k4ofhd`mj4==Tz(v zX~BKq0nF^TpLIysZ*|mBEMIgH>;3Lwd)%+Iby9{%WlnnrzwZOUm-w&3+||8qxe&CZ z0GgJ`jh6YUU{dw&Si_o!+eXesgvU-K(5H36KUC%XUOOCv6We{^Ib{hJ^%#rE^#-D2 zv3h7!ARpFGZi5qh*vqBM2drJ5AFWE(qmTSk)|e`bhRl7d^?6y8B<@8Yl(+@MzeKzE zf4)E!;;{+m8IN`B8IbWCj@)I9_N9L4-=YsTE*OQx6i?iF=BIeM@ck@eKmGOdR zN$iIb`w6VUoOzenmwobXABw)^i4%U*XBG{?sP^?4M=deCc`%`lJ2rPc$l6`s@tZ<@ zPlNvp_D%c?&zC`-C-Z=esAE9b)`#d?*~n#6c^UjJ@}D%%*Z7yE=n7?ul!Vvja3e=R zc(hGM80qG2^0T^6#qBo0UP$oH;nZ+I7-{l>LrI!u0ToTXUxc? zQ5|sn0a88mcgY@Zwwo`7=hRCA@be}tl5%)0pBb^ zwZg1f`Qhi}IYzvZ`x->< z2tY0u=0%fW5+GCj|ZdR~SfN`Id^Dri&?s!Ze9f*n3y|K#cK3v^G(5I;bbH@7N zc=RgVdJ;$*jxYKBUWNaR`;=+!??GJDJOnRyq>p$QdEqkJ*NA;?xAA_`!G#li&LzW? zUQ?R+EcqEH*Nc5T*R%?x-f|2PfiD#QIut?v&+lqr-=qP-y~4g7|BK1{6j$KK1cjYCOwQ<6rx~ z)Hd^2>v3wkz8Ci^U7AZ9_BG#^C3RoHe?t6ytX<@Z;<>*-QS#gQt|8Qe$R`x$sVAB8 zkD4cKm>2BBt`}2>ii-LjW1Lw>oqVt~d!TIG}q$U5UNKD_R>~i9lN#(c7e6|Mso zCR}@Y(|=68m@z~%`-QOB=VwDaUeRmSs{rwm`S=%%RvWla#tYZ_(E~->Q&rLPD1LHD~x?l#FfK`8M_e3oUb6n@7;rS zPE)Bzc10c9ecP7%3Qu){G95n+Fr__xacdJYiW z8$-eDbxR}u47)?dYt|Gh74uXHF&JjL9F;U*G2c8&)#W; z7>ipje`%~=8HXdpe*`hD=SPiwWd~I>AlT22f6<4-_I-=atp_U~dxNT_5FX`@__zfs z7Ax)UZiRipe~Qf6kM}6uEi_;bhO)lixN*x7e*FQCJzyWNy;tDeeIuHb?t#J|6)^ll z#8N)$2f|MaeZ(F^g{m>Pdk{u^vzmNAhiWmHrt;CErj_6scC1nfB{>;IWdOPw=R&0nYkdJXS)$`UwpL(uXG%FgBH-5kg z_Sjg$F0Ydb%^=&d*u1|xx7#8-!tCL)eCD8w$T}3n?~UB*|o~I zsP=2#&v%(Yx#wiyH0*Khi?6GeR`%2?UsS@ZMys*DO(0e^_s0&WQ;6LEr(LGC$^WJv zpm{%+QKSPIA_GMT9Yp<2d+<1=M+*eh9cafY=>aTuPhwl} z#if$viNBoK)Z1-K6ZgXF1@Bf|>lnEN+COdmuT2_~^Rpc**D-0sCjW5TKjHsO+&#Ds zpH80?d+-#i0?(~C$^ZG^iE}IdMb=UF0nUk{8_TfCLfm$k^dk1Ny}OfG8&!0Pf8p!a z)p7FDQk;%kh;#AF)qI^oeK?u;7aB+v9!LAe<(pfv+)9%6bYa6hC3v2ak9gVA(HgKOo zBk4-#71?K((u*%1XZ#XlKl?VU%=hwd<^mVO_&T$(wp9>Tw+c}B-%R=EQ1A=I(+~s)Gnd!*U*YH?!kTC#dSu@}R z3>w%R7n0ZDEM=jq*VocVL+q0VWC;FKI8sI4edL3~;foo6;DFJ?<{}_274hHx3Gavu zxH|izePt)sB`vRdpBi=u!v~|~43U+Jee}7)K$%?mFtU~tTGED8HFt3|DNv0z$XvAF zFuteyKx`eg2(f;YeZmjp#<>d^)vGh6_5F;xZ+;}6EQ-Wa#c(1pKWpLU#-Mg>aX#i4 z68!cvc77`+HFiN0_E(WyF2nX==!C)-rN(%T{B_X3{!A>LbsYO|e2?fm&oOtYFZ#A) zEvebVarxQ~>Oet!4?eUFh%7_=ne!)KZ z24zV_BdbSaWZQb|^(#HU@?dC{QCQQ0xNqT)RV@Rsvbi7De#8D4JHIDCdy9koMk3qF zdiG&_YoUQi;b$DOj6VLBad78R{L_L8_rmw{GB&Jl-Ma7^K7zG)tEufS4r5e&n&SB; z#;jP>ShX#MPwPRvS}|;27hU)N4gcy~%iN&v_fPnj9(d!17-o`yx-ve z+3~OEgQG`YG6!H23X(OtJ~(>&M?~NH8S6G*gmcFYXjHNbW$rwR&l;Gco=m!kT^Ru2vJzETeTYZeFL!A&d*9)U74ndt<<#;c{_b>RDXApi^m^xz1(#)Oj zyahXalW_FG@9;cw9YcCgz&M8<^d+)>?4v+rJ@!}FPk(6OUt;vrWGKGwg~ZhDIP5!x zwOFSkIb$bokxnv59~pvwzBd_S=TFYu&f1KuSK74+=Qife|NB$)EayPH`(kx-gYSEg z23E?T4CFUIm6)b4(6oPQn|AiOz|QZK%qw(2ACIrsUDm{_r1T2GerMLg+%|LwHV+tx zntAi7niZQE3o3bFny<=I)qOL0vBsfVnz*;)T+2HK-enFk>^vs^MfN8hoI5EtAid8n z=g4(zw8VAwJI8(Xb17Y#y089ymU%8yTqKTxwtwb5dv3d-Y+=gYZ{rcd6Ab-G<6rE= zS{|~_0ZL91+3^tT+4P#h80wEu7Jl$(DfsurrasX)5cr#+1DiCU z?Rxfk;63=KE*KK>J!+S2pz1-jC|4ev2MxyF;m(-crnSn2YEg%Efx@mR{Z!-1z`q@% zf={*2TnY~V5&y(`PW+26LE)d+HR!{B?f2qe(}YO}q6^rb!6E}CQ2(7XX)*QR4^f`= zWj3seSNf0mNyPSJdp9}oud#0|?fQWFO}de|p|Id5==fECrN5Rbk_TJ1jiEox6IU}g zBk9gg8x2_TZ{UI7{;@YQ?|30-k2^*)?|kftMF={7Tk+McdlE6OyC<5LlG+^kRJ^Xx zfM8z_;mLwcJ%m@6`zQ|_%lF2ZF9*S`_GoN!n2C;+t6{b4hxp^$VXR9Pk5_Lv-X`FW zmqGaMeibYlnTx#{KVV<34-}7(xFs2CuHiO`W$NEx9&;DYU|;6X*vvSR{=Fw-s`CKa zzcvu}fy6v{xQYEVuBVIKW5d4C0R4j*TUqO69}2>|0-n@B3dEFZFOwWUq6g@UP|o!5#Hr z6LX4B>vh?$juH7@uglVuc@!NO+vR#T{;%c$Zr40sWBq+gi!Ahx48-S>8t!Wr?m%(o z@RZ1vAB$%0r%y}#B-!z=-Uqj5$Gv?Hu+xF~QAjsR7ho^msi)Y>wxN1=mC6*xF0aW- z{<+ETn0!}cpzQo#(}G|^=J{LCd~o&V7ObB)f_0~dVAsU$Cy`11=3&NcgmMuwQLK_A>ag4@NN_dj@spHpQz^$Nm@6PM5&%tl{?8iyipm zm$i8Q;2T8j%*{I3B3ntGpfL>W^O~I3>J@1Lr#9=b-X{g2cYed{wUOxBx(~LlorKie z-pHaKOK_h4h`KBF8$;$Xc)rLy>c4V-;;rpCe`y77QZ|%$5wR27WF1rH5noptc}8rg zJ7)E3$vm#l7?1D~ic$YBNMGBC8q=}5WgvOJuMPW(|H~Xe8A!(JwjnB(J>uZsrVeb? z0}S4;{a?nCaW2GvDDhvf!dFWE=~1%=_P97@%T?qRji`~cM@x-d) z^|F+0qI;S{%RjdL#Io>q`)}f!xHoJ*vTngY{mSq2fhoSO?qeP==a|1W-LG%0EtgD}Om{p3yQavXHE6-VqhW zzFMx=8B@ECeHE)I8mLyjD7?L0`Rysg3jQerY0S$~d3h()v3-(RSn>=4=Tm5JL*Cg66uVrlE|2F?Gu`l>n zG{FBZJRn2p;STMb#J*dPW~?9a8RL&XpwGS+dbON}eC&7Bj&DQdFIe9v5+R;Xlx;IY_>{@_wLdHy{)zqQ7$6|<396T>q4>+72KBLbgbN%SHlW4uM+b>ybGqRc6Wt26MJgAq5}(kSZKxO53_7D@K1UW+rP5^zZ(N##kxUn z2HolFscQ&5Xc{oDFVA|G`fud^i)hN8I>I}^*_mcG- z_*XQ-?U4um!j{3YSl4^elrYRaQ@Gomm8c`!OMexcld{*9)rVb!z#2h90pOg4M&3ihSD$ z$F=Z!9ao{3HvVtLzj+VaGxI)<-G(U4)GybFam^Xz`-Ti8a*)KxYCS-ByTpkI#;v?U zw%O(ZnJ4Hw4D7CkNS~y93EjxKW}s_-=8_ghHc)Cd8-U0 zvXSvyYHL-bPoQz(O4O4-QGKd)uSGdV%RI6a-XQTv-&7oisr{p{EB1SAiAiQW-)O9y zL%k+TbQY0!gx?#(F5}y=ulPP`J%zR}Z3i}N!F&fI<8Ub1M|@lS&ndL?9NayTwY69q zl=b)W{3jRMb)ATLYZ5VY!Wqn(a2o9zIJ2fhZVdi%1pU2Y_Y~X*(Ed;V7qP#-dj$6H zdz3%$X;Mw;MTsK(ifZ6XoMK% zObIqcUQsfR;9lX;paU(V3-A4(_`k-ZO;;c;g?B5Tg2KP7+x2FBZO#Anykq0@=Ci!R z|J8OrAFm~I!1?(5SjW27#aK(eIOq0x(}EOVSFs`@1952l>-o~q2Q&>BJVVJue6P{O z{}IYX-gA=3`$Mtu>u~g`IGDN`?K12kRHa&Te9C#CQmI1Nv~e79z&f+UL$ct4*iYuS zPvN(}dSgB99Im*+7y#j!DN1f29dMaR8n|?0Gktfx;m~U`wjO0It(a$U8yvv?SVJin z7f_hhSkFlddb`q>Ne5bA(A)L#@>`CP>vgF-1~VLw!YA%IRy%JZHLbE>q=ehf{Zio zK5!0}g+9gd@Lw@=)+Njscbc)gKGffeGA^SQ<~P~O-lqX-tZp5wbb{T}u24>WZPRVV zu5ZJ?VBUs%{XNYk@qg^(8@Nu~Oq>5l>6QL->6{Eaer6SLV9Dwp#MHj`6hJ zpZ7A>vma}t4LL{Ok9O6FkOb5(YxJXT-;}++`F@oSV8(ssv=yj#CUXFX;V&`f1SR{B zzZ?qu68>msc6=^_v9Oc7`WiGgROZcA`u}@4e z$4{0ijF-E7nLSu`j6_28Jfz$;Wh8|m>XpP?BJ*sPFK|YWc7w6n|2lTWJY~;;5cH@r zg8IC!#h9J{8@5aPHjRCadFxWJFW2c-h5f#UpTOQz&#`##DfDdb0Dqr3xXqX~;rGgy z^$z~6e4p|SX&~vwCe{yKfUAk?6rCpt4bYcs_`~HLaQ)79oISb#E5>x9{#{VfU-5#a z(SPg)crf04<>43bV7%3m9S<;lTs-5-&!APE!OBNIxbi4?w5H!ne7}PKR>AOFBt9LH zZ?wG6rO2nU&4zv9VcGF7b9hAbpRDQWq-6hgl`CO<>z0hIqaC4kBSh`HzuXoUAS~{IU?6PAwG0Al8N^ei6}Zv*FlI?O)*Sf_tB?JO)kpupnwUSaCi-{GU6RO{`vi<0=#P^5%CQe|1n_`hJTZ93Ema&%7J@>4k-JaU_D{4MAmbzp=!|euV0rntV^Ka z$Dd-M>vCl~Q8gYc_*Zx)?hSsN9hZVtjaOq15W3*7@OXWUw(;A3^IRSOW5vI59m{>p zYsq%Ozor3AXU6jp`$7jiMsH7G97NEr!>C@OoZ>f~Td`llzMqvH)QFe0@D7 z`_u1Gc#6Ecuq{uqrE3JXwB3&hwdXK4KA);pJ7eofY&rWkHpcy_dQ-35mxAWB7m6*T z@PGaTr@pNae||kbe1SBub{I|un6;gV|77|_lZ6K8OUj@Ovd41@Ib}vujo;fYlf0MZ{?Fr+MZto^9 zT?C(ngVC=p<49SXR(u%E+xEwjpmc0F`4`rn_!DbmiTzk&pJUyrm+bZQ6Lat`!=3qB zotsZVo)14|t+H>hqLmNUvoT|%Ef_WV?C+(pf|CN%1th~dRJ1sO|zCY2e_WM4^jzO{5Ou1)H$CR#7NAly_ik z4C|hmygw(8S2_Uq$x`ntovSeG^i06qNpY+<_%r6Ni(r02Z|XKHsehC2KQMf`R=MZB z_$N=le0CL1?U{ya@vF(_Y4hRyCUQ^8<8Wkte-YQN2jhtMR29EGpn4^As92u8U5xs) z&D-^ZN5liHKlK+j5bqn}jj=xNZ>;A$y6MboEDwB!nUgQVjlDMORAM|D^Cv_OTHBUA zn@9ueyBtKwwx`OLE%84G1^K0=ekG#|c8EXW;Rd!$EDGiYmz3odzAVRSnMUz`IY!Pkk2iX}*l8ev^@b974K?0_ zf1wRq9cPp7G%aZU|2`c<-P7_+@>}MB{l2ki^kq#Y@6{+(8ynYLpe`(V0HzMi_hjIo zzlnP_5Ab~*KK2F&e1C$c%NcBKACBqumoSf^CZP|My;h zh5h&5V(pU8XSnWW%{BhX~2$g!=7oyzFsevt2lZy zUwpyLGwcih3ubui$B>SFaXe-X{c()n5gU*Aa~YeHGmarA4P3vx4haY5;s)(lX_V~* z|4HVXPnadyK#ar}mi9x)GN4YR^9M12Cp-GwL18m1m5{H$5g`{qgVF zFXR>R&T;m&F%n*5V*+~#lAkQubq_Npoo6gpDD$vtGAE@VM%8x3+V=afx^)P4j7~sA z_)BHiR{US^ZyhH74f_yfpW`nvcDM&~kv^u~j`c7Y(a*r8 zrrr4CnUv}7V*S#ctbb?N>YLR32D^9B9!gzEc!zpFF~mNH)C`CeT{q$tLN`9eu0e6s zyLMqfWhdJD3!_k8)`l9f3|mh949`n%+4uT20@GgM;N8D*{K+ev`H3+SiTC+^9m%u) zLwvFhT4DBF;@sb`R0-@_Hv>2Cgd>@d^T!)6@oAS)JCoY7?8$L3j0V7XEe8-YAC3W?O zFrH!A@=L6x@(ZTS^Tp6Ey>Q~>8bjW<$vjruzSYj7b>2NlOxuhr=hi4XO=VpY75Dw* z5Ym6m#Pz$3vkF>@;6;7mHK{u`Id;OH@qO5nlzl6fkHp@Y&gfpfvZ7asJ?`Z=13}lG zGq#9%&6i(cGyBMHW)GcBGWc#cUHBVIcCz=78{-7~?ndeSRhWBIh;~87TLby2bJnig5fhj0!;bU6vo6Ccgxz|L*ze!q${%lV`y@377<7ra$?Ex4E1>9U`cK+BRnFucolZ1hb6M0AYzE$Su zd?U7~_vpJ4+b1!asmx^&-8T85KT>}@htyvl1g4V~SO;kv>&I{A ze7g1W-&pGR5Hn_7hf|-Otl?M}MVLR-t-?SoYOxy|I!3^EZaQ^=mx^x*9Y~D7)&U|J zyB^JW&uz>BX;4Mv9;s8txDt+{x$|K0^i?=dKW|Q~>fc%pQoLXDWRnI&Mv>#xF=|Pi zai9LJuc4O;|2$5|!HN8H*5v={I&vj$|H#op;dG0&j`^S@Y^{`1^$>(d3NPf_1|eikX;22wxXg7l|57&E+``F0DKBe+b( zQfU6Kmm;Hhdrn3-(!e_J(}-d%!Sy?nFt(pJ`w>jUSEV|maq({`Z#yxLXBC#ukHf)h zKOi*aDTa?+im?OxB7ybnGM?Jwcm(fyhz-hyedU|byx+bQKUeaTaHRZp3yDu}<9PU1 zRh!>$R&UmjV-JNDjyN7T1DBZVm73;-nBc`2*RdJu=cDdjx)G+-XPjB728srxMn>me zLlMb3TWNfkiGRJpgsTtL|F=d5Y-7kylRlkam*<{W;IdhZt2bZS(mBl(_D6J2OP^|I?bl5$U` z8GmE)Wx=tsaT@&Ewr-I_lsv-Y1aE4;EY&dZEAxcLyme{YPTnsxAo{QHWrb69Eq%UR z*OYtAYb*S7n@#?=tjqH#y0e|b--3Oft7yrb0}@W%!KvsZj2k);B|guqVxLMDE)6Hw z#qd3ygxEX3BI4>(cppn;{rnrWx1=NZ(o@Fk|Aqw0HJ433pZw+x(%IiI<1KLW_m>F2 zn21r6XQN!9VoJx59w;J@)GtvOYuK;QXWC$Rvj?-UyCb$v=nLm&wa}FFfJ^HZI1=nh zK75ID!BN^wh{MN*UVJTe1FolRGUG`pXV~Te#*k7L3TA!wer?ZrVZbr?@ol&+xEynA&VEoe{46QXE^Lp>Y<{3%YwfPDB z5B!R?doH43-L^{3SH0xvpAj3>*NxiX=>E&f-lO=ii4}zx;$Pc3rJt5yTw~0Jed0^u zpI8^{Tjde?t+A(<8lQ^4oA{S~r~eE7)j2#yU0-9{vQ)B=`P+JZyWVZ$UtL3Jf^I?C6Rw3zbwc{JrZ|VW0H@tWz?GG{8P> zvz=JOk9F&ZbVUEUmEhQF2>VtF?ud@x<01O zf;pufo5D-xfT@F6+t?X#A+r#?TJ4w-t=TI=W*;$>PUal0xWRffrYa@F>>%?^!a8Y+$T-N zi4*Hoe396A1lJnx)}`k0IhW$YRrmTX4(We#fOIv)y22C-4^;R6uypN>c|3b#=x5$+7H^_*`|J;FiaLWXeFmd=-u!AFE=*la1f)h=UW1z2s7G zYS?SI6rNA~8@%7Zy@5OXx((OFmBOOT2jN_sqfn_55PPt$Ci62L1{A z20ijQc#aIYhF+JYzOT~b`F~X(GcI>-4uexKXVfWQmA+M@){WF~{haecUd9g8)L3(TeL z@5?@gzU);SA3m2gU$-eeH+;n~_^`Iw#u2Q6zi1>b#nGlHJf3x7lOF6K*6AxyK2_?; zv`waRNX$?Yd2|xjlOHiQ^Kl@qB!?q-pVZaejwK7X!Y42qmv7yoeJ6%-%fj>RxX+34 zfBG#vKauv@)L+w(@#1@2x_ktYTP7i5lM~_&&&CbrHKr2tX~cdy$5qC+9@;bstNVAs z+>T$fpISfox(d`oeeHw?TUhM&t0~P*B2mUjL!=v*Q%xF9Y4GVp#WD}83^6_2Q zsK#EjoL_ga7flT7{9bzYBa(l6iFD#W<8N?D8Hsw=xhLOZ|CMAcVDHwBy@!x56;s#A z&pO_fDQ8w@4L^woDN~>b)-opSBC#*HH}Vb*89~R|*!ewaz?6G5mU3d!`dj17e!iVn z3>+G`ly!|mwN&^wwi(A+FiUKz>zXuXr6WW35}LISMHeRK)wAjI&24f&(K%!(bCk}> zk$i!(vA1!6b+A{=*#wvVBN+q!4H{CesaB#KDitchc-#`GQoI~%N;$es*ecWX3REil#Aow@xOOWS33MT%8m2D`Ib3qboE*NyMANMGe zKO&!e`1&;-PzK6+afjy#&!<0D+KC;9s+A_ILFi}c^0kOoq5>LB~FY#olc z{nP2&+MsMeDR-z35cesW%wY+e55E~s*g32(Jcspz*J#Ro<2YOglI90-AMroa=+hf0 z_~!_kGZa3PMq)+lsaV=#Dw-6kqHrtmw1sG+6FLw+RFt)QYp@S$#~u!F9PLUQ)&fj) zUxLw7=VFk{c(h^vj>?tTi26b9_N8WM89mw1XtX z3ifr(z2H=E#vy!P;ZyL)?P}QZr7*?)?^|m8+pc3?OCPKE8`rn!2O^UbFA9^EYwP1R z{srgRju8y!82TJ_&z#50we>d3d2&syFPx|ETW~Bo`3dIy9SS{<;JwG;%YLc8I}an+ z>o{ZJ&f!GlO+_!~;~$#Gi$73?&=jB3{69hiJJ$KLZbWe-)~aeb?3hTN=r#~X7$==Z zJBsAMBxh{LG1mDDoXfsTvm6kzY#5^br{T&a`c`?2$RJ7%q2E>ImOlz-Oi?uDq9D=% z&!_z|iN4#kpHpz_%^PG9|5>kJA@$pH)FCK8iC_0Y0P!#LhiS**d|+GG+qhKNe;h`h zpN!NO-{I2LBYf5=I36&baeK7;)AlLym*lpmk@sJ_xJmK+U8DMAx3dHDs5nM)j2p=Q zM8y6KWB75YXn=EIz|5hLIY8tf&tYS+y!i}FZ7_s=QKbfe=%@c8EmT6M^0n|KV-zG0 zROVZmch$UX9wW!f_D?y)o+&;S!GDuV#SpQ5G<&eMV;=h_q@Vn(OS+ht=l2mizrw#E z^Qhj6BIk>|BTI#U3qDQESg|MT)?vdT&owY8*E6rBFm0@BTCkq0;y=X>s;+6y1A-vq<}sa{i+foIJQ5$99cj z9^iZx-y<=4@*FZZ+)UoVdMfkaKW!LxkLZs*V+L>xB<}mc$F)CvDCg~E|5Bfs1Gw%$ z-Jg9e7P%mN$=9GZ5y#=qaWM#jQK>-5^2CzD^%#gMq`3q z1MBbL-=x26I9D`e%sXnkiPdcQw;ZGAE#uiplRRGIU;hWWj$XI@AM166SMWV4JafCE z3v>Vb@UFJm=1ZAt%>O5JLVMGs5!03Ltth|A$hHls3zHwR#?ytf9<=)te~+csJ?quR zFGbh};$*!G65>2?kv8`EE_9Z_-*_NJ)4>t?RKRv>^3;S`LeYoNeOk>?1$~qFe zN?9zG`3p(6b|F5B^{JMPh3}N1@SZq`^i10pb$cJqYd$lG{h2Zxuy-2gfoc5_xY!9t ze5SGf+)C;X6BYj#-tRZn1*lN8cyGEXpSkaN!oj3$-DwL+} z<^%Mq+6=Q9w>+;sdkM2|hr~X$DOwVK4o*0+)s209i_yQB2OaB_VIDDU5`{}*>5SC| z&l21V?=rD3-(1V;X9cG=Y|3{tuwli8alCaqj}xrwp{}PfCD${sulLKn)IH4mXg_cQ ziF3#P5xG|gngFt1^y0e!rpSJ@{+(SXo_In4XYcAd+n zX;5UScdp0d*qc410|FM32QGES)ywNC*Gs%SZU0!K~n?!vg>G>7{fubT3=L?bk$PVXSuZKr%^4FrG-a;L zztFtImsrwqICeTsVE-nge|e`8We`1k9D5JskkqZ=07F^ng#({Nd#lCD;*wwhVEN$oL>sj_0bRhSXd4}_k(1XH;iGTG> z@8Vx$Ts?yvV-CIDc2C|*_9=|Zx;Yf~x&A&HP}i~?tIttO!LtSTw)ZCY;C4NXxyHP{ zc^~U_^mCpg4V;L)p=?5VILB9Jj?9K7!*I}(eV*5iWDMLoVxRU-+I)ltQb`Nv&Md>h z?W1tOb2Mwst)R{sLU|{W`2&=9D9;FvRV{Yv1!=U+-~Q`Ig?mH(0q(r~g|rb#9YSL2 zNH@fLviNQ#uHsP$l72Wxd&(2s`0h5&Ukt?ABlB_NDs>K#@p(Ha;X3PGgf1VU zXeV&CK?586j$$p-LCo{br)2nMWlLeZ(*XL&%P?;0Q_OAC4MDC>*fFjzYyRe8FXMce z-ogRF)26cLc59_8I5wz_Lu<#NN!5~u?m#`DY4ry1+jf9CfQ;u98CH0|DPtSo#>BtS zfcgFHeA*e6>IqxO!k;m$L*`C9^j`8fQOF`Si;gIu; z-|48nRo#k3v3KuyeuH^9%J}E2SJqKaCBGHhKkc8wdy`m4;qUu7PWuPa0Jb#eTudE!`HJ9(Q4v& z!C?51$9q#>_h)_n{hP)iCTuQq{2B8=ojZfLmpM)KuFLd9G-EdWsSo(iBKBwVTvtad z?cjp;CF?4`OPNnU!@{25z<;q0Zx+F;ZH9P4(#{yEby z+ocr>fBYd|yf9q23 zvn}Ph$(!{t3X_6Mb6D|jJI8VleVi=cxBq?H^u1(h+s}2qU2oI-&yyd8`JFl$a@TqhEYDbMt=V7Rb*0E zz5VhzZvFkMviS(^twZFY%s-ye7Wx1goFCFDBc;6l14%z8({{9v@;rSEoF7y_1I`hm z2d7ZpxskRFv5aw!W(>dNCLExRHtyg8T)(sl*RO2Gg_9oaS;xNb#QddmYe}cB%J5VR~` zPSqls+m85mbHc#|!?9{~7j9$Uqw;leVBu6u9@vEQL2mSJR-L(9AEGpUn3Jhvort(W zo5MXrcO(A)+qX3EFW=2RZ1@%o|FIu#kbB8Ed&YyctcY=9S=D#sQfhpOJY~pWf_b4GL$6kO@#elWM;0r*3-{Z)|y~iBc_s)_1I)>2) zlZWx6WpU7B0(pLI<(~5WNcC~K4Yx(a&1A%*v zkp`L=G*GGlwo%qsvJd&b!oSKRH*Ej5S_25ZV@hCUP&zON7{F^ zhyKVp;n%y!eD$}&ekN@}ng+7oyhi#jDdf}Q4;IW5$4buU^=Lm$G4Y>#M`%Fek2vV3 zPU288pF)q^CNv;5j*=zUk;@d(7Zg2^2Iv=1@zMN!{`4yLbsR=}kHPo-i2VTiympUr zM!zqc5##@1Kf6NMIIK59+}I1oZ3ukE4npHnCD~W}BdqAx1;I0U4r51R8DrF}R%!YJ z@*|w~v6l5qp%87LqX$jI!QccX>x;Z2ei*}M$8X5@tofUM{|ZN%-`l>2;M;<6Q${hi z+4spcG!5uE!!`$)=g4-Ook!zGmWn1!x{zZ`%qsh*dL9FF;)9d%j;vxntHPdzF66hS zcjKBS{!Kd2vDUKG_}6?v|5mwVIcPw=FZJ98ovGi}`~H8d>;EiE`8MJo3)*{(vQP`< z+bLfpAC|9jBo7vSmDrMeLeuwU#lNhJewxgh<0;=#_Gc_|+C#=t)6SW8pM&=PtUrHL zx`509GDI)P_~QxreK2c|i+)YaGuAHk$v$oiC2nc^7aJ*QAmy$x58R{-bo0grq_H-w zU|M7uRojb8y{@p&eG2nJ2RvVD{$EO1hkdmF_|Yb$YHl*W%)+h-lD&Ojfa^yd-(BZ!I$R08f(UH<5=tSs&zSD=-a}}b&VCp|KE#$c|XD*?6hFKFN1~@uduwk zoX?}5%epkqdH4O;-!ti&&zST7DjMMSbBsYe6vTKf>A_5%SD1ApX3Xe?E6lS>p?sog zASeDM7FlWv-K6}I{4|2P@Hyt)#xXXUF`D=Mk?}m4xPOE6*Kd%Hnd&Ghv$$5?Em%11!#rg9|TCht#U-+RhK@;i;VmN*|p2VBZ;iTyF+f6Vne zvVAXo8tbud)hN|BS$Ze?&mBtNw&CwxKcqkE6)b_$l-;Lw`I@|)F>v#SB810EKqNuS#3P2(}Ge+$kFAD~gW;;M(#c*m*g{l&}sjn&vU=V%M| z<$LMx@sCS|b31=G_&l#GJkY|Q)w+a|tw&S|bozj$Nt`AnM7m{Ax| zyio4(9{h8kK2~EsJN69xYksa}AI0;DaTVXhrJe(f7zKj{G#zMcYC6)t-}gM$cPG!I z=ue*C#J8dst+!a8UG|&9xQ0BFu}z-sJY}IH;TPf9)0r`KpP?Z8I}aP$2JshGtDX>| z2PpiDjLlewRLU>nyE1BxNWBrRKc;PzG>}CfR_60W;+sCP*RK@z1^*dbPyg#VkAu|C>2AXqnPKx%j?UxAWoxGtENc|h<_?8`indYAN~mfUuGFaOIL z_H!JqWPLx{c>)(wf88>LIg!JZpR8k*s_a{tAG3P4p%0w<=MO~`bHsuf7ZJid$z=}T zFb0wJ;Hp>Pe#TC?4ZtR+J~*{@EEW%Mui_oPU>tLeGG8Kqd5aQnXkcIC-@uW=iM(Tu zoZl_yHtT-7d}GKXHaXtpw+0Rc+Z-nTt-M_@uj$2(eS-#!7(3&c1P}7<1$V~tnD?{N zt@-@MJ+tpuSQB1tJx1Ah4ZIt%eRk{{_p)Q(hJVZXHX4w3W_=D>=e?}&N$zVq-uw@? z`9kI;%YJ>F@n7{bS-uO;PaqAPq>pSe`xX>o-Rdts{5RUSsL7nx`HYbeS)Ke|@qFU{ zF?+2%WnAXtP{uX{;wIyJ5-AfUiq82s0vSK2F;@76;{C$^g$|OR-%!3Tp`$eV7SbqR z89IRItP*c3v>zcUdJ2c)e@nrpW zmhWrDiuGF>>jv-7c5b%on7r1!p7E`DFPogh=is{F-@v)f)gtzJj>z*$rkC>tFB~@f ztMweut?#X$-~27ls<0>5Ta!vl0Ys&av#%-Qq+~zYS_e-8y`r9{1`;C5pAI>1uvZAfmH%mLIjQXht~rlTJsyxi#%a8lU! zr>t{e^LSiLSdY_@i&&rBQRP6-CeQaIo_*a1!i#Yd;`6w4awS6MlUC?g3ntCDG^@wh zo==z;@il_zFW5Gs4?OzyApS>T(eMt)#khvS-5u4tmUsqLt4h6FJ3bXgtoYIEda1vU zb*cB6ON}#)HO_wgc@eZ}v^r59!T=)KdBoVXQ7_PQc?-as5&#d(9i0f$<3(5PrJ zY#QC2c>@ku<-mU41A8FGV>sOUHN(e@`RU!JJMWvJVtMp8ly6}09`jq7I95D~>jqZD zu9&HY*cdgY>`Md7@>?)v!*Pjw*PmY zPh=g-f3mLYXHiRH%!qNa<6qv9o)`2|y*HB&YfQ>g@7LGV|4ILrYiHLh_`lV=m;W#C z&3Jd}9dNt&di;Wbk=j&y@93?@+F~D|V$2WPW>s^l}d8F7L;IJ+t7ycqsK-+ISW_B67DY z&eQHAeKL|#b}@Ei66K&F@T1Msmp(6V_W|tLH3TO@<}f#y@kH_L1H5b??U{^UW4yQ5 z)B)&GzBcnhYf|p-2XEJY>`BoT+eh|B)DlMwZe0VP5dW1pH~Mamq^@D~B{ldCvCUdH zr#a5VaA_ODEBS6?rPmN+Ayhn&kpp1GkXl#rJinL8Q?1|Qee2fqmEOSn7~k5Y9pcrB ze|0?ZVV4CYABA`_zq=f3nM8&ykJQ1Vc@qWLjnDr-1g zmAQa+8{${hWad1O@n|1&>5n0k`fcWqm+14oO~3FjjE8$g`zQ0JexcpxG3}qkdOCex zQitE@!zg(HtW8H7X!1SQCA!BPn+Mb{9vz@JE9Dix{a|< zjD_|XNF8=DPVRTd){*ReQKkXr^lV3;fdf3p_NEV@8||O{IX5_<4P$%?(`O)cn`e%l zPx^U4y@~mDrzi(;&eS$g$wxX%ed=8NeN_iscu>s2oA4pc%x8_yp}j_8;q-Mlbu`0{ zMH8zA#)Jk8oY}vJd>4%&{f++nQt?IJTgy&X-0OA4Pt`Zq*cUlTa4)oD;$NOc_`eMs z#(m%Sj2i!Td>YTJx9k64n>YENa`I$(?(F~Dcpuhnay>naYi2)3o=qKZE^Ra}?}O*+ zp`SxPm%fJ_uXw|WJIcoAv;82tFm9+IbDSi$w|( zk*why?0pj3*N0*ubtxCd-L`7j24z{3pa5eJ^H8QNTc|kvb{F=$ulmm``(4z+m3(BwJh7EHsy&!H<`z@ zgguQbD1TYm{GY>l$k(iExstq}IbM&&W+S$Gk>Od>Q0lU=zR)e|zL}C2KpMybePM6S z7&$J*KYWWcqGG2RAC&d`1JVX-@z6hzM&5rl*$*+1i?QExJi@k(!jS;x1sq?3E3A2* zdfV^~BvTibA^DJTQHv0;WEgb;%0)|@5Xsu57tgF^O*`=)5c~Ih7@Oun`k@YcbOHMT zvKDr{2Lh=(Ea==F%ldRDucw^Eyn)^0`oL#OKLpJffQcO&p?dCu7~8lt%F#C_d0%-L z`%soWuIf~%j^@=HqZQ*xn%8KI29;`|N~ww{$$Z~D+kz^?uv^)U(>3SGKFU#>Bk!9{OBaTHnR{_<{92+w-gE zd>;+Gi+}yDWbU@nG38g$3qrk4z@gJ1lwu7d$p@@fwixElA}?i6b*T*`ed%-$K9%!A zognRLB>e&x6~40=E0_72w4nUL^bIh7Mq;YP{+arS$39|w1oewV=JlRqt-}P?y1jaH z6MswXH)5VPp%lglr7%WF`kl$RPI)FKY&QIt(Vs=XZ={zS&YxL@)LVOqdCpCo7lbY^ zU)_KRpYfD=q~;6b?y`0;zj88mOt9IT@6bXN7-C?89&7SZvXmF$%TS(p$VxWQJC^kaq3LvS>LTz{^IzWwa!P^>j1ZA zJy5$~G1lh(H|u^3K|EzkI}YsMMPp3kOnrC37O|pvss8>}Ob8D%uy5h7#JIYL;GO4Z z8-jlhxu&KQUE|IAT*_{0#Ut@2_q9Ez#=mvDq6I6ith8bMulkvIJ%xSqy4L%d>(>AJ zzW**bAj0QZMJ-|7d@iy;M-^wKb`p}Z};YQs+xl$yXQ)I`)7=m3nAK-KYZNKMV0a6ldIYvqBXx;j4C7-M24x zyD;8#+z9xL8jfyXR#i08gf$5c_?=eyt=4yM`z{(=<~NXUW1XM%w^w}0#GKx5!?#7Q zmTg8q4GUeE+s>Ud`J190;rZnM!uRFgChh3>94k+?(x##VjX9pLT#jw;oTJaB9+Qn$x!r23)9+pVXI@hutBx_RVZER1mw8iU zqUe2>sSD0V?J^ZP$Frtou8+{6Rb6b}?uN^(J($iKLBh`^XH4q&DF3m-HnI66ls;qT zPf|X*{qhCnedf>nc89ty{l`CFW1OhiiH;aHC1PCFP@#`a_afqk&W$pH)6cg4yceN-Q>8SUC(8po=> zy%|0u=fJ+;pToevnV%z==eM;zhdRdoTj5$`%EX?=ieOLptePuK3@NP3HBDUWV{H6b z{-@q2=a}p2Jo&BfCD+ce--<`QZd{-CW%Kx)&ztjEZNGW#Y}l9cIpjLlXRtk&JSX3c zyz_I+?YqGFAl&aHdp1undVO$yFPiIP)^MqdRqWdvcX>N8Df)n~@|`7#FPSuu!Z=ci ze~>y_Y2VR*@FJ7*!JpI#s4u_zjlO}4)U89=ubQ+%J5!3BBlad`bK-ftjv9(K#13l= zk&mReSvvg`VnY=^FL?%O62~Ffr`(frdk2ou<{30^F!mCkQ9*N96Um1)R>mV>2J0!# z?2ALIN3qAiY|QG`0&X3eWB>B8^b<_N=&u{0)Q6v7VfW5BykRQ5CJx5t!K}AC#Q|ZI z1NYIt7R=n7Q0fuBll!1wgUXyA=|`bHuyWp3Wdl__neS1(_gH>w4vjncZhEM1WFDuE zI_|V^Omtb4Vx;7h(Om77c4)-hAfGoaP+x_%JfRW9?eX z`N>Ki5*dfOE9;J?J*KQfyO8pe{rLlNP9K7blc4M)#}e-nm#Si+Y41@rxE=-Yni7j4 zJ_n6|E`*6Uggb*F1%p6hsuE$S;UByHn3&bV(d7x;l_N|HoD;Vw_?~v2gI_T z3lu%@x9rQw|8vSw^4sA5QkTNSKksS1pIX=3WJyd|acRY%-lu3+XvKVfIYzCU_!R7E z9-R$G8sBoBc^`eRY}c|pgTAMx6SY+Hr%50Bp1h{M*Zch##y!>f+Mg)r+I%v^KYzay zmn7RPbR#{>p7 zg?hIQ|Dr1xBTeFsm|vDk-Y>ofiPM&viJ>c)*SKyJzvWUS-(l?0ZEr+-O+vte{y0W` zIO+eg_vi6gJ#YLtP9YQ_$(DUBN?DVgY$1dwTS!FNQ)J(lED=KXov285B7`huODg-` zW(y_fH|N~<;jY)~{rUX9-#@>P*Zp|RW9FVSbImo^^}J^0%yxR>ppKeI=$^S66l1Lh z<$8hhG5+AaI@%Ge4@g3aEX6figD1;91R_E zcMuy51LSk-E;61*&qShQ>wjPk!8lfT2yOsYfP7I*?Tis{`T;E7(Y^q+i+|uBO^5Yi zTl!=C1LF?p4&@28LyQezaQ`>nkoFJG2lEQBfa_q4BM!?yE=G}ba30uB{&GmUATMru zIE+ghH;kr3=Br>@2tR-3N3p-n@89%sF^}^MEe9{ zvYm(zy82_lI1Kbj;GLnV&KD}VX9hJr^Mm?_fbD=a zwBpdK;9hf8&`*GUqF|52lgR5(agZexbWsVilRpi4omYW6n_|Hj4zqu|yE_)#6>tM` zI41^iQ;;F=y2n^~pnKqK*h_eyC^&!px2|#jBkKS-ddAf`5{7L9IE*gQc@rEv0CGoc z0E=&2{Nwf;7>xfl{z39!a156L^Mx6=VB=s+p}0Ws_0Ru^jpFdXjsNX9I1eTtf*&mY z;r-*VLuK&?{&C9v19Na*oM#Ac@PC+Z_!+iLl;=P2kL3Y=2A{k5WB&+FTaJu_KpG4U zxI8qBu|*W`JL`l%H-H{$V{rPHU`*5s=1iZ1yS^j52oN9~b-ZGx$IH3~B$XckZV^ zae|hEUeWCMfQ(@`1}h z>UhTnPN?+So3X|rWu-K_^%Lmt@t1r4lB zLOo!AbkF-pum>C13%qw5jE~@N!oC4^(lwY3^$vsiT6nG$;J*XxAu3O}0rrO8gPO|2 zz}*s8z}(Osunv)gd^e{Ed~>om>NeEzA_-aht^)Ujxj1M;yeu?`O*4RdQm*JwE_@E_G3iXYfV<4}ws?HsnPL-mg09>qA^&i{dZ@E=Ws z+Q1I}cQF1pt}y?1o})Ifoestoz{NI?08{80O0*7`XK)&TBeXs^*n??p=Lg|GXk&4^ zjenfy=)R|Io{%~NesJ>qO$(ueLj!$|ln=M@NPTvAfaB3ML5vOTJVW!MK3a!A{sVf5 zO#^+w^QQ2)s1@vusV^UZQez*1GY3wP%t;A|72M%Y4(=W#0k&{p?>>kh%$Mt4xCHq| zL_>L1wNO((81K)`L!UO*p|Rg9&?wkT@e$l3G5qZ<^d9!XeY-m--Gu@;$V5jE=DKgyVoibr1XK*ydlckBfg0hWh{v z{$abo&_VU~hyO3-AZ4K#f}j6^e?S{Ki-5uVPWy<(KWraxI||ak4z3eg-VS~+b;HFX z`V93^o^gHHuF)|NoOhcxifcFy>;7J6M(Luwpgt0h^iTggFG>r+IV=yf98fnjKdLKK zw{TkouP48%8-r?}zJ=0&Ex1_UfzC>+LPr?ckncpn>#C$+U4b5~F9{tx0cmQThi*8z zK#}nYP)YeSsHL|HjE}~EO?-vMww9q!zrp>Zo1l*X>&x(-qj%sAx_98dp#fkY{ooy- zAMDTT1LLW|?*rid;yZG$de3MPIJ=V%#zW7*nFjC-*hud}8PqeK4=`T~jjjxUexn5{ zD)fhZoi(8=7d0ShF=22981p?<8i0H06Q>~`mr$s@1boA{Vdw523=Uzrfi?ul1a13J z+2ZOB4Wn&4A}16ZuuQRGR8Odn$`#HJV;a315T%D{^Z&FHq>uPN;UA|wm_BY9$bT#^ zNEs-Ph!4_YalP%sSjRfl7LaplIQWO_f~3Kgg_eod8Q1@}dZTs4^lKP?QA{Fv0bMxF zHeIw%2w$LV7~g;g3?Do82Yh3&a z&LNM0e&rqbwniJ&{{Ask)0qUmOBe;^JiQ0SB?Uun?$(f|qAh2l8&)3$E_4 z`B1t@IcQnHN52EJO%KFvhXEZl4D;Di2fjas8;7Nh@&~7dc|r3a|8dgbp4&(8`#1Kt z|HE=X9o*()`v~wHt;gT^$L%X|+f|e|*vI7yOMvgqd=#g6NE+mL^%kV1paqHWo`Bd7fjdY@_aWcTfo%f*h7SDw7Fw`BjhTW1;sM{6 z7Gh_CWWcwNRpr4qb+k1h!%G(-)5|81xrG^Ummy=5i;%9)Iq0mC45T1^5|R|+0{hwM zA$D-zAuYHk^#BpL&lAvw_pi}|as6@dy;3cibC8D}_|7W0KL+0K58w3$kLl2Pe55|0 zj;LO7eFV=qy7*gv=zq8mfc1ysAJHW&C!Dqv)+<6AZoA-Ta2_0o(%QxaoCb9u9b86B z-OwNSN7CZz2c$>w@~?B>AT2V6L&ox$@eFb&3&1!0jbY?G{&qVL%17P}aIpWs@DJMx z%qz+Z!UqiXlJokh; z_!*3G_&Z&Pz#WE%0nWLBZ3%Mmf$!AGKn5xoAeSq*q1d2Qs07UC!uM&vLchHL+E7I1 z@R}BkDOk?fI^ot2#SpGe;d=cqhtfiA2hII>lnT;C&bHoD#g&0L!7Sybme|^Q`dwj+x-BNkVuw6bAO_ z`8bC{ZZ=+!v!xqkci9EHZsG`CH+Fz*fxB+%1UXvV2H&Rih5TIaLXm!nP*P+*lnd^5 zcmnRVsselZVcy_5+-=N*vJspCIm7eqF#Zv|;?@D?`+qsyblC9!vV*_%h{^|z$M~?m zcXa;eGg$6_Vg|7zn0LV6tJ)!`1^93nrM>O{TO7(S@Nw@a+P-@ZZoja$fVqq1{~7*K z-gkJw;0B4u>0{73A^3;+L>-KM)Lyap+@=M~0ZoVM04EKKf8^aA)Zqp8E&4pu#aFK_R%oF{lB#T7~H~T;W{kFL0%01;28*`{J{QBJZevv{FwI- zEFY+RacRT+Y|9lba|dfM-^f@8S>x}&(1mq`=GoR4RwjSo8{rR! z-@jxGV+z(2ihtBcY47-083B4|n!kOFEr4{WJ-~Rvp^wxJ@Qv6LTu*=SZ&`JWaT z|23HJV8GAN@^I5_hhez^-Vg`qVdhV8@@(^sDG$@WfqGWJ|AGDxet?`1Tw&T+gn#%y z(l){VztMwnf}w%b8}Ny=BOngb9>969Wq@+fdyvq&z}Q0NhG{2uFuDDXj_`)cbEo}B z@sEpDm@Xm{Tv_1o4L`?>)nUFc^+sj3tq+)Y#KCn#9VR`7|DAduGWiShf3!2(`B6Im z?|h^UgfW0%8un2+gZki<@rOJ?S{TcJ;u(|gpSTC|1vJt0xc)X)VcB6FA{SV$Fg}2+ zkTT#gE;7!=@`nBg{!V#V{A2TO%N)pX8_R%?*LC17WU%+T1&e9)gw2Uw4| zd~N3eb72@g!n^|AAvgqS;WoVj{SQBb>xa?pPFoA&5ni#l1m(bV(KZ&hJly^h#Q??z zP`qG#lrId%;BtX{5QpIf%?tbRH^E_?Zqo+ykVu;c(j)m1>|ykP(#6yj#TnogO#|}4 zY2bX@WuP*J>xg}h>J;S<(>}q^vHTJF z*T>c!sS9k+DDRjwJ2rroD{3pC92CEpHV4qzeg=oZbHrXyeZaWIh0z;j&RW=r|dc?KYNS{MUnbdoXu}^Z|eeOnbf~12`?p)4%(;GQr{>$O(ge zOuL8Z6{|~B$A9A={{N>waqR%h4_3bjE&)D~b``}4TqdA_+7pHrhBu@vEJhGJ+2#c; z1EvMWxnLhuBkVxGk8vPBkO>B_*z#aL5w{~FL@o$#SbBfchyP=B_>Vdw*uwDsk7rmq zJN#qm!?Y0hZ{=ayCluqTkE=U0?%({Kbf65}I&GH;m%USW6yJZ2KXCh6Y&(qLAA@@g z{z09A4pDt!u)0GREgPvjA|s4_AbJ1)#6Pah{oB|O#&%Z&m;(Z5AX{p|I0*dzzvF#} zN7RmBU7+^9BO4Hh;@}V2VdV#&;o=nzBl<^ZVetUxLv?^)4$cdnq4h^(3jU)$NQ05r z4lN`-Oasfqc6);TkH*9JZ-m_+Hh?V)=?egDP|m-~5#bHk4_e>;$z7 zG#%`tHURLA>Uz68Aagj3=nA$S9Ni=3!#V*D#l!!>N9Je2a}=}iJ1^YkcfSDZ?)6~3 z5g7x)b7(thaOH;PLw)!e8iswOpMl$C1S_zdV7@U9!8ZCIo91u4!EGBB@QOa$#yyHDnAUbb0QU))egRDn`^df$m`|AZ zZT>O!Kx_#-L$UimeV|{oulzgBwv15Q#I?_DKCw2tEiYL1z~R_DYUAiw0QVU>E>XKVXy%Em^6rwTOObd z>i{VO^#OKKod0bTNIcLzj2{@|EwBTa?`|A{+Uvm?R&Zw*Yy+)uJT@IJzW;CGf8qzH zEye1psT#~B!#IKG)Q~XvUxRUtun*$kHRC@Vs2jRhY3F5*aByI2M6NrlPE%jfaO1 zg7|pEM8Gq2%(KM9^TtzAkkz^MzU;Sa1>*&e^~n0J2M@luyGIwh*_GQ?wznMiyY71; z=RgAmaa0d$)OS__WjPhOSz-TsJ=HISCVUGgj}@-nEO9QmQ8JvH{EfNSb*-JNenzyr z^zFx?2j@p>4?B#fe^eFMWmFpDA>_fcr{*DStj(<%mLpEt(B|Q!kYlx%?*8f~a(&R1 z^Ft(5uyg~TIDn$vX0VobGd=i~;r(CXRHU4nsR4sEq|9qoVIGm;h7ui%N3%b0&s;j2 z{ekFr`cYY1U%ATPieL9aTct+Vy!xJy2-kfOd-+Ptm$ijiTeZ?YqvmF<1CjY&pZvBc z#&2|VCXuDZkL1Q08FtxqFBq>?pTBCCds$7D@O###CMtYO?hl#UO>KxV9rkT3L=}F?a zZ1OjWb;TK`>$aYeUri?;n#w9n&QwL{nh!7H|5C`^xHEq!&!Ld5lhi>^MqZd(*o$dt zuy*vo!$75ZyB6+a3eFFI&xL$9{`hN*zOyv_NqucgDp_xcdiF+wZmgEj!$>Pbg?hWO zM{f)U#B5cBKV*9Ho3YSUj@TA_qMg5xJM^%Hk|dH?X^?v}E1yK|P!6P!93#VQicqXk;;dh3U-Wt<9({sHcT6g`%yCgQZ3kqNJZ&UF6 zv~}*=s;=u}nU2}NFp%qT=*;BE^n|r%W-%eF1oaZ$yNS0|jzM!&_{;^n+Qgo+NF5Zv zq_ixN$rg6l=!TaQ{WRmR;`tPEg9y1~LPecmwdnHL<6K9yxEEiF3Q{oWN;>wa7lYlqH>C4CR{0g8D>d>$M45FTW)xBwMTxEHskaZ4Q_J6ExNWhrt+PJYVb7?xd8s{RXZG!KVNm=D@K zkM0eT;UI2hnQlsUGw%>Ia@mwuNYrAhGj`DBEbeKI@*`&A(S6>O!CTzVOZ6l`Pd$aY zvA2U{t^HfKmj;2m0k^y&andzYg~et{%J5|eo}V?JHm9U7JP5DTE3uPih}LL66-)fB zUy^FXKHZl@xZm5q-jwo`WT0j{p}nl>=eEEFUz7#)? z|9EkRCo*Cpg!Je2z={(GbzY|Kp?}SEjGvf9w)f+5h(&4b(vQ4K;|__z(i0g9RiP(? z#orH?eKEDwnp|_4qJ8H2Ewpq$Yp909X$|@3V;A^D9-kUyj^C$u~J9eU_`i-6MD>ecT;ef zM!^ks-|Uh@t?c*Y7*jI6gtZ9gZ>yUAj`$G9;*hyQp(?Hw!gK3%&!q+TFvp6=O{2#t zJ;SJ?qG}Wx`Y+_Nom1cxPF!JD=4F#I^D<=JQ+%GR@z}?;MCDj50#Z72CuK^P@_RCO z@6yJYu~SQ3Yu#{@Ots@WFLJVMox!Cv9MTK=BJ1Tt&tnxxwtDRuDMx#0QCR5cWl2G@ zhTed^l6_(8P=|0m@!S`^<=d?(=TAJgNwC>87(2H=QG<`dqdTXznR@YEwQApfG3vGq zcS_ZDEz*Ng&5u)O_sWWDjZ@*jyggcCOj_inmVDhKGx*Ep;$YKJL92vC;oyj7ui*ne z@^Z$aKinA98rs;|%G}}#a)X7a=zbf-CcL^K^ky~bl3dsOi>3WkF3;yLC3Sl+UP|&N zAB;{QqR>@1c+KpsongU2V&`neSjQ+SBU`g|cagm&^*Y@I0#c`Aqf55T6rQEfW`|2L zQ2sXioiEl}7*9;GD>;FbY1ki6IDoj%@14Z%jDz1Q^2urK8!A4gJ-Do~LBL(Xy-A*= z_B2G9cm6V~nZVr|+V)eP^=!UrCx$|&DH&ZF9?jRcGE;VY%dZMdAGdS9b9Ilr*WH>2 zglt8_sye&w=B-9Qmo%#8eJPSzu}bl2pYOEI@g>WBo;s5LLbC#9Oh(e0BpJOau6OAb z$5ip&Tx!3Rz7Y)#rQZ^h`NmHPeR^D|wJ1@Zws=FArLo_kdz$oGQRvbBfbKac;r&$O;S%#LrVmT4V4D~KM4s;i6L?{r^UkDmM;#dE*v%E%wC9eih`DXdAUq2=Da~n-9$|luPkMllDUq2B~QPn>n{uQAjoh#hX?S5ircv_@{*lV$QD^PTLCUl%mL~_eM=0$(VPqLg~qDE$|MEci9I`Pi; zy=an1)>I%-sU1GC&yhr^ii<#(H(L4R6%H!DG6tW}~y8f&(KstGlIE4BKTW=a_U9ku40>yTr9)#@EfVR7Ggop~;J z-&X5ia#pyVmhWBDU3rv8N^!LW3usQP=`#8-3?3!$7KoKR5~IN4$wWliO-T{$l5jOyT_?c4m2J6j_Vd@YT`t=SC!| zZP}+wvxDtxE-z5#^U`Ws9u-=WeMU+ovf0{KEN?`N zh46NThrg8;Zy$YdIZ#Q7E;Yfz%q?O_&PVQvLgmG5O9SsS6z+!&rF_MszftizQ&njk zdB7Fl*^{XLw*QUBIoCrTd)@SVpGRef#Xl}8i7$@O(B>uUC^sC}7BuR)cTeCkH-~S! z^RVrgq_C~!+eZ@5;xUbj+E#P#AAGV*^ws#e$yGlk2N7Wf9%+i%A(N|nYe>Y-5LC?c z{$@Co)wWA1`eL%jZhDcIgFy>48Z2yeSrD^_q)6E$s!qVM@yBO;)fa}`KAkEusZI>|_{b_zBU?M?;v?T( zyxG;{Z%cUz>B1d+`|!@IEBw~av-h*pzqRmTpC22=_}RN!feU9dw|1*rhlQ^xmDaJj zd(GA<#adR!8s3g}k?rvb>Nzrgka)4$;aNNA2{Rh_JVU?vW{_* zZ{9ln!Tb+Tf(4Ggfj%m=gAw5G1V8FoQ%Up0cLleizML@CqG zR@vl=+|SVA6%@T>>R9l~IbRLHO8Y6VdiRObB4-dJl(6y z5tO^eBq!ZT=qa;Ru2O!b|6!QxG!`j+M}gp{Ds4jsoBxDCt0F;Zu>S4ehtIDPa99T3 zkjfR05HRuT#Ou3WURT1C`@JGeTZ|_wHYL*Eh(t!RMsf5Nw@{WI&8ul$R33T<$7X*I-?wz2*+nsxr}a=G zRHobXhu#r3k{;R&hNPQLDl!CTMN$cREDDZXQ(F|}41IM{YO9pWo9CJI-myi7(0sZv z%RSy~^dt=i)S<6-^&b$LuWP+qmVT*2{#JLvv8ZAnb>7&CG!>O2_c@|9v;=LEKQoVx z9sV`6HA#MxS>n}P^kubN>ba&trh|!UZ+m;&+I5efn)%>TBzaZxsK_z%#iwVSZ$6J| zyFw`!bza0EU9*6wQIUoB0cpN9&#=W~?Wvc^o&Ndy2|Wgh_gCoemBkWY3)d57N-Z+A zp?|2&9v@3=t*IxHsS$E7s_cp&pDO1ZyB|LvleG9tqqWcD-+O#%{gO%AQXrBpo$9O{#t%T~thFYc{arn-XVHp2bkwE&{JECA`KT z6IN3Pyakj`YqrdA;<5Sec4_*q+a!i>rGvjId&Y?K&5)2NeM{}0_3MRsWS5OQ6tYs4 zp*oFe-7h4>0ihJ3IgHW~v~{;cQ@dz%@iQj0K510?+k5u!J~tX!aIE+%4JT7H%l!sv zLC7udo#A-BP-wW;E~d{Sa<{jH$8IT?7-pTbROWC|Z9WpD@ngB?!0F1hH(x%#_llCc z^4?~6aOiMDTIsU@G8?_8Q@(c%Z!HpuTsQ74=s#<1XQvd6Z|nb9wqLW6=n5O7y$)IH zVjl~uKvv5Oxx1~o{Nmx%dwW9zRQ#+jJ+9Ww_RlzbfKP?KsFUL{U(oQLT%K!0)`o$x zu|!5yib`QEwoh8p-<-Hs)#Yor_h_kj;pvOCd^#JyV{%Uk3$?xvZ)EyB(^dWL>aV8L z2}!i9v4LuO#|=6znfyL!?9l6^!hPU1b(oblkv-G&u>U;+YM+UDM?po(lMMBE7bGQq zYAbE7M#)sDb(p{ER=}HIR`uL)$Dz3Ze>)cc1h z6a=3j@u`X0rLcyx-UOiPD#J$xQU$x|WPcBJDaxCBG z`0PmyF*)+d+NnWF;yxmur$*++Y?q@{uJT;4`7G_|TU{>Q?lH`CW#kRJPN$=V1`Ufc z=cQBN3xS3X{WQh3KjpgWP1*PU`blw-DmyFayKs(r%#)1H@F`6f0&VYD->e%w`A6S7 zzoMtnuKGbZ#go-@%l7@{Uqya5h)>2f-P7^?6y8F2-n_z4o;N1kd$p2-UolZhDVOK; zE+bWc>SVgah6hxJH{WPas|tQ_`KA>f$Ja67@>rt!YeR{=pV~KN-Qf;{O~Vxv zDM9a^*f9$i%J5KKvU+RU`L@~6X^N)U^J}(k?IvT~BSWH#G=sh8Wrw)prdYBv0$+3) z#B4oP*CMgCU`gLFKgY9&O!ip5eoCJ~;((Rmr(w4pQO?QrsGZ@!$f+b)t3rWC4E9nS1b2M=d`WH z^W|I=*%%j1O?%FH)=vBBR$%924yEe_uTp+7O*}W*IQEO__B-9ks9Ei$f%w|cwfZk2 zZ%H1Sr3dyAsEUon9W@bOdCsPDcjCKN$?)KC;pPvv@^bwTu7Zk#pWTQ8#hCH&rVd(F3( zq9SR^or6->7Kp=@$X2@(DZMMKrtM4(9YZPbQYS>&*W2&UYKH0@QQ^98X;%Kq{Pf!Q z>gsRf=OU%r-hJjNo?W2-MnF`k$2Zk{yf%?xYg|0;hT+-r!uz37ukVMd>8h!9q<8k{ zCs3_$?Gvp~5_=tc&~;xt4?PiYCvl%LE8`tQE$?hbQSELmi#Pg-R7KWrX4MnZguY6M zw3hpvsuJ&Y=6jXt|FYcB<&3K9r_$VMo^!FY`a__Pc~PWCNw2(bYo)1{x|LL7rsdhJ zN^{d16L-wOoWZA-h8}|B)z%00Ff&_>q^m5IH{Dx(Saf^rn&q{F@0T9E%V{n*`PdOD zy>X`H9MhTjQ+&A%8wrw>zDU0#O zbp5^kS!?S^r+N1B5>%>@vbvBzq@5ge9ceB3`ujjDk;ZuFYVkYrd-sp(IW^rqwDdH7 zq#+>w#!Iy;w8^EkNAKtB(`XOc`)3_-7F}<3P-cH+P2)kt_u9H_)|!j|?r*1q5xR_g z+37Z(R*pi2y@FFm0vri)CZZ@pg;nk@Um{SvIJ3WXy5d(IK2@T{MvL)9nwg$`WTn$T z7XoE7zQR@S)PsfxH&rL z>eyZW<+a{)O^SL$`g0rB=QXpW#=i>|DmO#Jl(U94+X>qBbNndi@e$0{Twx;&enPShB z3a3N-XD?Y_UuZaK^DeGAM>tGO(r_~W*SD(0McQSu~t>efIQ7^GMxSJyIt^Mo#({MIly2I;F!Wy}y}0 z%naAqC}&Rb!CP-IQNp`(i)^$aC92|r5r^r=-IU&uN(at-EhKL8Bq|FY^Kw2pS~)W< z__{wb`$oRGmjZ>rK5>*uBNZyy4*X^M^QVpJ_EmX^-mYPKFt4eQ$g6 z_0q*IiTH8mmxJKVJC0Q z7WxG!DqM>=uJvk(tktEYlYx{`KGUkUCb(|Xwu{(m!0~kjW&d;Y@gEY`MI{9q4t-0i zf6Lf59jy?|<+pjNSKH;t#^#r9rOVSNo`}@Wh>2(uzrVN?Yr`d7yUbL#*ktl_p$A{? z;hl5cA>!STM>)qPPWpuNoP~4eF!@)_Bh@XW;pct*Avh7(ko1r3wR9N zaSopb0*b2a>6*BS=0-}xp2Zt0o=KqYIOrI{*JhC@>F#wdTkLMEbu4$M#72<(zR#(0 zqHnWK-q@v`Z7A0jZs|-kNwtL-|;D#rW0pkM66iN$PT9nf<}3Qw5@vOhWrc4h-&|&SldIcBo|2 zz?&#PIP5?nRyOIRAJ_TC%gwvQ^V`g4iL%yVjoo=qtmdeU*8?wAZcTZ~4lkVvkMEF> zFeV744GfH<;_xjeBnmx3dbq8?HjqYsY;=^TO`-Fp0yi(g$;9sCjLu%0s-wAav9TIY zh~#*kLu`agPOI|L8_Wz7W>IrwH7YipkX25)d*RX4+>i&gQajJttHXA#OUdy@GTj*x z9fK?OR%^rs7Us%rU%x16mAAE%g^4|JI}thZ%rC&>=n3)DDppj5*P+d&%X$9&_sAA?zV&A7 zo)P(UfuMWKgKvXd3j^qKkKt2O{u=2M)A5i)Z#Dp`%K>ykPW+>^j{{s;5H3LmA2-R0&n z-IlV~K2(08tXp}=yx6z(aGlQ4^vQH`=ZB@7OO=xW7tB_EoHWQgc}m2m*gA`>>FiA{ zV|*H)Y=Q{iSpWNhrt*rp$H`Rn(+H~kk5J4^s}7kG|L$TEd1iiPR%6tOZ@2YxRJ`~R}K9-_hCJ5VfKqn zrk%sl-|nr-IV|^;pSlk7h9{b}RbBafyDaSY+DKFL@!N!RcM==b$oTdIsEbE)C8-N~ zUIYK{x3`^t{a$#fBR)#?s-_%U6wh25W0>l**QYK>q&gq#XsX}fs)`${uHRz4KE%lE zIg|8&|212-$Z@JYclwrT*I(E!F4d!vf&n0UaYquwur*ez?vH30GF7~g-&zO^$Jb#$iY$9N1W%>D`r9Zo8 z%30d$wA@AxcEQ}9d;0Io^|PqulY6-yZB%HP-5o$hJf`>J$@L@)xm@9q#>`*j-?z?r zrX1hweojZv&^+~1ci{S`*TYh)QpRge{5ti%;`AEQih-MdCu1pL)PxI_6jyW~@CS}v1G{zt`DHS$eItdAlI?mSD4LsZt z`<~kNo_za2h_z{TV^z zSI_XT1IJRF#sXg7?@*qT%?chc+DGR8b-EqzSmyNVdXTt&(o87*&y3jvy-G7S^0%mD zc55U*EXX6K6e~25$VuupmyLY4i#{eKF0<^^3>=DV zPnwlqs)DvY^L=hL-BboP|r zV)d)uzm#ht)pq}QMZ#CY+b!L%%{UC9nu&(l@5I-?Tz^$Ix;_!9KL zl6&w56&SPeRZ=dSYIV^n3lAj=buhN)UsG&%Rxy_yBT-Wap?4bRbG4iu)yA#TsU7R|GKfQWZ z;&o!^hlHRLVZxC#8>;k5;go~Blt|R5RT!&;W;N#c&Mi1Ikg^i)N_xtB+p0jpt5fc> z>1;9c$aj$rEf&U*ID!D82!@^sMY{L2D!cP}r%5^A>iJr<+$YWI zWMp%9XJmgV<9p5S9Afb71F<2m0Dlq~l({S%`abGWEjHsT%xCmbHrv*0=$`PU_>(8f z_LMOiG?_ZLlKeO}o8x->^hDEn9;FHel0lYSDx!^IDUHM8FMsx$PoBQ`fQ|uA?c$}X zQ_Cx!Hzhp|#Z1!`Jkv7#r9$Pyk$OWmdmj-Ox!}(g>x7etJHliFb3{JCJloqA4FP(91GjKBG|g5biI;PAtY=qiUz>j8tw4v8_+_wF~` zdt1kMhw8Is5*}Qz^<4a%Jw5Kl^X6BE^SU(IxaYeYdA}4DW^PMqh1F49HmX?{V}R_c zERAc$q4Q9Z=)rFjlI%J>pEd#|DbKi5vJ$Wbu5YRCDP-e_Fi&5g|MKYY=MNtKt{y8B zcNQ*4XX-fYz4pp~l(58|%$ zXqT>2zVWp1iJO0Jlcgg1psY=Ofk-3#A~k9&pA)NSbIWhqu_${nCm@1=-%sY5zO ze6q^y_P}Uk9LLNIVaL;ZHR(P6hks^eDYy~z_L#aHYknWz6&h>da4}aj{f%Wsv>T5s z+XESu7q3P+epm0IlMw2f9Tn=$E(9$6o{%ouRxi1_K{*${$rQqI(^Wd>zgdk&mAE7IBXgp!)* zz7K2c^~<@A`Z-BO=7&0z)t5=b=hOHizT6Hjde!@8pef?xn(43zp_6ZcFn)2#?tBh9 z$usTBQ9VLgyOdPAE$uQNKhX)vFfg^a8EkI8M@-T)@yCxF)6+Qu*PEYg9WeBo%jWz1 zrRAww{9;H{wD9=ZK9SYWmj%gFT|~TtCnZwb8EWN3O@$`-=zr1gi_m<%CCG7|(xVYqxe!mXwqEQ&GGJ`LlZ;whhineDx6asUcd1<%FOctx;`w|%gN9G<-=;v z#GTKjCS%`6J+qw8+njcHU+?g`b11%MX~Rl+nk%OvYPKrk3lHNkD_N0>O58NzM-{*D zm73JQzA3;HSc1|rxB=h5=eaElQ%+Ar>{K9DA zXdm|={bZ9;i@;moA75!`jxA(Y9}kLF*DU2@9A50hkKrGDWFAzSy4ZA{<0%Pa>*Wlu z#E{-zKK=f-_hA>JZ>Vb)CdPIM>)9E;diRPW$TdaIAXNR*1@_ZIZWo*#9lOQmzKU>> zr?6Bzo}v|(BaOY1o?|mBd04;yh|yWS=xblh9l!3A|Fx!FNMoOUJ}6AYu<`z(8xjFQ=n53JRNY`)bXbt+Znj3zn!_(ge} zwJ+hRyZ46(JV-{KPp8EOuyZ7GB|K7z&`r~HN@#8=KWv*FMJm+#Xw+u3V0WO7m0a4{ zz4EHs#M*&usXh7+-s&gn*v{KdoU##r=VTvx{j`R_NkjjP7OTslV-x2mFKP4Xf9%K* zHnO-##@BJ6`^w$rl8-NYvn9jH)Xh0uoIm0b`t4~=5Hm9U63{VwX)t8&oeqDD({aNW zD^@-Sf`VlAZR>6de>^%Y=3viQTk1DnuJl0cmjBniUDB?urYKnUw_UK3TS-0gR6zbi! z?WX%W>>2nbgl#UCT={e8nUnDrLsd*PcAwd!5B3#sRdHz%z9=90oFjBWF}`ZJo~V4v z^g(FK{YSPnj+}~I0XH~irR@_xMy~j27m3$L>dx?)4R_x>FLt77&Sd0;ZOdfig%67T zMVDzwa&9uQ^nUai=+`)VPBduEb|#(K6QBK!uR+q}2i>HK1+O}l^pinX++FYjtjIel zRa8i2<<3Q^az$$koaeEhe92P1_SO8BMQl>4>*2x+{9tB*EqmWMqt58W+Gv`A`rW{F zpA9;Lbz^qVmtFVwY3c~o%}D0_l3|`s@52|5{&ga`WH`@kF+lh|mNPD{# zT6qwR4i#I`JHGT9)bu+pMP9FXNpSMf1>To;Cal{x*gf1<5BeWkxu;6Y(R;gY-7j_N zo5?St``7SUsd!qao9%9&e(w3bljCA3bxv+iwt{H5w;ahB(W2TgmmlGtj=km4?W6kX zs&1-}dGHq;Rot8&3uX6yEIgqf@ZxEweSel!%*71j1M zO&8h%o*%*VbG$JDBzKp)j2a0SXrBIV!~g2;7(AzaH_n2z@U#7Bh^Geg1JkM7d-ZFI zJ9NDqeVs~-JI(7yCWtsme4ZMvxjr4`v8mAcW0~|m2re83rJ1D>V z%F%uDkuM%D%}e_)a%|gZQQN$2``LkKvwWST7x(SSAF^<9wG(2U?c?ka^u2H3XWZ29*CC?AKh?jr zxHlnCQP(SPS;7 z_XEZxj*%3u`|2@s0u<#I7N(>|gGP!ODtxVq@l=JxSIJYkV%mEuvv#wmpSWqe@3OU6 zT;q@Ny_Q|cm#s{t+XimB#h0`c=te90j_0$!HTn{)78=p)0cOEc$KG*OSxu#mY=}C$ zOrE&TEoR0S7ndz};E~A(&XvB3f_p0*Cwhf=FBHUf9As3woh%(bu_9@jfge8~KCb0{ z`}3O$4hq@>0n#^^+vn*VGYcp)?5&Ch&fuku7rCi;jQP^KkhZ+zld6ws`epcpiFZcj zf~~?kaSetni-G+8vd<}1iyFUmE*CAZNG0EX=x-mlNZ_Func~>&F?`d?&TcCIx6JLdjr@9l}J(sGs#+%df|R*8Yr4%}yX?OAx!KR&iTcWs59?md+_ zNhcSpun?mVqXI=YtE9IU532*CY_r2-Ne3_4_vxnz2``=03wRRRRFR$FWEdGa-KlkE zKtS9zo~45ON1CxXHK2wl+LdD5VC%J9wq^^1>0K{Shaf?L#Z0Ps(|x zsIfn_wq*?bwf~9dg7Bz!bO%c>@8`->;a$frz8`)yxlEmV&T*CVg8iqTo=jr}tY zxl%qV9W@W#Q=ny3wWYwvDzx&Ba!{)2yt-bIG5K}REyv(P8Ep@vmRlq9L)MoR)*nep zaC&=uldP@WdariXvs^Dsx=D;yzH0W%Pi2lbn|9xZypQ~hRG=ssn$7SC-bf98K>xAX zHlwO9lHbzX!OJOIHmED&rsraH&@HImE4gxsG4PccX-vG=tlx*9DfJoGlBlod?2fPk z>me*9bk5mi;$$IQ*L3)T(j5aPN;Ne#waDoR<6Y^UbAMOd3822$%lS_FLi!{zU+W9% zT~ih2z5XnB&*=54*pP?yhMrQ&)w~~T%WytmAj#@?%dO(rqr$VhRd zufMfHDDivU;l~%+U7RX8_jrb7S`stcrnlPgybFH_pcdGCdrb>Ry{hH ztFxO`Ip;j>oRHeyBmJb!+H{iX<^~Znq<248e1EjoIkx&)aeP|3MMh8fw;=g1%I<+0 zy62ty^zf~^;@d7N>BP#o4=zCS=5K;01#Cq=rx|=)o~}~ip(NI_;|h;>9C7LAT84IQ zfmhwuf%PLF>`v^@37%mjHmM-v|NbI80Mb!bkq`038_JYb_lY(1qVN;FVUj^5H)_f* zY}NLB@qyi))cu}6V&18y#j5;jH2$>QdE9<=!9+D(Y_G9ettP2F&&7RyHR-LSGMdUBX|ek7J2TEr?@F+u zjx}x93r`AdOU#(}_TgaVDBowp-8UnvP^q8xgNLG#|AcXYSnT83OG9VQxgO1w7mN+% z3S@ngrFgmEbx*Vd&7;|zZ2pdhF|8^ZezWNn3a_f))n&AFRX_DiCro+np6Bj*Y~`}w zGP~u2a{t|13gZbPt*(+9&BM5pk7kGriOU3?JS49x0zM+uJCU5^^f=O8v(U;V#8WuL^diX`=ER zikVHu0~e@P`yK2T4hKFvX~=-5z*S^c)w~(|QmJBnmw&(eJpL7?T@=kfdGLc-O^I(g z>a$OcmELcyh}q*AmvSZ>F!*unY9I|(ka=-TpYyl0gdQHC1}g7eX!giw3p>IiDt3>+jjlqLZKWP za{A!xJbxWR-~@q#03|V`hFP^y8I3JBtz+rBHYybpfrivIG&J@+b_{9g7)gVos&L8G zFJfueMI71xTkiYGx1mrYpGq+|T;xpuIO(<|j%|BUh8Z%sHb62lGzhi@N}(GXeyDG#MG0&Lk58C9G-h(FXp_=mZBDW#Z?Mo1BxK|OE=PIAE?qQ63Fc

As^f7>2Mj$)zNHngnVTBHGHWgY)mp{Y6)z34@WTA%1iBgQQbgY{!m3+u7jt|4sya`*ZXYLTLC28Cqb*qme0v@5Ky( zv4!{U`(BKBY!5Oxry`Ji{TD-s42ys^6WyEqt^88mk-^8@cF~m)&qyQ!|7HV(MG!iI zfRRI!@DbWauBh8Gx@e(<;9GJV^}Zm{sKF>Mf+?D|LrY5w`;MLDmG5{5druxAA+n&u zTfX)m-1>pHP@0`VIJi0NktGWA3Bs}10!(F*7dDFw4NdCopS9RmuqfC9%>c)-XfqtT zQZCmOUPheo3WexWqpT!*%CMsV+b0!|PMVx7RWN}TO_CEDh7#U8?i?LQp`;?)lAt_i zGB#AjtQo$H7^pm_uH?p-!!y0Z~JJDP|@PQeYe1d=2CoB?}ieCe{5R4yEHsf&9Z8=wPxA5|0u6|=X>ZMK7+(S=F`0Q zyIjSoTG+GqD6fCt`x%{{L!guC?BKmW{08UVcqN6IS%l`+^=l^0_-#9m zgOHF;8{`u@$NMYXaonnxr5fi+7mXaiM3L{~o8xo}LRUP)$AP6J3 zar}~Ab$TfRga%3|Y-MrY^=oMD%VAb6G%wi6_p&N9tPX?CE4Q#9w-nIX_0;Vgd15;) z={(ddbQ@3(Mk)tLgsNc{D=u+V4kBTo=aLK^+7CG7WfpsQj%Alz3h2z1D!lZa@8=&s z{Y5P0kjrMVEV~{8>hUZh;mn5vqG=ORD6EI*pv9>As_K6CQK`xMzP24o1l~u5xYcaL z%?~vXp`WuO{Co@G{jX?1s$k&0nLtGT_J5CvT+vU%YS#BE;_A<{8F^z3fIpLh3$SdH zmVBCnM+SJ^2mXPP=~=+0WkC<`{lQmQf9-h`Cud!3tOf(c1ykH|nKIxrD;By_#qaBSlI}dh2An$Rz}x zl8vAHAcRKQhN9`}%9;iW$-1n=b2|jxjzzg-VxytCm9$*$F9cGTNX<1YN+}rFGse@u zJ;>n)2hl{HYEkjjZx2xzvJo{6S<^6-L1n^W-vcK(vVDlz(`B%AH*qGZgK%&hJ1{UJ z1(xlQYS+2wd22yhp6$b}Vk8`eqiLAEEi7qY!G^xgfWorpc<|2eU=|B#!X=u1^&JJs znvL`XtaK*J^yyO!pEwF6>FVgi87Y$Q>;eqhI(pcA)lGoGfs;qL^&RixbKm(Pxm+to zB8lw~2^9`Ot=={0A6f5n;O3HM+(=!|$zu;SgUWfHpO54;GsptrnVa4fDGM%w**%*= z0?+1Z)=pd^h}sHNTdN=Syua5Yzir!O(kVv9rg*~# zKFHA61R&{Nww(9<^lNl4U&7PB-b-!PV#5_HG4d&FyXNMtEBE|9O_yl8PI02f@g2uG zet3vXcaF_hui?Dac{XG-bO@W8RpVe;W7=|ozAXW3a|sM#;vXcTgxjW+lA)5t1LI{N zN#1biN+`P18odTA$y8aGk{lSZc=+@TV=_r+caC&Q!>n0YwkHt?H|BrA;#SN;g~6jE z9NRlYHkZaMn>=yXJ{B(R!f|YBrDC5kg;q!1i62FP@#=vmax!j&DgF32KN2~69; zwrsbmxRlf?7M-i}Y`Ag-d++P_Y6g18msvJWSDtEil8csHz`)p1O0^j#rw;Pu{de%3 z8()cy;{`u?(wryJC>+w+90N~3fn^ONv^KiCy0MEDlIb)?rk(N86TJMR|B7glJpG%W z;?T~&e&usKv2zdq`Qg8(tF4tnVFpdp@M}0ky&pkpcQe62)PYkIkgkWc`7kaj`p3RE zu}O+1Z3ie5gL3zV9=+Aj@mZ?l{8?8_e2Q4;n~=VW;|hp_W4 zEMJvF&uBOmw^pAcAl02@L-z_6ukYpft`UZhP2ea&&9dk}I*cZD%B2#9u9M6dIJS)g z%#D?q8!2*f_YnEcG`*|4=v&iErYnst9Bk9IA(X3CmS5b*^jMKodqzm6wZK)Y3=O9{ zPs^Oi`AaWi+tELwi!}T9-^J3kn^<}7R&2Wp2&8n4e~#&(8}3ow2OfVIkhEty=*e|s zRjZ^N(2@pbsl@jG{WY)p^v5}UU>{>gkD=?W+_~*;4!^md|N7T|=7MwAFf}!auIcXn zJ1z$LQKg|V(uWoiN6`9!oCe7C@GJ`W&4|P^Nd{v6`}JrMv@Jk;=NsPiG3hjEI8x5& ztRrY3agFUXOe%24MRlzDIP0j0AKq(v7-Q6}7uXd1$SQyK-l;Z$MK?OA(0Cc2uZWG; zpO53XdaTe4-u$7D^2n~o5M*d+YvrAv`**5E!4p5-P4}WME`7y0n7V_qRiOIl2@RnV z4D1|c$K8h+8=7L(1&i5w(?(V-%wbp-6Q;%SDooU%Cfwt*bScrK+yAPh&dL@Ee(0|^ z2O$g|o3c1rg_P!?DH|QorCa!;sx&5Q8UqCwsVG_#u(>bG=EZ4-2WNTo$x+HB=xk4s zOi4`JcC+ss8>2r^|+fROqa%?m$&E(7|cii&;E0?X|{EcfUmP<(CyH*JR#kUPa(L9;} z9P=wRL6NX>b)4D841e{nim<)t@3D78{Mi^Pc>f3?<|hDg1b!yV|FgFl1jky}x#Jp7 z8Ll_T`OnpVB9jUvjrt7;pN)GJBV+f}hj4t6EsY|-H=bNN$9q2haen{6J!o1xQcv-c zcfKEs7LGpF&!RQmY<<~zSegZnSJhZTBAsA*u*lPYI>ON%r|4YN!WFli%c^s_Da}VP{mLTSnPkzLZra?nJr>&!f1RjqL1^b_QgU94TS1+BZ4 zR7;LSPd-Th(I)_d3)XF=J>QM33Cwbhy^q{S&732X@1@mR#QN(m#FPb2?%amZGN7Ph zR{7n%_tKW{;ED?`pjxfO>Rk%Ys2Lgt>g)VBB4%TC?GUya@TE@lkKOmtqX_|sz1Q%& zf(Wy1N&p(I;!%WAu{kty?HIayNFPV^kmHMaIDcbXK|({bD>})5C^XOC7qRC>OcEiu z7ne-@c`Dp9`C40B`Ij$zmGA!gC+J2ywpHW07r%jyzSWEmO_5)ir#JIS60PBAxG;-YI;aLJ7usLa+FI5I>+*GObjNFmX}{lyW2s#4^XVryH9&233$ zER!>Z8ZEk8_RCjYq!0{MOr}glLe^z3h%kgy2+)OVyqYjIP82O{WwNoeh3n31!$>F| ze`=hghYKV%Nxmb6p=&s{!nR!}VOw9G#p`=W=muj)#wm>zJ!wP3$QdLP8b&e+LgEP5 zy{Q1h&_FY&OqmQHKf~~$F>14J-o%2{3n)&Om>!%VkuY4tpe{+;0x>d8Piq(b6DOIi zP6JSzE22Asp~<6kWEQY`(Pp&Xc7zZ-e$US+7N^K1TDW}8<>oA;_mJDQ7OW;&)JIYl@4>O2ocKq0p}Kt z@D@Yd#-g>&>|{~NImVOfwOGHzeDtnp#3JFta0CGY2|)7+Kx`nPR#RW)H;%aVoLe=# zAIv4{?`zQGRdew^0=&UpAtH$CpTHwRgbqegZ#jwdChAvGMX5l1oZjl$j!kEKJ74?3 zPx$n=zK&sZVwnZDT=`PgU34|YxguIpa_Oz-(9)O1saYTuMkYaV+~mnS4{&<_BvNWT z=jKf;TH4Oe2aYl_G0o!DU9@)OLT{4Sx2+^fS*%JLoZp_q!s4-+61%5s%v1%da%ptk z#8r<#7Y;p14byU%vvIBIe#tB4|L^Uqw|1HY6N90uWT;rBUAMVtSu2;F+rea^#-mS; zF*#Twmrs#zPhv~lvjJ=ep)0yqx3h3l7gTKe_ngKmI^^5)WLsLORcbg@%PnG}OEk}N zC6$BJ71Bsxn=mmj&6$Iv6er5`t?pss^bE>$5W*#ZQcARu88TAG(FMoGk0a5kRA(_Q zheBnN#ceBD(zzD7q??J!0iJ&N4}im>-sLRqUB>wII5UMYCT4~?I(QJvu|YYkUU@#+ zT!O_HuIJ3y2}X`SMfdUx*z%&k5h-A0R}7h~n1>bO-8->Z0lI zjRYVR;gzb(cJfGD7_{Teql4G==i{x4hDo}Wa@+$ZBl=h*`pNMF(>;H=e}q$`)iKha z3JHtlShTmc@rV1j^ZF0I4_)T4>?*6yyOJwzdM&k@O{G@hoSW9L?$V`HOI3uXNTv*i z4o~s)-AAdF6h=a@`Jxplt;)dzXIOo1AIr||aii-T2O(sT^<_JXyb!F&Cef9}@si1` zZKG*AwsKgX)48l8jpMj+08(lkoGP)m;MVT59ETalpekHDfqNdHr|O_$t|gzS+m0fk z99E@aONT~ElRSEKjvxGSl%bg#D>k&TZc8`GjD}US5RP|hkfxDHB$*m0u>Y%>PwMwczj}$s)v4Ygy^Y(N{kl%Hhgh_y2@lkNp85b@Hhe6oOKvM zI+4heOLem5qDv@?8Ft?D2cW_$KJ`uXOoku6`!#4Xf$fxe<#TW5vmgB+rd`FhZLczr z9|jO{`31o|swv_H&=%4Cqls(JY$0bYA}nR zgwu>e*HffWH>y+C<2?mLqzOg!Nnb?bP`K_eg@dl^q|*tq*)*9{62mZDKeiBPnnuD% zkV&S=rL&|nX=Fl2Ittsif_`OWyuM}EM}FJ3$>lTbKXHn``iH-#Qgx%<7A@Pv6)$={ zj#8L4n?>jKa_)62sa0wSU64rV9N#g_&OaVOSQ@&aVw*?0M`tNbl}Tv2YsD}X%CwNCjV2{3qUXEe;u1Y!VAX6K(~h04 zBXkX;WTK7FkxjQUXB9X-bp$C4FOEdAruQ7CE0a9<=r1^Vcn4DGNKH~Rt5j+g55XMb z-g<%K)F@WQIDKLlBgapo$rMUenH)IH>pu3ctiI$5p1%8TRISFI6Z<%RVvHAD_dF1m zdwiR0v>OGm8smD61fZ$zU-wLN0YFDAz=uF zu3=U!5-G*%t&3T{xev=Wy|7>RC@;6RfrEyiTQhK!%|xw+5)xhWh?D?Z30joJ^LjF* zH9u3(!H|-nqTWqnFLxo zdPbs8klaF~{_mCvn zM3Pj>AZh403M$narLsxIsQ?y`0#fKwM+k{&n{+Q)%uRp$x8(92eD7aB$lUlSP~oN5 zy@W6Q>)%tY6;O^_Lfj31R&|mYaS?(}Dt0HUg`PsZH!Q$7LkaVv(AApr_v7>?fi zutxwyi~z)~@=-*uAB1S~y&n0S4L<%}*tQJ)t6uuAFRdxZCX-2#NTfJ*W{mqEeUf_~ z+Rjr4_A)Xtg~IgOjY<(tq#wuo81%Ncv1Q{XZo1}5uGxAq3m0@#EtjcOt4KdtM}dP) zOSX-7fArt@@gIMVuC<^whHAYx1gYATWrW@ zxU91)7U(2|g{>;wF*w7xElKEJ4FeU)jyP-KNAFor6_f}Z0hXg^#o>Z>Se?%>IalQ; z+sC=@sWBvig)3TEd2Tyxoms4!S|6&bM|Ihr6-w#huzkE|*(nFQZ^^81{eK8l6`LL!8Q`+4-K!;H<%0ZF8mM5zkO zDbTm-Qr2$X#FO{kLusafqh`77g|Fn_|M9()%Ech7&S|JS5g6F!Q8(wqoA`c(rQ}0~ z8a4hk#vb~XF<0V?8qwX@;xpI#54S&(gp+}tr6RRW7}j> zX_BcFI}h&X2fz9wfB4gbjLi7QV;kN(CN3q9EP9Lx2;4(A5+1E|%S111U%*RlxPiZX z$&IXAzJg+@M9nsFltX7*7vK2Nuldkt{uM)S#k8ti^@7`2vE@=~RSU;~*6tRzzHSSq zRpaDir#ZU&42GUT1BQ+sLMpiG`IoTjip5wtDA&w@v-wec(i7!$FI3r)u0kq3@2cJd(I3;S5OejTPR-9t(|&Z!|lM%=c7p!$u5BD<@f?3~5v(g?rb z|2rm1;}}{J%dVlQ(A(L~D{r}sm%j7{F5bGCbVoNz=?F{^?onZZxT7Qp>4u;Sg(y#R z=ExE5yz6oP=ZE+5@Y9EJNTMh5ShY!vM24QeBT!h*H1B@h+xe$=zlG_kaWtt1 zCocK0t)c`VdiqurA0n_SVo|Qm2u2;6`-NGW3Jmp<_n$=oqJR-abf@lnJt99_Nnjqr zA$(obJ-*6OHm$AgoH{ka7rymfetP#GshLF(X&0GQ8L;WgwX z7`MLd?UXDB9Fq+fUdN@+e+iXp4P7R%mBret*OAEU9Dei|)ftCmGQo)hdpWvyHy50{ zi5I=*29|H>!%o(iHEYb-32aS)a*&Sn{N%3wErQ50|GWa%^{7dQww6`~o*L%Y|Mp#` zwmrzAR)e+YE~BNrm9dd=4nBRH8OvtN3!cLzZ@!JzOV%+{nnhL}(4-eF_)J8=-!2t; zOO!h{2SLqo=#X$}o59kYU~JCh2lt-h;hl3hNOJ8qE7vbz*_s|?O2@34U^-|?4MUTh z-aE#Vzud{5dmbcV6*+gyW#kqtrkWP0l8_9M%(8OfGT!&Lm-4FHZlrVRQqSIN;h1&^>_P(sj;7o)VBSF}O4$gd+$c>=B7})E zeTF~Y{s{l{>7Vn|fn#V|4yhED7kK3woHZP$%zymd-}Be6yoHIGDRgPX3(!Q}=Bn|4 z96yi1S7YKh*94*KB=A52m^XhVs$xfM5zkBj;$ldY0K^fv8P#e2d-ED=ahl*;q?Kb~ z7#fL8hVT61PCoOs|6+1>0x7d7RYj>X%iG(y`FR&}!}S+%@ui#SUeO1+79d4@y_r8tmwru6aZ+#m(kMBp2 zpljiJp7*LZp`>s{J|Qs@8d@$*Wwt_6Pcbq+$Yb~Z22m*S%GbW0>tA^V3s)quFd3@V zn6`9WzqsX+NZVa9DSgEyZXmL4n?x!>N~HP8$Nz^ved(LL^x`$V^J8yi({(pOD(`Kk zjXimcCw_f5U;n~Sxo_7ow!Zc+dGROTg39WY=Spt1Vdguf$rm?O!#=5~^d~HAN5ilb z8(I_>wkOe~&L5u`=EwJ+VWw!4R5rOzot2vxv0!;8nl7l%H9{K+7 z>EHJx8WlW8=9WQwo0UvI`4nS zYk2?Pzk!yXg($m(ZPpOV3k}xX0x3!XriHLeIF(7tqjNA_MpkSb%fT`QRZ}5TX);|o z(hGBl1v#ujfv_58E|jaS?=pq;)o~9Zy@T4^NaN~a|ecA1+S;THV`ouKC=WMLX{w9{ENHoLZVkM zy7;0Ev37hnpxbpQ3JKu`jO0>DW-1jv_^Ge(>p%StDbudI$DZZ9B@6hwzkV?uY2E!*Q{woACACebtl<*5PVr%v26_bLA6 z%kSXoH@p_5cYvw^1#oKa@z$h(Bto6x@gMz?554mn3}##S+wcAhi!WZ!)Z}y+Vyg)3 zE1{cL(afzINX*{0O3$5WJBl71F6nTOBs+el%C~jB*Dzq=iuxd*m3zv4H z=^C|a1te(7VDRa2e*cZ%@W|b_voP1jB`YqXCDDn}ZDeZ>(boYTc@ix-3gbiE_0w-K zHhciX$Y7e2Y~6AJ-}vf3a_-g(v8^hOWg;|z&~(>;>nNyIu?i!|N(rr6WoBrExr37w zhE0aY3hWyiD$Ed4hhilm_=;HR=zQcoujWnfehI0b#hBAGOr98G_RJWyN)@SVWRjBBY@S?e z7QM3#@+oY?04<5;aX{tZ8ma(I*AP-;ZfJxreeP%c`&WO$Y^jW)r7`UinoMImRW5n% z%h`C@)znI+d-M|ydcr_T!O@*h@#I5)qBc9rC6`>qt#5oe&war5*q6m9KUvbm(2((2m;e6ioM$+fjGdSH})e(B$GOGlnB{q&=xHm$%e%rbkR zpQ%HqnLa&9X|9H07_{`HXy3Siu8Yn`&n==ha+3de`{()kFCOM~|MelZzV-!7PD~;^ zZ-?+*NxlanaFd0EJAeUHP^mU>Jqd~BC{jwXzQyAFHUry)AN^^F-)|d5Y6YMr;(b#w#$6zZ(q+xKmAS;*;dS25lxdwsiUw_W(_qri#Hzz^N~~M9hTFgPC9)X<%d}m|!?SJpMm(O807SfMf%!(n2|yj@ z`9BC1s*R0xINbX(uD z=3Rfs$-(0!6YW%M<6M2t8vf_2?_>F<#JhE?^ zZ~yK%(*;37htkX(mSdA|PqBDaFMVrzXz5LoO(vKduCVQ=Pjdf{e$2^}J6O}Rh3Bj| zpKKz{z~lh;9QYkoRl`xxofCZPi~qpQfAtD1s|2{G_fjk46sJ*>lgQE}%Bmp}8q_RK z?HXt1#2mGP#!sHu!?&JzgsJKzefk1!T6QU0d$!P`Wm&eeg-y@tCbu$&O5v7ZMnjl3 zwb>%V0GX4#{==W)2iu=Q*IT?;630Ex%$eoZ>t4iv{p&w5SDNz(K)8-kRiGh_FNkre zbC<{Re&;g^HX8SuR<{ZWj#o2CfcCD}zv*Mmu(xSwVuK4X-g;xAP8j>|HA3vb5aHhg zM>!-7gUMo<+ur*Dj`klRooJ&{o8k>OK8K(D?}y0O494#tfDu7QzLUkPm$7d13O24- z%i7Eu)+ATcmtD$eMX`P00CyeO$&c>a#m@bMENjoRqBn~(HiSJnj56n3anVSk=?Ro= zW7jHluUNusUv?Fhkr^J^u?K0Su+18$PaI>}+H=UXcB1PVNA~RC-rK*& z;G>86mz)2J58rSOAN$t3F!dTweCt7;`0v9!wtI{p9oxh01ABRT@+1f5hS)PR#N(5v zIXW{%dDLKb$0X$=hv`_FVDn4Q=i1dP`Rd<)l~aQ=Y`x_gDpnQc5DT`c-}eR>@Qsrm zkh$fv1X6;gB(q9mpa_n#xM*n$mu>1|bfUz-Sb;Yxp$0`<(wHjh>0%!Or zV)!&-d=OEY1!be95>&^F?7#OobEj;kXW=8a|A8OueVm$YbJL9)Da8cJLlIU#O z+QH_(SV*#4$2M!Iss)xpm|mIjlJM(r-kJUTIo_PT-36Os}@}ZGR4u^VRjE5=Ldh-Lt(ta zm6xm~sXM62Y2?%-c3~WJfk>nvp`lC*kxX#IO&4K|%yRFOJJGcq<>RH!RuiN(4XNDv`YAoh@$JLxfAAO=KYtAi zm*=T?#V~!D&P6DTd`F%mPaNT2Zg~^`eB-73zc1WIxj4z6KKls!?i}U*p;P?t@ki+| z4r6(-0YYf5IF7?;Wt<&TCzz~O(MNL3JUvHi3#@(dGXCPibNS9kf55JNC%Eio&%<_Cs}dPT54xTVR{5c zk02*Ukd*?$wmj9wLZ)=42MX-Ds~@A3W^B&l-9P>rkB=RtP4D5&8*kxdYp)?ig4s%u zi=VfIwbyjJk)^hS6w=)r5vGtU<=Q?R8;oRv7i_(NZBHKJ_{1=pG!Rk)ER@pNw&N)- zzu+QPEL!NrmADdK^GsGB{^R%(kHQTwhA=500G*Hl6KBHBFW(IKtO!6zDMCrUxq&Y# zM4T;~Fd_^Dt_aJq=xA%_3;**YzH|EzNF}s5U7qwmINbs z7mE3e){h}<>3eSam~w~hod<-mg^>r?vjY@RUJTi0Yhj4Eu}GX zY!Yim(bAj6Q8rRYrX9hFg1~ZYu3gi~1*_XQJ~qqnluas`WNu^}bGATRS0^=7a{AZ= zBZFgT%0M?IM-S~nIW-)o!UZe)`0aN-$b#ja)CP{DO^+dqQ%Kteq2Y2zH%>t&45m(0 z*mL)35~P_d+r0b7KjFaaC|yP`f4AkOT(NL7)tX7gta8ECeXPB_3%go%5#I-PAp>za zieyp>Y|A2<&v3 znvGgV9Red@gE!6B{Si$C^m+^wxZ%RjKma28Nlw%_kx1xNtAeNQILzqb z87{tYB?~sX6>z1OkMFBLmSvIa$a7}*DgNn}xA1{0&gY|_c^xHdn!7gG|z{ILHC z9vV4-6bT5zP2E3CM25ifb+rTp$|zvsR`JjvCs zyb;R~*k0_tBnDQET4!Jna@nFTp|vy1$$hg-oGQ|>EbFRPwwuK_XgZuOnXK;2aQ)_m zC}nYCsDwsHWP_uS3CZkmnZ0+PLANxdO!59-{*>Jlr)f9(c<;rpU~~Hl%4P+-;;>|0 z3m4tE1jnqoXPgbj%0#gKl&&FgG3@pds`2MLV=-) z0a`L0Ty^OMluA`J&BFl|#hZx#zdn3Mgt!z>vr&YVbPb9hhpFhOnMQzyC8k(*LzRnm?RH5Y@ zyo$DtD-m=o%aKmO$-{GK3NGp0gcOo}Q>QpRJ;B~RCwS$J7a}D%wi8&jeWA=QmPt|J z@Xk|w;Rp9KG*R;61Zr%3{$KF!&wqgSb9)&qR4}E)(0p5lB9Stv&MBU_{Rq>i3S9d9 zue8r9{=LoWEfW5AE2`iO~_NwKBcEs}Taqm*A$t%YNEYmbewYT!Xwtimpj?Zvt zXdF$Zu$?Nm{Pml7{U_gn>drFjxgMoQfE-7mCk(374%==&LSeMbr8h2R@#aoyrh{}3 z>H#6V^8+nfJ6ajsagq|k`i#?MYa$@Vh`-Tsvwtfh#7 zLsV>!<%I<{f<5CWNoI4j3@53bo@4pdJ=}83W!(F{KXCg`?&F%5z5p$!V^u9T#zBPU zo_f1Z^q|$?EJEe5U{wplN9GuKVuEaIhD@)4a!Vp$OBk*=43%s;x{@qj-Amc1A=4Qa z^seOau1DGN_^&CKra?%gQvCeWZ{^BMmNGLrN6OIMpdjHQJdT5Mlq(e?5lZ9W14GQ6 zG3jb;;g>u2@s-CP08+ee-3?sdcOj)(8C{o{HJeo%I$3pbJC0ey3lNMTiHN~-;GPSE zCP0AWfR;(HprxJf-}?ZdQ>)FfcHKn`j|@_-&M;G~a`SVqqgt(cYo%h?;CsY;CK~Li z=MYdaw|R7YaS1&piAU9jh|u0F0PI=W0K$8OVoA_zG#RCyIQYb)PNMMs)P$sF3jY4z zKEvqbB(`JmoK>s%@_XKlFe_emo(L(JCql&xCn|yf%8w-UIIUYNBg3U|%IA_CRD#bDqiRIX&+gka>uXpqEfA}(!WrZe_D97S8|M&r3 z{K3~#lWs8#O_Kp}avTREp;MZ+dE{4zsZ5z%_JWlx+SEq1R`U=s+)UfFXzgs}_@jsU z$SrT-9hYt5)BkxJW~#>TzjBa?-SC^?9o#+eG@8g@V+RB|PMWD(Z}$^E>8-ug*gJNd zL?%toXpXtTNmg9d&5K|B9Jc@T0e<+s-*MH8|AJ(Dnp&mms$31Q5a<4ZEx?lmgbrP+ z^Guv7(ErpFLeptqlyZI34(L))5HM0TK`A;Gx6`sXi%h2JUc8a=l*#1C0Db~XX|~8k ztCq8{w~bn<;+9X3BEN9GM~0zuV&^1h4wh+Y$&_xrGBDSyK?@;vtx26O&lhsT6_|p?R85kd@W)@hsYy+ue zJCl>AIB@hNmu|j*HOm%Jt<}6HLYCfGw@SqRkKK<({58?jd^J132N6lI5+ZVHQ}FP! zv;hPNUN35>_-{=pO!RE>s9xhZ4lVf{zrXK(zWs}zkkDGNRf#YD&Fk5;eie4P8d#@8 z^{dea;p%|C@xu>-z%$@VgrVqIm|@_+G^VM@=^DMcP98e58ym&0!~MMay3M2#8nv29 zwzY--{^2%m`}nu8L;~elq+8l}|5yKmtN;3D=E_BPi8W%#pGatwW-PYfegu0Ku6)5V zde*g2so7}4JFic;M9Q`;+Iza#dDm0?%dKzcgEw5lC;t64SVo24e`O~lPutu*wv%5U ze*{Si)g=77$x3_wh6FMoz#igAH1V>QBu9+jK~! z3>GYJCDEQF-?ai=wJ>`6IF4Q8z`z-PdC!ydb>!HxZW*RoMcE*64;E1l7>2?0nKDNn zo5IiyQVE04-S+@HhELLySioD(eK9$aMB%svRc%OS1m|4YgOQY;)EE(~BQ~q32`p}i z3yFa3C}ci^S+)4>qmKefOv`4=Mb~loz|$xyjE~Op;v28UwyQ|tuc-(k_F`n*r!kRT z4M>9LLPtao?TtzSk)y$UJ4Su`b*l8UwgHGpU-f|JFI;FStk)TR#8(jx;##c#>GR*< z)R{Bb%3|xXC4B15uS0XpIMIk~Ow8#S{Vg(PUpE%Q)$dd722Ke^kIiA~HcK;IjMqvW znH^+ec8-K5x&GocBoYa}^u338`{#d*VdSu_G7FZj;)CD&GV8D3!pwBhJ=I2r{VK;j zin>}S6QZry~KeG~ntbc(*|Hs(%@vE(_6 zxb@XnaQOZw`TA#n$R#&Dm-fZoR7+KNzJy$)SrJR&NdiI&99toE$$}NFXi0<7{we0l zMS7RC28PQhS30H`IYwu#xnMI7B7{IK~QLH-r?13E=XB?h)@frj+HPcPr z5lSH}!GTA|FpGj*CdtmhGkoEJ2eHw3)$;4Puxk}n+eG*Jb8JPfCB^zndJw{KnMB0a zF%KV$AZTO{{54UE1uc2Ld*^marl43D=llzEX)cELvB5=UhnO1PFo|F?aRShoE*PaSe!!rLwGuuO5z~V+{ptyT@G`Iz z$yAbqM+f-yH@=G!21*tA@GD=%B^RHARjzn`*mwiMxS|B0=_jf)xlwp6?I}(jn!u_7 zLSu1DC)hym%nHwt=)oZ&GXSqcMOhYqZtORt*!j{U%tuhANmiz|H0Sr z+7Dbutun{$U);s%omC!~+RrZzZ%2}fAb%rI5C4sBd{k|VNN0$EG`OSDI561{NrS$* zHfE2G(06GcH{W(G#T`fa?7w`6%~x$@!OF!HizPRu*e54VBFtjZXVTA%XrQD>%j5NE*|_il4M3>^#$!n&9@)xP((Kj{46X# zk3nbxY{3)1KTKO&E0?@rC5fcMG(ESv$1QBjBHfyUip^(V_fHJ`=nj7U_4jhk>o-#w zFY&AY+{xhHDtApC=8mJ=ks{>E6{q6K)^L@0I-gq3`f+%`q`x^;C@J;9(nC!<) z=q#FRXZp|>3%7Lf+}B-3;`A7w_`p|LdCq2*UbvcKvFM83vAvH=0MU?Q|GQ&b2py71 zEk>~1(Zqv~q>$bb2ZFY~EDKil(ABenxk(rqJdB|k>^n8e!%rXM`b*EDw>3erSmngt zIqaHECY5B*;5c91_5e0IuUv68>+;Jm9V;l=C50;iRjMVHZ0sW4nsftyBIkdJDDv0q z+5s4Q`{Ek|l|tq+oajHzpLXp8++?#$x4wXp;eMv3h8Z|B%mo`Zv2pcE%GFBDkctW; z`eG*x1cok;>?;EMNQkR-1R&;Rh|EF6(9*LJfcBm@yzyf}Q>vZ-)LR|@0l)ZwDgsO!vVg_7afLBb?{Thv{jw^4% zyDc<@uIu#gn?nf)B^0fx79JYhOHD!l_ykI%vF#Zyy8b5K_rG62%O$B*s%VDciF*E~ z36KI!=S)T2;80U!B=0PWqkxdb2{;0{w9jTB<)|UWx|8YpA zbOsO3P%hdC0j;Sl+lF^DU7I6gWT=>vY`yvAyz`r%#F7qH%|;qt7^iP6^4iukgVVc* zXzR(b^4!H#Dpj{XkK5RmLn5Wql562NpZ_Iad*cUq&&^x-+IQbZc14=erzZHrXZA3B zy2g)BKhCz(d(cD*|De=RWGD8`C4F9&88tFS3!BaaiT_GP`4duC+NXxb0Fd>h0!J@B1u6XJ)wQrYleySf=TE2qK=K z218RUZ73A;{Ug|QU5_Q0h5PEwPl9bL3`1wZ;#RVq3rMDyaOT)SRIS2Dp~UYVJ;18W z3VKo*gis95R`|+;4^Xlz+_dB}&g)uB)i%*Y6bW2p)ilY}=>nBfh2CZDXc-B*msjsZ zR9{tx6EOzlsmh*vT1bH~ZNByU2QZbwu}zjO-$dVnl?~tZ{X>IXapC!_Uc8X1 zRl}`Q&?Kslun!fB5R3#R1Y0NZ`IC9qvv@02F!zZCs>M&A2;6Mai>Y{-UXd zdrE+E9FmC)`;PQ8Q<_GK40(~_g0;)QDu;zRBVEOGnn-Eu5c%sy?8OEI`3nHHL`!S5 zE;N`Nu8_`T_|C!KbFwf@(nwP>r?~WmFX3%p`xsTn!m$*ZrUzAY!*~amyHA{&pshDg z+v1i$q(ityM+D@$+L=5$%4gs4F)BND@VjrkgDYNr9+Zn5z2gjzeD5G9r;2?4=))YI zK7}rlZo$()myZ_ih{yrLEsUDdb6niFg;lM~=}xvXMTPqgJq8N&mCMmCz68I_A-9om*=+EeUVS?J;r;# z_X%=~TA7`mMb~r}z@q8IF2qKPQbxAXt1(zHYuL6;I+Mn>?GV-@(Jo54fi{k#kcMR4 zWs8uSMmn3~!JmDHxzS^s7@gvsKlmY^y5;3uxnd!=KfRst>I|)VHy3nm#I&nO>D#S5 zT|ELQBB8N=+Zcm~=2)?%lin2>+By=XQXW#)bC7vTs=2W#5-deWONO>=g3@dm%Pvza zOhWH!)~w%3|G+^U=J??qzu`F-ZjK|Us{_<^5ml+e7=hTTs=7Hvk-tehjrRmHsFw0) zUGs=Xe)EbL_Yd=-y$Cf;a_G}o z#CiYwvA_NmGVl9)M5@)>oKQ`3xgtm{&6A@?_|L+r4 zN;s^(WC7<~b1u())!)#y_#6ZdBb7Nm@T;Hl(D5@oda56&u)e*IMd>yy#|j8f>_ZSa z>>lnq)g`QGinS*s^aOWw${Fk3#`nPxUU;p`P-ty^}kX(>uc-tTke)cK$J#vQM4DI2^ zN48UPETk}Si0kMfy2piSg++I!k877-&Rns~RB?{3d?&-!3=bXKM&hE2vH$fGtXj5! zclAhK*<!Ldo<2jDv4EK;M#-iW3$I(s z&9`1k>ewj%_D`RoYHM6_&2zAXMXgo~swfN3v=;`QL{&Bd<6t_SVs5s=$lw&6U9BM9 zvR`i1<9HBL0Qf@DwYUXGO7bl$nHZU%Ff~Zows_#kL52z?YPQV_mR`oX{32?OD{%nJniUX4a@53V8xP=9f1~r2EUkEP=^b3l0$S_ z(x+r+zr-_tg2O4|Dn!7|yn1s|O3IZAgCl-LUz^1X7lN*ZrHkevHL;r>Wph6SNfuFR z@0Y{&1CK~&d1UYipWX8l&^0W($oj2U@{VtP1`I*DR76OLrs+-7nte$|(=<1J+;J=4 zwzTEZtAhW1|JV8CHE-nBB^viV`6;e=>t)pDD(v{i)7WMJ$A(7AlU1yo8EEM>DS*G;m$joGXQIH(uBj7_VS@ad&#Uf7dkLoUJj z`3xUk+{UZhOiF)s3$3qw4T7`>HBP8XDUZ0xG-pb4d|~fB+;@6}KYeZwPkio4?5xh; z{_h*O>nrbI|ChhThhOkk%BSb(=aw8z%p%m7POI0>pb<~A)JCF zl}NgI4nD{7y>Sug(MGZE@|CQ(WHDF2^siXB;$l!H1dt$(=ZEj) zqd$Ke$z^HIJUqnx|M(zJ{_p_5IdO>3?Yo=9GiT6bIxql*Tweu-Jw??;Xe=D>Z*W+c z?V~fOO*SEr*IbV5 z=p>`HlGJl3uV|{TYB`QVmpWyu!v7wAfZq)t=aCkOJ7glip#KV6Db6mCef3rNICV8i$`o{ z_%ZXgWpd%wi)mey!milh9kNPL95q^9M+86>IgyUQai;{1EwCI1w-BvGQcJlI?wGW+ z_0YRu1t9-F+TJ=&uJY{ve;*rN*Q_L)-MG6G2m}bOEd@$xfx6IAH(L5sXlbd^(n6t7 zC{|p81d>1!;120$m!Q-p z%QlE36bz9lhf`QN^h;I1=Rg|M?Xiql3smUU3Cq zd+^s}SLV^z+J`Euc)ea*Qy8P-*--%dzAV#r)a4Wx(|@#&-(K=9HhuLM{NmQNytwCX z7TmCmXx}LN|G1lXe!h*J`2A;}t3a3|c*4mkXj7K-v6%5i7GbmCNR0$lCgh$foiwUAJ z6-$p{>M_a-C$O&iJW5@Y;!MDbLyj#>VRzP%WQ~_w_wrcheva%O=8bRcr1_8s|;EkUy1dW?y@pXgJ?{TuWO6m{w5Uc66BJkFu8gG zc6Wm?uf4YeRf9PAA$h^%UvX@JNNPgy_sJ!h@>Pg*sXum4*U-mm1wukjI$i!FCU80d zrmGw2H!CHaJMqU#KA5Cn=oY#WC7~H)OOA}e{Li*=j!rm}lJQw=M-nbRbN3%P)OiX` zaihANeEDzpP_bwlr;c}_8xpyB`F3lkWQd0}8_<>lhGF5&$|Xy3^Xw1*!QJP6oHe;R zn-BbgkKKJ8rq|-s>qpsi=iBUlwvHDX4)Ckm*Eu}YhAg?`laS^iMUE#4*^v)b*0^-~ zrCdJqay*)oE2nSZvkPx!!GyVhj!SW33V~r+2!}?|j2g1?G|u0!nrv?t;kVym$T0X> zQ$L4C!wefH{f5cbK!m>y`N%VLtoQeTf0R4#{w5#0@M6~IE@O7~EUdW1Oe_{lSn*<| z4)*n);4clEIMCkDTff=Ej$iFY55a}sxs;u|?_r(C;I6fw;nBMu#DzvqP8OyiY)phC zr6kSR#V0F7!zL4|3R!*bTx#Dx!GWy}D8kl4EX!^YCMShtTq2tSREgQ=Os24=fOXe> zmfXUrNEn7ypC%~9(4>?pmsCWtJ%AE|8OuuTDp02pyYycy#<-tGkq88%`20Zt zWZBKh#_eo7S?5PZ|<%Jm2RB_9qkeNymCD6X(uAiN!w?fD-osJoe&7!m$`&anqXBOq)It z5!LNJc^MF3PCq$gCMcPYoKT(Y_m*X%j4}+vNIFMSFa%pQH!Txc(}cWgDJ^!1oDQ5-5A ztt0&5h1ZB;*&2+jGBDUkI2xv=W)U8zhu+=}hK4&C_K&i1;T&evOePYI_oY0|@hBxV zDUnX}X=E|3wR)QKo{VQo-^MV24?0mM^(T^T#`OuFHgNU`3qX}26p8To3va|3fX+u& ztYFrR$ym{todGx=17MubGjBG|lkC|xEFCR3mw&&$jobhBH{4n_VSR)vzwtFTeB)+X z>e}gR@G*Bq4W_VFU`eu)3b`yv2+P707P+}zgkR>-JMQJ3AN`)&uV2USp1y<1mD7k0 z_^AK)L3Z80lLNb(c($pQms^f75(^_K&gApk;V}t;f+Y+r5k->}s`JVT>Ol<4!0Ys| zbi#D9@-z;1)^lR`Bu591G8i312$?)r4#ln#if2}{=<-}jCb$^vvGDsx_|$FJaP)Ws z2mbmv^bDcmV01J{q-Ow*HRFHeX@>v&H!eJXHIF|2Cl2gyV{mksg4rIFLI>)glN=?N z?obZ~Iua^U8aI?tF@&IDq?PW_2w7n_BYQ_MeZv$@&!y&^1$^RTtFcb?@V6iTorbzL zW-psdQCSh;aKxs2SpqA;z%yde#0-O+A}=0~m&POA^mh%Ao1aB?u8Wwd+pf?!7f9Tf zVOnJ6dyoYLd{9z3lZM*&abVFJ?7_5TmKIMVY8uH@U|E(ibV22m940T$$1+ki_|rqr z=~1jC*Gf9$GS|5&Ok}r{z57q{@b-O;AEI@88w<{whT@U13=2t4EdmMK*4LaGIXU?pcwsw#{>V3}@(=L% zbKm8{FP)3*&}e_Rj_voo%c0kg^Tx?zJbvl`P5wS)Sp&(AYRHN6Sr&pAG7?kr%eZ*@ z0G?Jf{!_2&DVur1W z*o9b3rp(EsxF#E6nrV)8IYX)@2xu$fqdPIp5dL74Yc4z=r>32u6p{7cb{C5B!2y)Zp-|M_IUR4&HJXMohO;UZr>x zTiA}n?1Fs4T|OTC>`&P9hkx+nuUy9e{Nsz{%_w5@R1drUv7P;oAL3A5Cy$;yz>eM% z=oTnw2+1ZCNq{9{2%%Ht%HzE1`FvvO3O+V(8A~TrQRMdG_xo5ieHN9aC2Tpqk9L1Q zA|f-@T|=Hygx4yhd8nOEe;W}aMp14VjG9zVS%l=wLBqn~bkW!EXJ~MQ>#n<)Pk!QZ zRxg>w(&~wvzi2j}zxfJ&@v}R);DYmbf7>xSJA9~42mWvb35~|1Z3Iq@(iiTguKx%U zYR2Ld2|YTwLKLFHq+z6!)_@Py@4~mY58(?@I3=H=c~yMm<7=313I6uezq4)YVP?#k zN$KPXL}NO_6sdCLW1zaGWl~yEKq#m)*zc#WYY?aAps*wlGhPlYAqNry*}^2hqJXyJ zZIqPOU>FA7tw&KMjidc1m|Hl739dq-!bFkmI+WG(iYTaXfnj7uDv}=eG{KUT`eVgE zfZfMZG8FE9^d%YxJCV_nSO)vmzCvqz9rNd&&Cp;k!z1ks`$L?+WH~jHDv0O_2z+|{ z>vWSK`G4BIWSZM?x=G6^NCYu5X*TWy_}V9Ly(|6X$*(_z0VHN2 z{=wgnS6;}TXZJI4N+lHwiit*|sH%;Tmn9iXSjehEeqJ7XpWMuS*WJOwT#3h?{{d%x z;%tOr(D=qt-uugY?0>I`7fu}Kxt62!M|~)gD?Y$>%-#}q1CjZ~mE5pk4Yw>?!@9}S zD0gLHnkErL$Bbt^_V)L)e%>Nx)Ku}tp`A4OI_U_E((UV_ZKR#nkrqN(`B;{O5ety7 z6cY3WnZ0BI7BRpsMP^tsEloX`hG6!*S*$x}39D8tq@=Kzfq@{$>bnVtBbb&Tq8rFg zh0th>BX91*p*q>qzn?(ZN715-FvCNbkwDzolTlEyY)?j#P!!3*KxCMMgRS_YCgv%f zVC?{|Y>Vt^#mu~5F&|q$o#xjLa{n)%z%*oLuAYx8+hvzUkEcr~)JXtQ<>wBo0v5+! zAWTL16k6KqfGDN;MVz~O6`^R@PP9ro($nc@3@ye1L5UoZl+P_gT}w&FG#VV+_*ePb z&7Zz&yh@@U$^a5XnL+GhQ-srL)c(*C7Fiw-yARe(_$Av^}&U^D<)q z0GY_Z_}7wT*Vxl?b9w6ZZG7k9hf$SmOrdl0-9KXb`bF%0X%Aj4i-qfF5Z1#eikdvD zWtg~gvT(#?9{>_=Y!kW@x*>M*EjJ@<3W!3y0Ih; zRaWixP(ol4!>u@3H+edrUAc}M=B;2>(F8O}B4X&a2VauoC8!hJQl_!FjkR-TF?;qz zcGMjwERQf~_Rtn?W+>Q0*4mHZu3pGM{i_t^PeLDvVuW<6W>?w02izVy>g(vLKSuV1 zaspwU-MbI4dGijkvhwf;!n8EE)88K?FE5*zVSp~!{n8e!VVy>!os(^~xF#&6@)Nh> ztJ{Y@+RcK>MVwu;f*BL4n3!Kd$cPe%_>fTIw{A0rCSMQ7M+cBYDxpJuLal@3P4tjg zmB+`C3Q3v4C`PmX8T$udP{IrMe(Az~^6okK)p zI^~tcSW+ZOAW5u;VUSnkB{-@x+#9BPmhBWY!a+v$0E6KX&YCa}N!aDw$|h!0Smi_* zW`_Bg!rvwcElnb)mRnM`TLNU&!{bkH+MKTdZ}8r~fvCMw8I8{~x#HrA{N@%q}OA1XF4zVXJcv zj(2s^+%`z{tO6`uPkDSL(l}V+VbgQVQz$CavQXVlnwxvL<1Y__FjG)d#ckxmRf#)37~MACseaqUpI3}&pVWTc}OA@Vur zBVXpthkpjbWLMu2UT&MjN2|{!5)Kd;)xlD+K|5z~ETxwOPlU13QqP63P+c-3%^{xK zu@BHP{3WLmZT$0-O$Xv;fs6W6Cppp5#M~J(2}dG~FL%?;0x{-w3=L-Z1tby<=JZFkvVg8w1}nDKC9Y@)QXU@32^NIOnKl@(0G;^~cBkY$O08RYEpxy+hZgB6R| zp}@omGgKQ}S|)PyGx)14uu!@2e}2W`wq`)3sA4Lg`03Z^ZtSDwKtF4*T86Vw#xw=8 zB4Zf_s#7D&mCLKYc#MC3{`-7x!#w`<)K@5&mQSEzn0M}bk4;bR<&EPlyx3ezXJ`aj zcG*%3Fs%q0g0+)o@uhRl+=|3`J4MuXHkVc>(h` zlrs0c3MyviVTA|CQp0!|#-*5eN@nr*ho4}iH-dK244Tt^vsC<$sB$M#S9qGgZ_7cV|v%l&&cV#KRIrP6lo z-=x=aux)Z1(WuBWx(G3K;uKacUPw3+wu_fYw%;JLOY;XYf-$~{MEGz_C_eR?B3sW{Tbo&Q?i|YJCQ`$or10%-MsOKUA*@0Azo;%Xa7JmF$-i#vs-stIzpH% zDVxUaYtQ4Vc?&6adx^!Om~j98PG9?EDpVQl*aw7oY>dG-~RkZuDJL-f~}(r`$st3d4T?q$#p;b zG1kl~Ha)SC0=G)!-OWTIK~D8|6E*@&tDM5kYp$R~&t*Z$bfy(mW0(pf;Smg?r2I4> zO9}x!OpC7@L#QZ&UPArgDb&cRbTVP?WUl+qL1IYMdGRQ!X( z4E3DE5Q5gx9#&6Uh!rxZoRWe@Bbs`}5L#glP=mlW_(h zjsK(5x3L#UyNNX0CzAmrR1y0_!!#(!%i>gfCkN{fgXG5N3vtQpWfV@zK^Rt&6DCzI z$?nybaC+GGqRmXy9534s)bXi%{s2-Ire(1Dk{g(^a4}7_?UYR_X5RTzh{bFPW11#; z#f5YoYU8IHZeun9o`2y^W}QEkNUx8hFP`9ye;(kO1GT)|TE}oCjG{Q=?We)AqEu&> z@`csw`Q(z7RA%Q8iAC-Fby<#^vNpmj7L6h#i{dITb1#^{{0$Y9%`L>4V|V7YOcTk9 zOR;!AI!RVQ$Vi$4BX2T){>y`mD#cXYb`zZ&Ut`^c%P3vBnz~otqG#wR1^GF2cAuoH z|0FXi7BV_Aim%H@|dPIfWUJA!Y(Pb?heXiF`=un$9vvhmPs48>wx_|+ef`?2$R zc2_+$bE+BKaTw8b6b+fel5$4<11w#*l#8$W2*V~AF&#$?W)@AMrqC|CdtYQ`KM5ZpEOU%#_ zF(X+OS^!05`SkY;5%Py{x-_L8i1$+*`^im;(1G4Elmxao&04<=Rm6WC_N&H$S}=Kyv*<+WE&L{PZY+$RPaG z&n1+ve)5*P#+S5XRgE+cW5z|&4ohR8$C@N&n z3-597)nDLq=T75+$G=Hdxs$>AezrcepI4qc#G{Azu)n_rA!Jm^0Z5ou1gETW^_<1r zarTAGDl8<`1VVoNfl-G1{S1%v5f*-SHSXhB$59L+SbN^rS#`}NJX&{@m8<8oY-T09cOJ)m z{5W6#$~U>`rd!#+ua;b|i?h!njT8D6F}buTguU%IFVp{Vn2h( zPLffIO(uM3%I%-L^{&%zkt7OgY?<#A2g>9+$(jP=Xd>xRf`n?L8zzALn0p{D|M)ei`5V)yEN*PSfT_-g$IC&uu%x)2C|bjf|p7 zPGnid#KIC$=9W(6yX!9Ek{R=nEsJQppPrP!E+C^vO*FTlW@#adE}F=sWhJ=s?FD9| z&TQh2r@E!dhZGZ#uvJf4fIisHg7p_MXUPiw{-=LZwQe;o9fD83PC+2Xl&pyi_jWNF z8z5v1(;e!h!{15gNE0poPTKsPv=7(QHgb~2!4vd_I)E5XM+M7P-^!f1OK9Hw8l$5= z!Ue^=zi}tgmtW;KKlmcoTz5H#4>a-mrj1x~h_8L+7L3k8tVj%ZSvgit7AM<|@&2jZ z9PK}W5GIA5Qe29cu1l;x!xpvxRcxx6;E{`3(i~2)#uOQ z-G`p#i9f!~q*+s$Jb#8=YE1}C%fgfELe*4yn}$#o&{UPdt`Q7NP*zohX_|KVt9X1m zugFVp^AIt=PEJV?isGQ7=@2q9O}=iH6wO8U$&^jcMOI8Z=`vINCUZj&7N{U=8lC$? z4D5yb>tE;frcJ1t2g{1`v#)-QAAj-FgnR}&kM56aaw!R!G6oV+1QFL1!<6I}vHqM@ z#G+9YSxExmQuLh?;iom)`2gb2U;r86N&6ge6W|OCU_7jUhWe4I6^z9IoQ9)LyJ5?+ z$nj=jS{9qOZ$(kObcKeP6f0-igfhHkE-YOnokA&AXkSAJP~9%-j(2d|Z~jb7s0b{U zuKy@yRW*cyAhmaddkIDCf*P_cVbijN5j8-D>iLB%zO;gh z#f7MD2@x~E6mix5Kg@DWSj{ZWc9)&eDf<` zX2JY>T=eP6czy67Ebcl;LoWr#ry$Givqnog8+fMfH-N~Wm zgS7chq6s(ii*NJIK^tKEkOEM)Bs~PO+z(3fD-v|;k4CcFL5*{9=v?d$bIo9D8ul1)% zNScQ3S2+1@KmKDbUh6o>z5D)wqPj5+AD6B>pKsjyNk&G8xp3WDBK`=wkM2ZKJRs5w zyh^7{w!lI*1=no2AeD!a1j3~QlTuNy(~18>5V?|+M*1mIvVlM%{Y0q~pGl&RZ&iFnJ!!&b^daOhp11ODdSW zvJlNHAz~(y74Hp@Fkd7{6zLp~>2lf=3M5oCA&7MzWA>`0EMK{r7ytbTy#u{SnuA~< zgeFwhtXj#(Z~Pday7l8+bipOO{_j^1H(XEICvIls#V7g37kF@(vq0vGQ-`v5f)r||4EJGk#}f2FD_n@w-L$VKbV!#5IS|B-H< zfAwt+9o)&uo+FHeI+-zH9@m_EE%Rp2#i2sT7ox~jz?{;VROVDL8VNHR8^pr2ZERU# zBsR+ak!Cvm23CWFRo{av3$mt`vh4B&oIj(K$L@KIH(uDm;&WG!GqHqVAdG~dpe&z( zjv>M!BVL_Zqq}_wZ?1!q(tKj39euHcNltMVgRLV({4p#|p}c%DEwzU*jR;NtE-G_N zsf-oV*XqZe<;LaF>_V`r14&U3hC-;{pzCmmhAksVgE{OSKE|Ef{(vq^Sf)XF(FFc> z*N^bJoS2qHRF81}IcwtI|83_g*IG4|4hX^C&9F#W0Md)K3((NvYH6 zbojyPyP0^I%o+hn2JqES-Fnyfi}B1@|I=-fF%08OTqu5-M4<-Lg8ZB;yk0LGw{Ag| zb7>29Q|u_9a5NWBk%qU}3#MIvE)IaQWB$1w{{7l^e){ickQFbA;^eH$Zzel8A3YLf z+VV=uXXFzzb#lBp{OxmhGq~w3Uj5g%n0EGLhHHD-`;S_l-+q(_Pwb^DID#TMY|k&Y zqwn%r%lOv0mr>wUiNwN4l9B|TSV9mDN69W!Sh%5t+3Txt7syz;fh44O%kp%>A4}qy z8r1lDQv7>aMwMlvohO*Fd>%_ztmC=oUZ!)PlivPrPMtc=v3(7ksO`i*q+`V_Hooy3 zu~jQkD<=_n@n3xO!jF*a@$&XtZ}H;B*LZ#NJJcRK%0RFmAq#Xf!oL(P7FLT*>)&+`(BZXR&B{K1DN1 znNU+iC=?<*6s5>h$gBx7Dak6u9|;rGL&>a20kj2sI6B%xWYj_I&@ifhnEWZZl&zk` z$1hz%)0P9=`|}4WsVZmMviXF95mZefw;-Rcrha=t$adOtPxBD@1-axGdx^!X@i^TI ziYC+DIE0MAlUIb>okwfK9wbSkexQX_6$@~My|kSep}#4}U`v?(Q!#oPBD5az(|$0> zP>VsXyNG?m$N0{BzsF~WLCCliiNF5jC(N5Ml~CAjK8lbq41){KSxZxMFUOh>qbgbP zlx=(3Gy^^e2k_&uI8OY)~4myB>945;{eV` z{Nu6}Qd}irk7vLZ#c9W<=LKXaFOozw8fD?knH+EILfvj{aC=!Qu_ zSvImuwXbQJsH%d`r*qRU?qwhlK?t3>%P(c>f|W!=A+jfUnRQMLs1{jH4}bpjPYG?` z&MS}I!Nes+bnonC>pu?h)ZU{!+PII9uA@pC5;CR`I3%6VF5ke-i_gM{hA}N0A}p{Q zLYlgX0H&`fX4zGf$glE%VS-7r2}P2FlcxHm)iRXE9Fw8Sr8|3UkOm;3Dhkn#RhC(e8R84Kv%Diw|8vjy**nn zWu4r77tP(ZTzcVUTzdX_?A-S@y}i9`-SI9BjfZIMYCuxJ=~Nl@58@B{355c*_nu(D z-%i!UN^bqc*SYv>pXbLPTgKZ10S4+CX*$+UV_O$}fl-?C5E z#Eclo@eD~x!LJ87INU;4P{(XkFdF+PE_dRcUCAX^u3#D#_kRB`^p6HucJ5gOO#^qf z6G^ui=p05-Y$=MR(9=FdVOchw92b^l+NNef7K0rDq9aj+Wl&OC&1k=$;l2hUR*;@x zfb**7V@W2l5Cn%!flkg{){4WfiiiV=q74_D4pHAQDa_;EzB0A(x)J8lTS> zC;qr2(y~wxT)ggV4%ao()Oiv`@nFTF!s#`iZ4{|NNnSA*u3b$e8jVMUL~5OoqN7YY z9B+@0N16jYo%oYsQ>5{bfFk41bj5otpdh7ze7I#RC4LZR97&*`uuC)D_2nYNfvt8>w^CFHC;?*GS=9P91?R0>L_F?;!XjHq2! zxO&M%6qmrO=J31E{gCkc@AAgO-(vYUTv>MMv6OK1f~@wTUEK^ zoGUrIdJ2JHAl^+zPTFyiP>j3@3X9LLqHt;s!VF`DWIKyd7Re4Tsi90YEKO7vvb8~x z%x_PQZ-QBjRqX^e-~|au(ZD~*?<4R_UvZd!XOaz5sLW; z>Ld6@N6;+`FtPh^TY!#aMdL|EDvIPpNHTl-8)zQw<9J{mU7cap-8f3sCDXa~&TCmP ze+D<){wIEV^f+Jr^Dhy(F3M&VGt}i{xG#XBN=PagQNg~q8d!eCOx$@6jF^GumYK4& znEjnTWE6BW#_|o<(AROCps$r({Rerqc^cPFIg0=hG%e)_^g7(2$lPE191qsLj47LF znj2jY@T0HZ!Od4)Kv(wwTB5K>JQOa=GP+@+Y4Dey|AbH8@jdp`??;jCFm-x3(2CFZ zp<@jMf?*U%if3J<#7DZ&{ID&3`J|G8#y30Dl7TWAz<5bLr+E{{l;M`rHG{O@14*p6 zly;efy&cnaCY0t;R#L&MTi!ucob&|yX!iATcGUtzK&H8IkhWtZ^fiU4-PyzsUVNCK zp(Ekotc!1^ptPK5I7Dep9#dCT;BmXT@AhBfduJ1`KJY~ z6j`=w+snw9mQIl;o4eLu&C>G81j0cS*@hiUGGIyQu_)Dx3R!V=6TX5vg1|0 z`OR-IY4RePPg?BUR?BF#i?df>MB|A;qOl00{YN-=%>rJ2b01rG?L{5YII_Kgd+&dh zp~DU6zFyk<8tK)2`0}!`CQrk=bUnFiH;}dJQar0S;97PL%B+K=B`{!(Ub~Y4iCL;y~+G{ zS&@l_O@_LLnJ~Ek#i3xtbaD%`8R_;D7>a--aAjqYpF4rZx_wBJNyAV(%gW}E@5sWy z!mYW{6gMXaJGpz$W4zGvHbPPnA_OuB%ZW!(xM0FkFf=-VA~~_J#;gdL(NKsh&OeW$yj*lsPe#Gg*U@;zYKaS!OoUu2_Mh%RO#DQO zNA1RC02!^eq|*ufG?g{u`*a_Hlo1D&G7d~J2U(U0heIrxGZRb5Y~Q~Xhnh#Lzl(;! zc9xgTB0npaa5RDv(Rg_8X7&vq0|ZlMp2yr(>xjf6sG7>0^CwbNS-^we{|hJn{S>eK z{!-ft;O9M_-gDo_URV z(-xpe9`^4&LQlsag@q*q{6XH>_8My5WEhBI9Nx*T*MEsQa~9Ly7UrFI>ezkgZ8`_{ zaQP)y5)QzY_g~|Ri?3!R;K$Szwr<{or44b#<(Dz)Gl;|_aCn(HtBe&Z&f>ABUSZ#n zL#U>gfvy&sI*!ooabTW(5tDAXkp-XlI4eGOC1-#10#;tMl%?wzF#o){%vraPY3DAd z;@malt-cU*&Kjb5lQF^)A~1+*29YI|*3bYa`~m1xh#l^tpx8=wXBYt|7Z3uLX*#5%ih(hWu1cEd)uRDgvk5L1)7dilSoZVG7Ht2>N{t zb{!*P#Tbr6IJascVLi%`fm8gWej|T9@&e7lc4XOw5MidSz67T`5C1?XjqN9yP+ZCC z#S00B!%2Z5((G?VmWjq<6zAu&bpAYEdS^3{Sj-Opr5OUUq!2TFteUr&+0&;GiAC+) z5i(8a43bL|u$e*Rbb6D@>LQs{0urA~Nr@EK;m@$l8K+ALN%cQd910X! zWps3eZ++%d`28XN_RK$UXnE`(Y~fqmAL5G(uVl@H=`;*>v$>}hP;fX3n7i^kyI!AZ zGHG536X#9jnY$lj_rw3><)43&*~`m0xvi6(FP-A?6ZLHFK7k^+?II46f?-COm{q`! z*I&sbZw~%w7*&zMvXB*-h_2(!gXNb@rf`}EE1cQbQKT{4gqokoW=c<$PBIEHc0A7% z5lGm2W4po15D8O|?*$?}y76!1I49syotTD6I2t2F3`NQz_R5QdiD41qD?j);0#{sP z(b27D%8IA5aLzLB+wu>i_y*FZPZDs#~k6&YJ)mn6FvLL`>Qd;3gI?C#~9x#zK^ zZVS5_ws2H>c2KoERy$ptDF+3b)-KQc<-cZeVe|bH#tE>3@ z?LVgDR68I2@@E+C^D)rw!|8Bf85RzQN`Fg`+O5qjJa003G)Bp!TuLYB(|gK?=1_^o z!Yo~PCB03@@eMbzv!|9HY=4lxzz8j&UMvhG$$_S1p_@JyExUs6zWEe;Uf;pJ*If-b zx%aORv2N*7CX^Hqi|KJEa-4As8+fKD3O>J&rE_QUyYK#h+wS}!Nz;%-1u7X!2o9b& z!POU?XJ-^jDb0PXBRx&hkg0bhR^92 zR7HYux5VizB!Yoaesaeb5thmW&pwJQyJ!s$@}u`3=DI28(;n<)#2f-(+PpOslujTL z3E|0+n0ww7wmz|i=kC6j$8W!ub>~f^ZQmg8zuL~f8tT~GQ;#Hju!Myo*)je~ZyrBd ze%7+z)DnpN%Pc-c-3E|L`T|m zh9}0Db*H6H#*YzcVn4++Wm$nxglV&<^Xp&!h*&g)XPb8Ir(nZEnUH;XX}WBqZlp&MOEU( zK{cFCH(Oua#L>gY7#IyB>QR~@NqUhb2la?yZUMY83`Af?8LP6cp(xu!R{XV_O&tZ z$~COK<|cMM|0q4aA%6eQfAZTOevfc8iXx}rz6mCPB%!D(gTo_Sec?J9nm@xm5C0KG z&W)D^PaLmM-_T&=R%AId6*)E-}u+-&kpa1aU3aIDn4dAsequo6u)Qj$BfapBk) zUpn!Rw}=zp#v5xUK9|!oeACQ>xKF??l5CNilgHm4f04T%c!*FWjKIV~2Q)z7a^-Wy zP2a{WX&BpUv@#Ywk zoNRO=MI%^|7#8;Li8sH<9H#Mb6Dg)^gEB?ZacBV|uLz|e4`C%bC&_kqo$PGdc6Bg& z?X8s8OyTi|?q>PQ8Fr=}E`*`b)jq_Icboas0}u25(TzZiMGF`5^1q*8`&(UX-gJzA zy!dlIal`q1?W=ckvay$}94~J^vyo$m8#vb8OsgJd;%9GWCPRax95_JgYz_}AaDc-AyR;Yc#X zDTK)Iz1fsv;&Em1+3)|D*WTNNBIjXRhFvaE#F$u8&c?t0jVzCbiO5j@(*NJ*ds^U6#&6d5XO9Cn$;WyDx!kn~5yC7GPcizb=qkV0T48cPb( zU{d8|K7HqJc=Wl4(3BiZQ^fnlg;==qT9%x56`{~5ITNy2xMl`--tZ|dEpv1KPp&86 zi?HXpHXhqw$J5Qbka5IQIAw%ok)wL~@%k%RIH8zeG?GLd%Cbx>tdn1^vFiG%INT?i6lc8lEAWTWE>&|BDPEuM^+Xm8%<_k^HqLw*F9W!$>p@R zwW264PMz%J;Jzaqscq!YiCtt(h;r7Nv&qZPwr)DYW3T^_DO0^X`rxB< zc7v)Yy!r2q)E;V}p{tP&$-#nqzQ<>7JC}_QZ)W3{zKfFU#0&;lGrN-i`Q8^fYuQ2u zy9YUZ@B~MWH*=!7hn~JcB9R#0tQ;!KN|`>hnz{34QdU_=-{=5OKKDG2{{5dAStZQ6 z@oSuT?Ny?!@7VqtNnlwqX6ILPRn-hGI)4(YZ&-+u?ZVeH!bd*$OHP<2Tz1>n7#_7f z>ym6U03igHDp+;tEJ~`pG}rb}`$jXG(}}Q5WJ$r&4PJZnSB&(ZK$1Klpu}59M2|7O zqMEv{Q-q>EYKmrX%kO_j>Brab!ng0^^PVJ53#J$dVHw?9j5RsJ!~XpP4hY%Ju`uawY>f&0-u!)feNer-V38V*rpa z0g`u@d9ZYv-f*U-AF0@Pn!=hqOFF|ynzkhJxW#F|5JJM`aU3Liz zi^~bbd?-r1fTt{>>n2%+u>8s@93CB0kJk>cEKp^X{45%dcJQaCw(-h42WacJ)0u6} zBvB34OcHjE+rv3art*dB*RkQedB|88p%99!CFwlV`#+wRm71S~YAMSOWQUYKvdE?d zu54s6ij0Dxn~V$x7#@o7#FPJE=dN8uBQBz17|k8x*FX6y)f1-^3CGy>dKX*Xd6ze~ zJ;vlIx%~5?ztY{KBPlBHz5E{a2T#z@b({_yEdTRQx$Pq>CecN`n?Agou<;(F0LMc2*Vh-bq zvMj4aqXs4U`P}>6Z}ZWwd=*20gp4A~7-o>R_I4J|nnE}lVZ1G~dvU^qNMi(NLgHq! z0zf3{0gUAmY3_w_LRzOU)bZYvlwt|*Wcs1@X{FSjcnB#D;mpqFXZQV`-L<>X6t7)e zLzWOiXVKa#shBdGXgEY(Q31O*y-M3#FZ0k3ZlI*X&9S!!d2>fI51rgiOqkf!SA<%1) zZA%*WYk}l>d))-_sj8Yt1?)PN?AC-~Wz{JDw(J_7N4M#25tG;=RpvJn+yXJpT04 zy#3y5)VIFM%xRN(^`(Dv;*^iN1BZC+rRUhOdq3TyZM4OL%)R&LeCEcrM%JjVNb z4sz;92NOJ1T(tfQN{S|M>|`y`*eFuGag1GCPh~U~h{l*WtAIct#$d-NnxY{gh?x-zCQL*R8T54? zK>~a+gY~OFLGN%MMGiMpD`s(|vleMIN>%k7iqD&Z<(E0O^>sinFf__F8!o^wVk8Q{ zB#@=)o2)1VBVlGvpNJkc*?D*uitMtrI1yo5bq!}PUuu^NPd2HQPMh$tQMt^fxo5}? zKuTL~63SO^zU?k6nOzi5fJmJ9w2O|B<{6)#f#XQye4G3rO$ClCvZk=e@p##J=omlz z{e1{w$4rqGgcT#dU=k}gT#s%Uc)cD@9o^6N=O5vBpT3e6t0vI2Z+-5Gb;YEGd{$g!$|8DV>#r5wi!qnj%h_~kcXrJcJ*1iXPt&5sWf(V^4N>JD0X>RwsIC$EJgzA z`9b5Dnj8CCW8$p|KXQrz48-`;)337b>qR zbVzL4+Q@?!UC!68-@wBU-p4b4e~Ftu|8=$=-b&2U(G*8~>=k6i9!JZHA}k9DHJ$}0 z*_ncpMARImsrNXw^>vsbm_Ka^(c$~Cv?V`RFg;6 zglsNZGnf9B6Fm09OH7`z1W!&rhGE;~s-iK}GlD1AK}B^joelk%daCrfFbyVDPNwx_ z9g)y5F*8bj*&LQHzJ%uXS|;aDBHNS2(U!fGI!h^DyOP2=Gdc3|TZBdiY3=N0>D-yj ztf?jvjg1f5iBFv@$wVVDRxMb~BL=Y^P&!VJVlcJDXT6mTZ)h>6eSsOR||r z8be5r)-m25r!>iaRla)jZFiC8U>FbGcV z!ikm!RKMSuANVRi=SN^dw8f}Kh42j zWXXXYh_NFKUd6+g7G6YYo&(ikYX*`m#qF#pQy00YSz3&#+p%O*Sg5&K96r{?g}3~g zV=aAXN?x*Ih!jV*Sz?sD+)}1aor&A+WyIHqWkrx>SG);`ZL2G)16>GSes33{5sMAy zF2IU6)RaDmiDq(xB#iU4-^CfgP@lnlPruHJW#^!WP2Sx866c?FHV?h}7{B#+ z(YuNaC9;#BOSn1-c;q}T~l)+kC|V@#~h zB5Oi67cQI6NNX!kJin1?Q|IH%DL^+&RM{rHfp$L=rx#*Ib%wg^sDT6s%f#jKkegS* zsk;3@h;Ss#%q3^zEG{72*GpAVB|ZLLdfHl;I(I3BtE$ig(6D7AATu-+;OYy{MK|;_ zFn|Q{N*I>F?e;LUW-|YN{Y^|^+xuRpn`<|$A4dqp=_D?&({;hj_hNk7Pv7GVLQZ%q zGl~CnLLNUfD2@4SEb*r~599x&xT+$>ZQ9f#7Ffb0%j;qL-b1{x?Onh@mXZo`IMDR z%_~N6==N>Nwxh^24T>j1^@0K{D_*?Q5U5@U$4_)~>21HEqc4b}WTBh7ZEquE2?M9Y z!O#BZ9*!M*pM!@sQ&+cxx8Hh|mCIIQSpi&HHaU)bz^+`25U5%{zkcjRe)yZ`P_nbI zEFgxZA%n)o0h*hKIdy6P-;j=5_ELZ77<&&NrnT!BW^p-7zHmLuD|2WYG5OPtUtq(c zDt>d%ulfERzvAu({){1oQDuc_JPD^PX95n@fn}L|>nq>kXx;l9I`S?@>bJ9d_q$wm z#mBIOA4xW_J0jc9ElUn!mY-MNf0iRBYpE`)Wc|_$aXIqiK^6P8Y+=! zl!|GynYH)=K&GefB&|IsQA*1YRpo?Yf;rX886NDV@wvB%48Z&wuA^|$96)Bv-u-Ob zbC4{r$MzeI6?$n?rYbW2ppO-c=JTZ+ZpN|#fP>y)AAwLf)!_UzMv`zarqY9jAk|hq zNs}M2$9;M7=`{ag_Wt;4#Ru6OFxJdHoiiptGLoe6@Ut%?hyW(j%V!d@0)WMWmFJ^6 zJ-D4Nj=aAGnw$9cCoe$CF=^Wq;?*OKY#yvfLb2NmXQ{Gu|d?UE@Q>Ig$Ur$AN-!|&RYKU_eXg6{ulV&KOO)A zNFs(|g>fk=pI(0@4}blK{N#pD@t5EIl6(I66DCzvqG<{)mxIMi=JCQyk8|rSpQ9iv zk9pJW=BM^!3lvGkBFeMx{)=v32aBdJX4%x$fQ&$6_ATFM{@3ru!V^~{HMaED@%Z6d z{`J>=v>oX|DUkWqH*e(nMH6`WkzXMChj3~Rbi+V#s&u#b8TADzDsy4#M$%a=Niwlm zltpJl|7bC@`N z0hTZs>22lUJFoE7tInZjft&97Fz@f|;pOhyWS84Su+fqvK;^2bYshwLXkH_(LRm-_ zXsV!Mnjo(t3%fVHKnNYOJp9ieU*=##8xGBlWyF%<6Gc%Fg!s&@pW^CkFR^X4vPY=4$;h{h)?9afDr zW?aW-qj9Dn6O6=&877*dQCHW`jgyP%2nU(}@J{Z1`y@YDRYPy<01mechov&m)K70? zAG>!QqR_OHWQ67Z&Ed1 zxbkwAE-m3RU%i4)fB6>lcvfEG=1kL0P`dZGKc%XAGOZo$ko2bz?+c(2v-~`{@t^3b z$@1AtnN&C#fLQqy=6>Z?iq>twLXRWcWOnu+=jlVWJoR8bt%rg*3tZgyy_>myb|Ei6 z_A6qeL%3BZmSv*hqN{!oPeC?noVD1fN4u%4)9Yd7c~=82+M5m$4TnI|kR}!plO?K( zrxA-rXnpfNbU!Tn_(#YotpebkU3)mxa0-vxooWT2Obt(;KYLCM-Jl@b!}q`RML~OeU zXyf5$pT!hDz+mQ_RfH51M2H2eH=sD2$U^Y;%TIIF)ahJ(#dJpcLLA@jDa1+$<+r=Ze};&8^xHCrfN5BvAG@~5ZX11UG& zIXJ=1?PEaY@+&R@Y;<0-)fEz|sv(5M?1eLFk^JmxJHfwpy+t5mhvy^&!m>~mmF~eo z?s;evxZLsnf$?!kj8}XCB(;Eq`j=Q3@!kGD&a7p7eEWMNc(U@4WI^9Zj6i)m&tE*9 zPtPgl(MzW>D=77a`&qZ4QoiwD8)IooqgNfB}bUx4*__n(5=C>pFRPxtx98 zDn>({sEU?>ArY29R-6p@T6yFBS1Fw|i8<9vaG}un#KSZ-bus%>Hv!%x082(=-*6NE zI&zf9A3n^9L;YmuxVi7!w{Y1sH?KVMTSOp)Th>rzljw*^a43wHrNo0PakEsG2pK^t zr_E;8f{XDDv@+b^gQjR0E*H+~3S63lqQU}NcOE2C-$~w#GL~F-BVZ6SMtSzlS5Y+$ z%MzS9gU==iMV0Xd1Dv~NA$NcM+kE%aU!bCF0r1YWn3!^cmtF>d>7Y97;;uBE=|2o;kS zGimY+R7qjq_BSaU_VKlkpG8a#(fDqZXX=ko=Wj)oR8sX*B)d-_8W&eBMwKMoZaYRV zNdn7+oIHt=N(E1TE~Ml?$PVs(_zj|F1XZ$40-Mex5Hi9NfZb>#ecaN@wk0bBAMQWN zmmc{MFYMn0@$)D6zby$pJo@rZPMzpRbvnT`$&~P!^O0c2LRcw(LAuXC2#^fG}-E2LvnQe_*>F(O_H z4+#kewZ2B4u0PE4PaWYzZ6A&T7r(pXlWZu3jgS8ZOAjL}GBOI$A;Yc!L>%HRS=be; zWTIx2CFfp>%UwoC^L}Ja#ncTP#U;oEdE{p25FG8JcgsPD!m=B0z?D@7sJ!;hJ9PAP z<8(MujC!1qSTYVKDMW%{Zu#hyeD0=?U>XLpNI2lrr+2JbIKE^bmqf?XrjX8T0;HsW zy7c)^S}Vck3}uZQsOquRfRD zYMqY#LEbpr$~*maagTpWwXzqJ!Mvgxrg|rVtmAYF5Vj33%Mv9O;L7!&c|BMNge0MQ zJRGWTkiVI%x|uMZ*{J z@$|+$pxJo}Qo^AVzi{%2#%6;FQtDZnswgZA4Vm_?I(8j?2ap*a7($UGMnf^`T6-9c zLEY}-G}pCopz{cA!wsyNznm{z@;UCj<%fJ^)wPgSNcH?_gml>Z&_9`9Q$^*(S-kSv zTlk}0B$iJi%9FTHhvEeUyLayg>}IP8FLly`9lzIxh7*i^sPuobq+psMcI<$30qLOY85tc$H0nr`H^KOM@CNY)Y1Js|NJRV9PA}G$HVWxelyFnM|u5U ze?r5?C73Y-Rguwh1sHb49wFksBh$d?%4N-k*VEC~PE3yg5(X0L#7dmr0`k0Bbi99v zP}2|<3u~Bv$rXS}&%iLRZP|v`WR9gqHYnmIFBv#x}}&L|BBgS_6kA4?cWl8l)V2(kY@w_*XB zq~Y*@EZb;5)0D_725-KFGcOBCQEb45CBW(AxwrQdHG}a=GwD7J%l1}Fc7cn(KJZAK z*zFQfLI^C&A{Nt;WrdBey~Y0hyO1R>reVcx)rx>LHnLr|wVuTWrNEkg9B^r&`CWv9s+dYh~8*~jcux$Qp?!5hbeCD&C;NmOK z!fy};9h3bgs zZ^#xxvZF_#Sb#}$=21~Im)@RMWT%3#4CJgVoD(MC@#GQe?_=cP2^=ykyY8ca2Y{#F zcpHBpVyBji)bwOv`jJTH?#KO0$%M0XpIY4fOjrF+N9Cq#1OJ&I{;wIpe`XG(Z2gRm zDoN~$lg&$w7 z;H{QpbO!rSWG$Ytm41DliJl_nW>h#SAn}OJXh@4hR0xAfLYN%M1>6pvVq8gYpcKBpHQBXq1M&HcG0>$;-}zU@t>Q zj^ms@6Ue8kw46^}bt|CTc^3jC*}8KB9gShQY49}8R5XO7I0`OVu(BY&g^MPV<;lc)|O==1iA4?Kjzj49<>*2 zEN0^ulz2}9MaD3r7?w`V407*xzRj1ezm7LvdmS^XFyi--Gr5wm0v-DfQsB(Rlao(# zODo}6Abx!-ZEP~V+oolr$hkcC{8Ox4xt=GUe4hGajU28$#{GZ&2TPZ&W7FGjpvXCP zgVxhR%4r&htor8 zWx0*+R3s$J!c-NUC531njggb5h_v>TQ>3xtx{m=4z~K3}-$9ZcNrD!Vl!}I>Q*V-& zCo2TRBLRukl92AF4-W`F&_e%!?L)f*r!#~9{T9!67Gr{hmPNKFn>XKjm!_^3K&GUk zhT@4+h=crLEV;U?2i0q$^>GIm(zZAt6g%UVi0iUVh~{ z97+zl8AT94mU2*~EDRCLaBd}@J{bZfm2YvRshb3(H-(TJ!=pv&PQ>Y7#OKVyiC{~A z0H-4Ws)}ivj1G+wifNd-i6kVKh% z1E?+sh54l@NEmI6xI8XAQ)e;UvXRlD0j^wsHNSuIsO{(#iDDZLwss!Gg^EjC%&O%I zlZy(u|F-M7>AuH#-{EE1y36Q2IY7yjVovSrLd9--o>=>)VUnBgMR-g`216*SiZBIo zeh!YjY$81a^d34v!Q3(yTzWnm@2zIE{{&lh@1V82i=u*Dbi+*Znw%LqV_!2w#9F8B}jnv=8r!QTO z!)q~EZ}D2g2^#&K$cly~nMogXO0|wLHM@+;tRgH~$LX@;)P@Dw1ty*x1A##Gy2v0V zMW(OM55!R9#G)Q!i=|1qgnF(jdB~ENm>C6RRK-UA8A2aJ{A2wj365fF46g z7M4i3!OSuHnLalWamcYG8AvD?riCP;APj~AeeB(|hpjKX%eGgxv*o2N_(y#NjQ}9C zWm`XQY-uDWO!`7mBKjyE%RujqVD)y8pOa10ZxRTF5$H&9(O?$Tr>~U zi~@ESUJ=*8-s;}V^M`6Vuy=%EUw|2v`TXru*U`G;Wf~5>iyn{(M=S~|a?o`nW8KS& zOehp3r#ufumE&5P1)73dScDUqzQf0f4(b$CPhkF~7Xdo`!+mVqxet%q6VHQ4Dvzm#(<#KSmwS{d5b^`*p zyMPH(<`L5kWL3rQ8>V*KTYPTuLZ-~f#ow;8udbI(J%>S37}o%byKxs4R^gCUEH#R% z2`r%?VNp=5AuBqvB%?W;nWvB-917Wg%C_k;zSA=mX%JvTOl^e`;_p*Oepol4l!MVf z8U({kF8j<&p9yg}b}^+fC=(3bKvfiuwD0Cf`$6oq+;nDS0t#5R+Aax!Zko3AmL>EN zKZIjMBGBJIikY}yi8G0?(^i5RC-l_#m}KenWj!8!-M zuF_Q-VAIJ4_75~6;Ua~ZOI_7g^i7J?Y|1?an3hS7#{x-UT7tZM4X0Zn5;M_M4M|qx zs$BBM@Or&~nuOf{-?y<`eyl~8dY_%`1x3vOWBq62n+7rw33j4@31-X$S?1D}7jgOJ zmr*>yi)omMn8o33?NlwVLSj&ay0<|0x3hs2|g^C@d}{RrutC zBSPY|PyW-Dk~uz!u&&peh0Ez87PET|N{WoCD9DQ4QoXRa5dVllYfBq5%jeK{q6r}x zwrPYd7!*mxuwuN@wU45`F0Rd*fi%hBx>XBl?;YWxXa7!K>G#Ph^dc)#3bQ5zvLX=* zgfJoodF46ucMRjuR1gBSFc+=I%~0(rj18-Bm%3Sa@#VB1-a#NT$hJMZSvdU$hJq1< z8W%9}&|cEkj|1m2`${Ct>eEN-e?|Ob6pQ~l4EW(&rnD0odCA0+)+{_8CkKum=g5gh zK%ua#hT=&z7_k^mA#?cMH(6Ct##zfIGTdoVcVv_o+YXZ%=TE^#Qr9*qa~G21@FK}E zoDM75xyV~6VWA@hG}% z@Z^eoP^59@+Lr9&?`Z%U5w{!TJ`ux&Sk%CwIoP*pAN$|j!=2y!6_;OnGn-#{mrXBk zq`Rx1Yp%YLE%gtuv*iV{JcWc~5mZIP2nA5HG|0*&5FVkevx)Lal{l1K5^2__-)VX; zyR^_?8ctw*48xhC08(7z@j{>5KUH5R0&nJ5JE?F z2(ofyyPzimNmh}BoP2Nz2@I2pvV02j-H>sO%q1$FaWQ|;;vR31)4lmJ^QTnUA<6gx z7>fZIFFPd7&Ue2K z4B~Wp@P`99oh~8+Be=a;IEp3`z(>=`7V;-dptP(UFwWo{9*?O1FT0%F%VyRPwoHZs zL4;6o6_w)lxCr?DWO+Rl6y*ajf5Ci8N=pEXX$8}{a>m7cW%;N0^wOJ9P_ZzPC5_(L zD33Mn=e^w>1V_Q)vG~c=7f>+N$hJ3L#_i0(w9;0#uz@;5eZxo|jqIXa4BbrTXgP}W zk-||1kDkKRp>pmlD(B7x3=Y)SQ+KKnx65VE*9VahY0^DD47UGIq|E;hk~wEOaU3Kh z(snr`h4_EHjkWGhk4vUXC0nQtg}z}wn|JI56f|cxl{NFR3=3H|*#F+ETs(IY^JY(A z;H1vM<}ThHI1Z?BxTlr$`)4Sk!X~7NStUq9Ms=9Ts)-O19!YNOs^{iW7_k zv6x9|Q4X`Kiva^!Ni_b*lw{(+TEL9GOGw_m{kLi9WGfyP&#s1Ode|^d%F_58KdEEH z+m}g_46=-6m1DrVC1So`K z5rUy0UQZ6g?Sq&Cawped5ux=&17!sz%vrb!JEuZA?QX^(KGNntp|zc9)yk*uk`}K7 zCBRe2l(`ET9SJZJ3?L*ZoHQA?OTstUOHpnPSvg)zVG<07?eghpH2Io&zVUTlIrbK< z!=1>oLLvq)qtF&==drro?Atd)C?Y5+a&gZ!mojwVZH^z>i^uK3G*iq@7BWH?40aDv zI=L9#H0)3^0?F;bk)2InT@$)LiYH%X&iNMr5{4OJ`>y>soz8g1>iATfd^aZBPb5r* zGo|<@;lJZhbB5Y4k;)&)s0Z->D$+<=wG!L;=W)B(TYH3-?p8pdsB{Y6f&yHUO6$=* zXd|uMaP|_SL4($Yem3^jqgw{bhuov>7f~s7=V1v8ha=vpMMz}jNT^EO6D`SU*?Xyb zG%XWy@;PUn*;tJszb%;%_G{`O{CvX<@|YoOiRZR2HLwg@1hMrHkM^%Xhb4yl*WRd z#kgaV5N`=hEbUdYOP@)K?WU@jy@bljDmvSH8I2BOxwDuwdlrf!Av*e~C@n#AI*=6w zheN~dcA?>~G_-BL}EI)X%7?Gj~cUKfK@^ z4!!v_eZAdisw0`gYzcwp(CBX+z@6*D;nw2GVfHgRigNLH_Y-XILkO6)?mVCXFnD{{ z9)jTrO1#VT_{%wsA`=>OdcMGavi}z%T}~{;)09&oK6KAq>|+=HnI6qNrl5As-OO1m)$qJxz)%u0V z9;aRUJUQs{q9&n{0HfWb3^euAbE2D`W1aNWx6^y9lddBjggS?C$Pz=l zo~Q4PzavBhGiD$O1&6HRlrMZE%rKhox z;uQSRkXarSAwY9ImIUag?BBa^9lpe0I)sc0BhumaZeoHU!)f0%VzRFhbBD zq^LX}GaA@OHCNG#r+06L>96oW9=9YGx4kyBr()?q5z_`Jg>-&9x z**Ok*CIwkiW3Z`!G-yJ6QA+>Oo}QzgN&KhVx>7uJq$(Q2qoZs;upf}ov>YlX&p=TW zP8{8ZE7Z$1=PV@+oBGD1vKYRq2Q?c8G zi_-<=2RipYRPukws*^-op&5Hug#@x?4}{3<3-;j)S(46pcq&Ieu3yBn?OYBwN9#_| z+};KVipnNYP*h1|beM*Ho4Ib`5~fs^bK-Cd`?_0c9PLHMK`JljbR=Dhs03M>6OUr2 z2CJG)?W!u{aH^zZ*R8k{O|tA!w@nlcA`wtbzWLQFd3noWV%C|Pp=Q4S;E-76--%M> z8kXtf2e(~KNof|wupdcL?A&%mCKia`?;j#O62J^ckxdYif~+|aIR!X#icoX&QF8K8 zyagy(UKF>3QpL&6TfSvu9O6}26cmi8PB0K59E=bc3NqY3LQmTOU2TJOo$O}dct552 zxxCZxA})CX3KIT9wRHDgO!YOF)4OFOeg0-%`}fOy{s-UU!V5pb#@GIeBxTu!Pr)YY z^k3Z^rWGQ@Lgh z&cZAXz5G5|iXbRC_=CTP&^JCoZBGxwyP8m<5{Bl$Tb@mUl0{*DK8_NB)R+hw%Sp_H zj6_73JbH2;h2Ct=bxx+BMCOjm*6{g%ZshRpcUib*J>ihutV7lyFz5%V1W&GqNHB^d z+pEEqn@zND1lF`j0@I4BmA+BAs zl2N~(hQ>ZN^_?O^g_J&w(+Ms@nFlZP(ilGc$qzCv^!Sfn-@kI|o>? z;T*nk%f;ON@bf5YK8B$u9fFy6@ZbAR>^cAnx;er}&s)lEA2|za*l*vPA|VV5e^(!Y z?g7k*j^%PA6<6RWtHM2@3TI(CT229qD=RH_oOvJ4|8)N1k3TvTq^G%?gO^h|={}(!2Rd4jtb~?T$U%`0a19yZ#`9%?&6HyE*CDA(0Zy zUy`sS8IiE}ld0jV{h2J;W&nV!A!`~|*ksZTS1|X+E2(>CFME%55e@Xh(xog}Ih{UT zFtlwSXH^zai-Upk3GDyIl{|j@6u;76z}>VHBk1QRZ~Ph4jA2*?VLfQK^Olr&6(f7I z5Gaz&P;8io>-JFKaj|4oDdp7#eB<1ee0$UDlvhrrcv20qSj6s8p$q&20dgyH2-f$Y zI&4gU=5!Dm9VXN>h<8#x)r%I9J7Frmo+BJOR!7g^5IH$nNx#C_Eu%2c*zd+&b7x`- z7{4~~X=lc2c znOv67sk&CSceK(T?2CtO#@_f?4}0Q!fm?AQNg6_qBFQ?!Qjui=iXK<}Wh5c63=^yr z0oYc)-2#k&4-tv+lb_tm{=*HtwZ8#P$%;dM<+OqP@63V3FKpruv7ow&`@ef5!U$nX z5}K+K4TKnI?jRO5(26GGt(t?UW;(9I3S`xpk(`x^`=^11;u3c(h$tC_N%FiDW0hrv z+`=q!3Z^oB$yC1hty>uw8fNE?gFOHIn{0f4EAJdThBe|xaTVc<_3^}8&rxpm6AFd^ z1xs=uIb#U4_%&=CyNEXdv7OIyQss{~Ww6nPvW$>y%||G<_9G$|giQiHBOHBpH$D4W z>FaKVoI=Vky@++Qig@(c0Ms5P937?p#1MMK;BaR*L4ORPtHfl1DWdcRx>D;#ii4Ph zft1!5%kD`bP$UOU!A>5l-A{hbDyA(fV9nx5TytVFFTVH;*M9B}Bvl5>L{SxndIC(C zQDT1T@)>zO8$fbCNEmR;n!>F8W^IXshPDamf#PDP^9$LkxommUb-H)rf^_?E6+6@W>k+LC(3kd2D^>Fdc(EXlj<7XHI(R z(SP<2>;z9m(J;&aHO2Y7`1{W@vCM-W)zM^`(V=06yZmSqXOOq%3JR8AjCb-(RBxV5 zB$ffm5K>}%rOZ7sI%!pBQUxhfb16%5{8dRU+;~9~0I$cx^y!ni>Z%L)*!c_a4t3Cc z_yB{wy$B;lAT&bjd#|Gv6|?ltI~kT-#G0FsH3w*J+k3C5pg53J4M}w%DGvL+;y~6M zNSYJja3C}%IGjihr!83>9*Qnl&&27~biBEjj`#L6+}np04k2G~KA-x?YAVZ%xc_f& zV7&SS-F=Pp4@MDcDbMU`W6!($QTA@b>~F-Ycqw!jVOT0AArLyV%jQ$;DWN~;O9plm zvuPU#GVS3$l(3uG1;yl)yP29_z}^E#XpMxKI%^@(SQtr?iAH1OmE>ZCV#GqxxaKK= zWtTLYFmD>pT!o?bKI%5V2^dVPn#@^C7ZZwv(^`n7^MP^9MvPc#R* z&~s}jnOV-O&;5++KlO9A9;`!F@==lPGEZY*mE&zvoTvMudpTk^|*kY%irVyZuK1()Br zfv~C)D6OIM@fT4BI>3=j^~@?(ES}8Y-)14PgY?LfdN0VL&dZNvfD*q#7}I{k0-y7smoS? zoCDS{2kMR!GwcK@d%a;h=MpvkG8gzbL?(@)$+5(rd3frNG=UvA+2b03NNNBXk%V#E z5vRqZr8HVgN*>arP4a4X*>A6xf4}xNI}hyy9L$-u4qP6(4!*&c&N_$UA{QqPweoD^ zG5VrDBuPnARnsMZW&|L?00brzT!pMGoddE#PQESfWz{0DR6&w05)#q0Of;_xhf_N( ztSJCVk04AFDYua9VlUT!^gN_snB4~(h#C=)94Km{*Ig>7Uy4^8mL(ZQvAx}~JDG6g!beQ;{7SI8>YPWe~E0m0g0m zas?ND<5O(du!44B(cBlL<^5w=VI4CPg{YrsLmiEt65jv&zbQWXJ}JI+V4wx^%Pk`4@bzam_T-A zAr7aTy)V5=Xrz}=Oy}AQ&QGEOGiB=-1`roY>3*Ihjg6-T#6yOOKARcQM3K-4(;0p| zw2{toQk_!9SNoGU@gbWKDG-e;K{RS`sO~rbitM7Kw1(piJD8K_WolI!zFt4aJBB&# z?*-ycnv}~pT~3n{U5VXxE*S_AW-?@BtNk*vP>@7iN=hJ^pa-ImWyftZe2W4kMa3E# zM0dK7Dkq|4N&NKBU*(3IF5q{+eSzmT?q)dbgLqZ>RJ9-CcDV(X4hSaX7joT(6@2Nl z8<<{GjNaBwII195twk%JhvLqOCm)&E8RIf3vq~hjs3gi>l9Gh4sw$>oQCnNj)~)Yx z_)s0KE$#FV`tbXMn1+F(s(3tZ3i9)*nq0|(h4WaodKrtC%*E|;U|F^{q@*PxrTY@> z>)4FIGVM_6y2UeDJKx}?mVSQUHp1h+7{{mObMZ%)vuNcsHf=gW^Ol2Hr%pm>5Mm*) zjHLG;#m+IHs0inb=`1>D31_dIf#q>g7nA7e=;qLUuM%l!1EHc zZs5#vV2s8QpPm`JH^$OV2Wbdv>6|yXe45z zxZ-;6cG^t56 zO#?+y35O#*{?F%l@PU7F==`ro^k+W7ZJ)l8 z?6_At*^MScRZNSPt9Go*G%X}q=9;NxY?xHUBem`PV#f*oP*u$OS!I0WlWPfGvW(8= zUfMhR=~d zZQvW9JD-EwoA_m8FXnsC@`YQj;F3!(;*ozICND1=-H zaY(Ktn@KC0iXswe!egDw>F)%f@Ot+VrXDXPzpRRqX*t}mZ~?#D`3}`Hm!THtqK6|y zd_kPq9-_k$6vb}nA*(8*y+fG6DDDy`)e9GL@MRSt!W=twlCu`iCny9WUV9<|&PkQb zOX~pipA+0^e~o1VsfUzM!N$5JW%X%L!o=XEq3=$U{^_!J6--k? zkIJadl*b=g!iYrC!!cBk)AkCd0BAs$znNf&IQ&RfFgx0?B4J#Ur(y{eVqq%hPT|vw zX7HJBe1w>9l#xLn(P$J236IlBZmtU@$782{Mx#VK1~Iz&Q75j#Ie9sf?6fPyND_(i zV<`b3#xT5u>L=nvs37hxpE02YKOWGgHXnp?#@Mm174zU;)-0RN&+qyMuRMPW!_aWLWkP`wx=tKq zWMG)Oo}-M$`tYiGEU8*dwkIpjv`jQr#f6vth!1d(ZeotNDS+Py@KVcRYL4Wxu%wK0 zSIp+UhEwc)?-kCz_LJyHL`Ncc%Cc>6XIS*Zx1M8WwwH#wD(NQO-_O#$YO3z2X8EmH)x}pW;n#ekZwn3W(5U)bg%X z7jeVd)hz04qOLwd*Z>WQDk4r?g_$>*PFS4k8)N(76Wn$D0M8{(aqPq%Zn*xn{PI^n z=M8VT-v1uy8}+#^rav=9CS~byFgmWw;k!qC)FAV<~~Or>T>XEW&1ARdij z6-;JCf`a9(U3ssY58a{s%F_S`lf68A>@ckhYFV(Vinm>~fiFJ(45O!esO#*ekjvxR zQH)>^*Yu7$LQ33Bf%Ig8+Rhr97IhMc)nKL*96Z)bD(}(9&*8~C_w};gu1d{VJpC2r zdr-^*_<@TOPS~d%p0C<#{_y1du6a2-=rut++SdG&CjPrmCqHg+}hu220Nr~k(yvUD+nu^?JJiqdry7FMo+nn|Ljk~q@|$mn3i z2zEBI;pR(t^BXVbrq(!v6G{I3+mG<pKlj&v&&1RqQil2T@*DZ```?6EWMgM@h_r(p z3B#oqqcu07hYW=7;RoD80dr^^{rUaim=KUeS48=A^+p=PasGJQ&zVUK@He0R2k!da z5BzVehy|SGsx$0tTg>v`QZo48?d4G~9i?~We+=i9%f_xrzM%jRzG`QLxw!G~Yuv8PXR^;K80clR#L zi5YAKFC5y>!GRa3t*Ya{{@;JFa`7^<`8)!FrfW=&rTFllf0~ms2hepLWxI1``^?R* zsD>^erOu3<oOp(rM1rx=F0gG?s}*;v<3LtPc-%mfF=hRM4Hq|ho{@Oed!*%q?WOh|HO zo~&&V4@t~|0(7JX`COiS9)e-7Cc)Ehfl!k4RDwu62AU`~GAhLiO1%66uS1XW5p71m z>(paAD9iEOdL?kZ?GWj>(72M|nwvojcmN))B7r#vFfspFi$^FIDK(B9ImvzZ-46t~ zs%8a$a`|=0MhiP@BVErGmzQ6N(YXNS7SEP0k^nLkf!cc9Y#y;=KO!VS2C-^w-nzMy z$NMhfhyC|){{xS(clS}&Z&>aJPS0=GDb zJGu$CwA0)YCt6)aV|yJJU9^G?OWNp;1qj+M+mDU%v-`KR?SJpV+_j7My!~3f^KYNz zj^AwO`@eXE+u!yswrzcezSE~!)Y8Syy*t@^`bDb3F~0JrUqT3jCtui)lo|&Q9V3U$ zqQ+LDMgUN_MT36!(VX#jujE(bg^80K=~+Q*XB|tHHgIWMJ6oT7i1vl6FfAJg=~K-q z-}4n@XENA%i$HyVhVDgx#B%fW509{E-Re1FJ=+k?$EW#{SLL{7@dM1CHPGkR-Iw~J zN)+1J&gQc(P1i`LQjCpF0tTisv8_C78a5FO7U&WhLoK#zmj)(EUVyKN z#bFm6gK|Q)T-hZ6+eXFP2(ElhS^52Z`uWV)-0AihdL=uy?;%&1Mu-?!)^0$Wepg(d z8BDqgcW4yV(d6x}-mBizOK?pSdn!o)=@B!zHZmN=4CmQcw}4*^)RMPH*}i=b>o+XN zYl^C$H~m!6s3{b>u3 z)(` zYuKp?q$W5yXyU3cQ9VT75{wOxpG6j4#-%{lB(~$w)Lg@FfBDZ`_1ZsX?B090H#fw% z-K||5IC_AC{ku@YV~N_fcPGnQ7m=AvQ<%vkrDS1aGu_QMp$d>rrSO`F8`yfW8}SAFxk(+-Z3t1Z=k!ap3Swb?B4eror~8}upN|?p1ep83*cr8*y%i|I5i8} z@k+IF^bL)9Y}7){`vfn`?JuSg&l1Zh|8>q0;GC&-|HfzExkRZVa6SQ63JhIiU}}<- zmBA1?mXl^dbS3d>jeM@a>4^k6CtoreFCFbax8x0{ra=fC%ga|Ah8LttCtPxAK_KSf zINq+Ugx8u2(;+oJO-*|P&RGMH;_MEJ5C~jM5g@qyYP3kBr(_j%pWFStJRS!G zmYZkTonj`_!Lz^ZVe_@^#G3=Cf{m~Q#=s=1Zxo~l#}$4qR*HaEv?4$THJrT5o^7L? zIBAnsHfcK#Na9shFXI{KdFoPJ0CY{mwr#pP8u{6`|CZ~n{Qx^2c+wMA#|AeK*aV2N zVreID``r7v?bgeQ219In>L>?~O`-w;;$gw~;4po?LsSK;*}nS)jt?I|HzcdqTtM$Y zFZ+&cYRQ+x8fSsE17*Eb*tqR2BgHjZuE=k%~D^Y~|flRER? z=TRc8mnP#ZhM**}V*WRjbau{0U4CG%+H8Dg8Zc2Z3{HT~Xfxr6B$c!|otgn3d383n z*|R(qWd$j_PJQVSY}Y}#8ij%+5SCsCFk3J)VbL55ps;6wu7swOO{NJ%f<)>)>THSh zjDa^G-=NL4sQ5-w;@Aa@jtvCrm!bSX$I(LxdPj1!SJ$$y zw}*mCAgE#O$~FG?it~ETml}Xl3SHN+EQ?DoUCWoh{0aW_&%Q`?uohPdq!uG#P4cDB ze~6F1=XD%EI>aNteVzkHCvcTczzC4b<;hPcnVFtsGBL$WVVr@<(-c&esEiScY3O>G zzkJ_^cz(wLo*RCWkkl!-Rs~K}5HtW+V7fMzgm`W;`FhDthw+SY}>8~9C^x{&E!xn#A>Svgo6}vFg=sTv>eY+7Xi8R=-5lT{l$9z zGZYXgrI(9~!I?3DmqQ`;(rLkYKj2Ni6iiPi@F=+)f-*o$q#jK;%uKtCEn!*v}rT`)b7rMfAO5fLbRb~&&_k{p}HFeFA*7{_r- zcb)~otQ@_wSY-Y|mZXYknU^^7bbWw(qiPZ8uk4`Fieo@LOyfKgbK2 z9xkq5%&D1S4!n@!_<=OdEg{;vBGlCf2}T5(0gj_6WFawAU}Px6$Z(c)S|@9|w8tAr zs3iA~YzJ&MuehA`n^*bES46e^eny~};V2pb*LC^ypT3XB9($Vm?thZ%K%EbDHaK!% zfY1K*k2rdC7$GFKnfe!eyIz&pY2jHlM|@U8JVr6dd+%-_6teo?}t#0>-Tb>QELTbbm3=Z=9Zt z>GWr(I5apx*OCZTu>hND7V*&WBRCtbpw#`kcvN&1RyvEVK#xb!A`!^Br1M!U+x7~# zDrM@GcKdi4m#!!>gO>B)XMcbSOmYP}?Q8&`qG1vUl8Fr9;<$=BBSKvyj8$++CLAWr zG_zfhxfp}F3v~8)0O*XH(+uavSr+Rioyy_Zo)WnTEL&r8EKmEwAU1x$4-b0l6$#l) z4Ubc=w<4n0|ucw|_;xFpZVV@YWmO#GkzT!~F2S zx0B49%=91UCqMZmN`6X5x%^aFKhNHU#jQ|LNWr6M283+l|P?)xfX*w)zT8uOl zfBNjdvp0DJP`vS`+qvNl7x~NNaTcmq!3Y$Mn5Kbk+pJl;j1PY3W`6LU2YBCm-b*%{ zL6d%fR0xc);`FZVy!Ey#dEZ}slzq=U#lL*z>r9MKv0=k1{`N0!(X4I@AnNBe^GXl66gb0ct3fMid15c47C}p2VIJUfgs`RJE z(c}mNLs{yYBGlGJiJveSJ#~b}O|9fDum7Zf3cxCuIJQ?4V;CM^Q!bw)UnmfdMJcum zIkVLFeC4DPNW|>(|J>Iqu8J%`IcPDv3|P&+p}(yc>zFH3f@dyzkuuEn4S)n(;=vdJ zT_c;e$+|9C$EJ8bKD#YGyH`SK0n3Mh<1>TU3tg|PYtkTIVr6%PfV&bu2{lA~d7cGX_$gS)}z!&eHybDg|{d zinqVxbxcl9^W!`Jj>CyPy!X*Ra;DBN8{r6az4Ka@UfRkxzw%W+_1W*?1X>ZnDC&+E`T1QtcIBUMI4#lO3v)#18@HrAAQ&R_?It!i@SIIj(9M_hnBpBDm_d>o8nvhe?!K~ zBT5bC&KC(c8=y8`NYFo(X3=ylkw}2{P(6E2onZCGYiG$OLg3^qTn97_G{Xaq*_MN8 zTV4#{_fh%^=_)JuJogZ1Ki=qK&SIZ6+BnZWiuFEXz92-!!#R#iGMz4cs6H44J3zrv z*bxiMG5P&>%DJEO&S=MG2AQ#Pgp45BjE!xB)QV|IC}ae~{U+^QhK~TO^d`L2rDNHQ z_YG6m-i#3odu|=&`fcTVH0S}0`VRl>?{^hG&q9s!8)2EwOVe~#Zi?~V+i%B^20yy< z?-Ge zzy3Yk{=N^fYGV_jXaMD^GK>@% zcii?NmM&PzhK>v(lu4%cHRBoDtJxRQ+hK!Z+n}+`W>g zWipUUkeOJ37JvouCbo^gNIp4<7OC>GK)w_>w(T{pm9j)1=D047`)VDvDuREre*MzM zO`nz2F8jC@!z~gD&H3FNi!-}hX?Z|Gc#zz5E{j)x9i%Q8!_6v0L?b6GJhYm|?3B!T z1R3XD8gE#mxk*kX2f3(r855a2nUqFNy;n*LpzDI^$pXPJG`0r3mer+Hs%MdPA#p96 zslH*VS{e!0#X;FVPQb?#oTf&Fl`7y4( z;TjgNsinQUrlkC(XMe@AIeUjyct(JHiW^_IoWK8%pD@!m&DwP<*>`XczqtQ9eCBF6K)2=BXj4Y!08pXz)k`yb!V{dYglpa0=4Eb8oF^xzoE$?{i!{8zm5 z?Qi3^KX`(pdr#AsKTTV70TGP4SIcID?UNM@VA)RqB zT${E?3(*OevC)3o7Oz9uc^?ZPa4i#CIS8pCeCA}wb+9cT2Ozv$#rb<9XPfRhpI7sH z=*3Hasr4158_WR!skzzHmv^3HzVB?$*Z6!MB-)W&iOl%nivuA}k$NuLw~SDEY` z>*3Od6$ms^(+2Tc0Ec4SU)MCohVldqop^(WV|)4AV*Nr9Dd@V2^x!CVHb=Cn7A>IT z`WXVH1Tr2)i9AYKR6;A}mh--%brqCgp{}c_Z;7(u8VFTg%%a8L~nmm6nz`fuO@L?)Vyi@#kOS?zrvy8BYyR6=`PO(hKSCT+Etf>shsOHLVL8sA)B5TNou;751?1vK+8` z$(5IdwA@j?Tn12(b2H;CNI7)!Sy#?PIv2Foc{Ga z{Gh9yAIBuQ-F>j_NnZDtS1{Cy`22_ORUI@lgEj;*h!a2$e=x5&$f|alrsm_KZ3_Dp(ut6d7lMs%eq=)}6;vi;$m0rmu%0{4w4%2m=MJr;ociJpmyO7OSbTe`4 z7Lv&vpZMbY8BZOhx_T-9?=Sw9`o=g_jS#L@)Ha5R#)5tpLzSY{XEWq4Zx!bL)t?2S zfi;CHjH5}N>{N)(1*@6K{(`6PIZ0;1LP&*hEd~biEb6c0+h6-5-uBV|X6BENA!{3P zkG{a`uBqkS@4Sis`1~G%0k6t(W+cTMuXra@<5N6+>QO+DwR3!J_Ycvv5Vn)|r7+;{ z{$&*4%RQ!5gvd!3OibaTYaaJwOI01Yz9Gy)epdgtKko+cK-e)_f@p-)9k9ofC&`aQ* z{Z}<1aFofjBfGh%c_~^zkVyr}Bq3Jg;3yZ5qQ>JZL@5UQG876S8r!^*PS@`n;60k( z0ai*hGzysl6PW?b*hQG37OL8&(2WdkZU7<+5W>J~^)2V51z+h^R(>xgpm1G9Ags~4 zu!^d>9LdQ%yLLWL&(JmpG%$k*r1VRDtbN)GB$a3lGE00H&$Eti; z@#IZIxoMpIFq&p#<|7RCOIn&c&@dpEL%3iGn|v+@!e#q&IWE|+nyvSKp2wejk;IhA z%1^wBi#BcI;Rlk8jsyq>G+a|L-ZP3m2s?YXGMqVuCW1&IX$`j#(R8NlG!wZ=Dk(3Ob5@3-a+!T5;o`3EJ&V8ab9NC;YJ@|<(p_z3dp!!2 zB%phwnnHSr6^{=4r50!QnYz5gR-U+(AK=k>apW-LD<`Q6MM!3I%!~&K#j>Tg;YCtd z=~Hu!4;RQ~ZQ46S1VaXvV^x%7mMyfddqp-mBTmYV(0e?^!sQYn6F51A7V1Pvy<8CC z2L&ndyv+?Ny*y#8v?)>wiq*e^y(t`J@bDA&09mB0#&Od;z5QM;y5v$$9i3+R`eu~t z;*rq^ctyMZ{P=NIkv27XjCY<3@zx|>I0e{6YnKB^FQ4WssnuO#sHlf-eC`BQkCr~9y{4-M1&@>GzSHLtq z?#NIuL^$k?q3B_YbKn5ZWD!2s@{|>L7OclN9&#>4(AkDM7w%s=dWbUOujpA+QiXd& z5t4YUilTbD%Ed+DC`Cv!0PXi6B`G^^XC@H+0GC$sF$M{GAr9ji=tTBN=DldK@f>j6|#uByk9S?yML=y>A_5{kADNlZp z;aJSAtDHN6^I6m~VhjYX>+uDQ4$m+(4m z>pHe=qiF`ZW)KN$Oil=%eJaV5kEb|rFprcWf&t;dyM2nWJrg@PoZOEl3~a|_QDiaK zwr^qU$n#7a1@hS}E?KX^O2tsmZ^&~ctoS2waj_i-DFwEp2#FwuQsiT31*)*P^OU-h z`fr)VC0HJh@+0Z>HMJDMK9*~FY&@1jI27bqtFLM033SnMj5rdB)OAK?VjMaW zCzGr}>IFo;7jgrja#Xe;s^l4{{EwIX@y1g^XBGil%0)_p$+0v?_f3#XntbEi{|F>X zoP(OCV>%Oj^IKoREd)5Sdy1)%Oo@-Kk_x;?WHH}=XU=wU3>5~hNai9WN?G2KDBp*s zOU!(Xqx++bjaPYK7zKu|W1~1ax`&zMsMo(h*GQ+5jExTCItnQq!Xb@lBtRf2{XPz& zJg3+kp59HtN#ZDnfDE&sY9Tfb3+h^^iN^T#fqS4-<#{%#Ij8!~`SC8-ms`hC=(@ML zSf*7@6)S}Z2aq91B@*OQ9`wCBUPUkvD0O2xL%!$eVzGZk$%C2I8CaARbruA;sH5|3 zGV|m?W^ujEIm?<K4p=B*w*O@{NLbGAMq?p|!CAkAvMMVdZdz!nB|+7$&F*D!Ka3 z;{nIGphTTV=;H%&K zGLc{{`(Bu!_rz2wPYr%B(0?|eM7fQ;qT=}~o=4$7i(6hlApsk=Fb?SxXzm2cjWX63 zWB*=*$y5|AC}!^;%0&ybAdNV-l_ydgCz+q-@ZsI)hDIP1L*8V+yl%Jrz{ zg`s;yskY;FLskmqx&&eoj1Wu@4Pxad0cdWhB^V6gxUR=iG)D)E#$!H1P!jSIhM@T2 zGgE)1K>IAO!K02pgAwSg(@}BeRP((!I|M&VogCL;L2D~s%+VrkW>IlL&a!DXg4Bc} zjAjxq3zT_2%jC_EXI$>-*~+DD%c;^r%s2&dImyg~MnkLXyI|!2n1}H5Y@?TWCZ;r+nrs^CvIImw${ht!gR9pgW!T@L zWobc+UexU1`D}26KzheI0jZe`#|}-Bo|aSvtNFM8_*d?E@~22Wies1I)c}@Vz|gAr z?PK3Y2H-P)`gsOVWtbYzvS?WY)%C$r>_wq)l{;%re94<9av@7>$V%B@O(X1aq-){0 z29r}UMh2p!QU9Hx402kel z>v*1GW_p_JKFlml8voyYno#VTRR7JV%x|^^p2Pf_DtH*ywF?d=`$IYJUmxI+f zGwkm5QlNBPM7cf+uzdGWbrncRoE`wYBS2?+8-}6dx(ZD{bH|6W5jaD>OYs8c#0$cyB!ut?A=+Aq$|xCklIdI;SA$&IB_P5y z#UqSnra)-tWdY6!UYa#gE>eWpKifwz_3JIEq>$qeRE}4YDu?vKovIOcSwq0B-zXD8$LO#Oj(+)#}A)4z7)HN0eN2bu+ zNtCQY$!e4q1rhYvgen3&mA16x!6}zQzQFWEma(BcnWTmhs3Vc=<;(x^B_7^!7n&|{ z>^zY`oV-==+M^4N?zUB&96ExbN4fKX|6ypfkI(+u7g!iw&ar(-!m()@TVvET1PO#R z-#JvpRsbcXDeZqsAcTujd9ZU}Cy`bj*EPxKf=o{bnVt%g&IV9IM+QNv^7*wW)P;Nj z7oGILvwjQr0Czum2hBzUy5H1M0K)a#t`%hpmvL*1-szJ-l%o>|IXQg-Aqu2XWKXV-VWJiu1vyF8wOAg&|5*hjpU64#Kc!1eL~k%l-D7&vs) z|1Qb0&JJAHsmwN?ah*FLc>Z++^BIz2G4wh0ZdQ_RF4lmv-$e+4X<4+lHqp}5#L1CS zMlw@an3$H1Yf2V1)UtoL?`3-c=d)a8B{sS1$TM8hxRPifKq{ZZH8iHi1-c$0QdRI= zxY>mfWnhedGbz2Ec>)dLy2wny3#9mRBz$kk1MEno)NpLY;IP5iSQXKDp6VKtcvXRL za1d!ol#C!WuTzZ>632#oE`(!CEXT#NEb-&KZqy96|Ypb^BhZIsZlEfh zWUfNJ)KrMd$(qBES)R(-gAoX9$DyV+%JPL>oE+K9bRk93$r98eq^E6`H?{%$UuGs? zw#gAM`A&ravwz`^yMN4O7hla4mtDikrE6(uXe44tW`=V_q89bF4xxze-r{1} zHm0Rf$Qu;QFu8n?Tp@tt_>EDeS8GvuUM{9l-HJt)LNYlq2Bhe2y@+?d`6INp)*&?m zp=-XU;AM>*&F>N=ycDlcUfX!((=NDqn^OmmaOj2SNX$%7u(F&=oW!*AXGqBGH1m9U z^p{RSd#}2HLo^tnDi~zkbdf=glx}0%Hi2*$M*+5rQ5z%P9A~0ufT1G?07Y9<6Wt3s zFs(vGtgQSzm1*a)5hzM?`Sr@@J)0NsQok=5fb-vd=XwFN6@I>8fvZ3ml8e@@=l*RE zP;heeXNOp$uV8YtZOpYp)6Qruv#BrTD)abLVZ)v0g+~k;F7ce_LTKd}3!g+yHO;eyr95hmSjbzSy zqb4+@v=P$dDAaTpWxE{Ne~gD8dzf7ZchNsSz*K4iMFJ1s4-iA4v7%!=Z@T8KT(J6L zgp}k9`B?(u;$jvG-2R4-vTW%Zes<4yI6brn&`4%RdEoIM@xbFhMo>d-O(Wfn3)!^n z60Upgb*xyo7&RrZErDBXTV71v3JsxYNaQEGO zc#>Qu?Fqc$AvRr~!rj90G8#ey<)B>0!_ot`>ve*vF$-*5vY2$Lopd6>Xl4Y{&T+2o z;bo^`OEase3rC3Q27~E5!R96=-7L0MAQTD#UKL^jQw2Q{#O!vNW11dgorKeEBvj_zxmTYFb9KTPEav6A3x*<|%IHtu# z>sO;ujYEo)iGDV8tYs#VXOXO8bweB5`j2`vRI1X=ddY7&_jC9zl|rEjgTBlVzdgE* z53RYLWWbV|<(H^huD~>1q>ywh-@uks6kXL2J@FzFGb31zgDy26N864?lCYu5w zh=;3ascvIM_XaN9vW4!&i?K}4dl5n)w93$8#jfQWIW>>5EYnAq)5e+*IF`e~BYOdj zV?%p6J$$f~mv*J&^$?Mof5dWd9Sf_FB^ZdJP!wDnp}ZKA6b1qt({)OvzE+86Vz!dM zQW%goBmv5$t-2OX>153eEe$nHC8q!gggjOy8)#U(0A<3iyYIm>+!|M1w8`T}@G~`) z!c{qUXJq225TJ8h#a@DQ2VHs3GmZeSd}b=X+!qS3HF$xgi`!V*(ZP}a1N2S}Qs~ZN z7A%s}0XBBGv#tM_zgxJk5?X6^>ql1!Ai&)xpX8GE6)dW5VQ_kkR1)HGZwF3HK_L${ zjV`+GRo)fbq%ws?FAX+lQ<-Z+&k#j_qby}^{Zx*t90FB3 z7hSWGHEX+=7`%;{=^4MqUndXoi=~Lb(d9lyk3uw$25hRF1jg z2vtmNmcnn!As7rXIy%C>1KWTAc`HfIF@X@E6EkAyLMLnHFi8R~T685H%QrB1{6T__ zqP=Pb%E=LqhZ)EWkjRX&AlAh|W*k?UrKc?KmgkbHm!A?`*iegYf}L{+HrFvYv;($I}*rm3%~Cp(-WpUH4#_ZA*F z^#qfdaWC>u+3=iORx96kru0?*#__|;i<;`mrYw}u(VAlP?KnYoO(TIonCYo0>enqH z+8X4Zf4>vQ90TB@HLK`a(CncFMfqqn|8vZp>-pvBC3!q4o5H!5UU|%kbb)_h|~p%)P+!PQAu6T@G6fJ(REzk9T)S}lz4xg6^i!%rz%6mvlEEI$4jJ> zCOti;xaYy20^m4#mNs|uq1V5K`<}mt;eFe&GdY3_mJ#i$hph#4Sx2(>5&riZzXA$? z&fxKr-gor6K!B)LPoyg5*O#~z-+ewZdhYF}s6rC2U0XvWPFHOeW4#5mcoo?ygZ|#* zbS>Hd%9FLlTh@^n%Ch4(cTl9nd-L@-p-T_{Axr!dob&t7eBQIH#Y>6XocHQQzWe#Y zfG?k_=uALDWiUOH&9Y(j3f3)N!|s#YIX>A-x@(4lt1&)db7|Ki?me>4SDy0cUtKc* zu5uBC_{Fiuxu9VQt7|*yb#3xip7e}Gb&cUg?lCCj1QU5hEUt*fH8kB1J{1QhH8gt~ zbK)e^!D@_@Lv2HtU{LoEUgtY!^DR{IY^{p18SmLWTw(IzDHc#9gRRQGjZ(dSJ z=~V%`j#J9#1AY$yrv#KK^C939z^#y@BqzrFc{XuflZKjZme(&wm^M<=u}quxC2gD-J;srv zM~T*M7R&_1m`pYgRlglBcj>4Iv{O6a?pNkeOk7+Kx!QcB8^Tze$yd8aB z1uvk~EV77S7G65As>{eH@*pj>HJl#GvZk(!i#nI0Fke-kfcY*dB$hJy zpZ#}{bPF^FYY3r{b6lp94z4Q^LY1Jhsf5Y+h(&T*;8>cUHxt)l3ZRf zHk>9oT>w`{7kYV7D|!j~lH>)}gjXTx{S^OQxrF$NsY)D-WiWQRmb@&S_yNqbo1fA> zivO3MhajX6(=7&&gz|PM;k)rv)&*3Eo$v`rMG^n*jah0E*A+~Sn+*2PP$;;hGg1m5(+NEmELJptY2|!bG z8wE2*=T)1S8P4+fH@}HzkSyMF>&?{EMzI~cw9fN?-^-W%5`B$VELrHQO8(j(y?BN%UcsP48o5i_u(I_rjMN}OhglV^A-8|C!EDs*Nm-`O=f@gXjCY4H($)<40uzzrO>1kBOJf7VEz)Q>2?9T~2TtZu{ zmUV3{3=dimi4g8?W!Ll1Qd7SOO$!rW-p+yxyLsa4-(+UsAfQ;Xpqn?o_C`{fESi*F z9mT9?n@{;)uDrjrQ7dl7#h+QFF#ngA^6}q!)1<4bo;O{86JRlxonYt0K^p4f96ym_ zZCyLpty~1;eaf!c|GgZv;XlEF2CtxSoSp8 z!Z;7@yO*DA`){5-@*5zJZKuHnx4Mx~k_mAB}eY}xd z7GDL^l9~Jvt_xFR7BzJ`!GPi8w#%+MO2@^)vR!OPf~&|Je1ceQJ;Z8}J`GhSWs}WV zgd--=c#u$3L)ScobeVnRDj$7(M{|ybi#a1G?)SwK7a=^N58L*DG=>(yu>`Ivo;6k3 zaS#<@x)SWUtnB64E*?2#SrLk!g&$nh1h}?CI*}(ilc$jLa`2jFVA}<%qSYKaevq$y z_p>OnNExJmXg}Zhn~!tr^?$_2Kl<0a?QO5+{@?tZ;lWW4V5AhfCMlQ&4j(?mDrW+D zc*e`Lw5_AQzK-iJyot%tQF_Kt13?_uoik5!rTbh#*~+tc1(LCdPjD5r!5FXGxQ>A% z1#%ha+`N|GJo^9u)pc#GxcM?%)8Z$8{4rc>1}JdL6*q9(jW>}I7>deA zo)hAmB_H!)b-e|(??;G8Iih}+C3`tn8KT3Sox)!yd679kJJXlhF;CW?!}mv>DTEO zPY?bmO3GjSeL478=_MC;c_Bop)YWw$pUYE7yJWLD3YHB7(1gd1Y+D85u{bCCj`HPy z{}`#v5Yc!C!p)OTr{=`|Jld* z!#DpiDy3nX1tdB`!s)@o+_U3%B(u}VQghikN1T@{xAS~X0lE;_s=%8rx|Bw}p6!Qv zs9Lm;>3W^5PuxK)zJQgtUPITW<^0>5-^NtmP9RE4eLJ83 zSE*0 zq;(}HM~*X-9YqSSlB}vm5RZGoC07;7{&2-YDZsK!jK+n;H@}X8p`#qj+tK{AoZ~t^ ziw^`s5DXcFA_0t`fo3QlOXQ!seWM_Yuz&c!ZR$Re$qzneKIT-zaD zRn6WbyZFbi{TY*q(?~7Ef_L7|#xNEi~pW4imrUm)$^h{>#F(Q zN8iVRr^h(BE6K)>y^r4zrMl`KJ}M8`@?@BVANw;8NT^9|G@2U zdOd?91B8OX*+#w;`!yuc@%v$`i4^sp<74K7I+yTdNaZT?yVHa%7f`x55IJS#pducXL=S8JF zdq*WHiB-jU?CE>?+IK%sHb06GL8Jn?Y9%-Q<>$C$(E@(*#V>Q@v3rra*J90^Pz@of zP|5_qxV9n6?(AWPCLjbQpP```ex;Bn-S=F(a|NPSDS+=y3 zbS90i=@j`P%Su;qBz>6%p!CkOa0gVrHup2yCqM9^FGxSidj_TVdDJ4${$1rml}F*} zNX4l9QqX)p&&E|NIe2`K6TL^7$!9Q?;)3?&oIIYOt0m4gmvwUYb9-^5h9-npSoD7o zwk&!An$XBOS)S>8k)`!rY;M_1%FL6=B|tZ@O~_?Eet{)C9q7FeAXtHvdJbb@@bPo+NO}RF!KuAR5+IM zns_*(f~`m5SIYwup*&iuLZN_dS!h!8Tb4M8X~p{zt#~FTVA^e~)FSs9Csz*7cj1 zI(-6nypP0*0oHBV%*D69jo!mUO!n?W*Ww5yK`qRNO@Bgt{RK>p?L}b`3PgGTrnm8q zi(bPE{Rc_rvlt>gZ)WKHK{c~KF;{MjlIC?6&hU|IujJM>>$&f)9+XzY(zm^d@BZp5 zOpf>P(XaiK7k>9^9{9%Jpy_ouF1X4;lL5vOBRu)s4z9cSQW_g-F-_A;ALo6a|wF#C6Ne*E*Ms(6nOUO!YJ1sATpfV&@i zicBuY>BKNK)pabbZspLyQLfwE$%^H*+`n@#LKqc&_vTx?S8|niL`@pxoh(nCdV$WG zcCP5&LZM)j&Q76e0#|9|(+bOSFhXD$0)dMVZfVF$fz)(_l_N8H932g#whg6e9$Snm zNAOFCbx|y*l|HAuK)C|jQWOe`T+XJDGRdb*a;XB@M4ntSPcCheO_^kq1v05T*+hX{ z$|Rq*$fZs1Cux#R704t_vWYy|8Sj0Wg#Z4eO(A1b$T`?1D9dvU;y z!gW_N)YHf0)Dbih#BnWZ8!jM~pC*_ar#4*2Ncsp;myDz)*min1n$Sz7+p59he<}QwS5fHZ2G(SW6VT8MVzD^Me1c!z`Cb0wJD+24{1|8vlxvfBZM2aD z+7#UQp*L{lB^UDKeOt+=hv?mLh@cGfxBv7Nj=yk_q46Gcp))qVmp0{a>%uFze90zy zXC~P@ypO{pCy^K^>6TXh%rx;Uk%V$vI8XWWtZrYxe|`MD9DJ^yUC)iP=(6h=Y%uxZ zPyU9^mDiA-o?!1|KSbARu^o$Wyq5a5MYOG6#$_M)Lk>RjI}9Vv@WcS4W7E9xy6b!% z09jE4CT35suOnxUPn|*BHP--~O)p>C1E_q4m*EAR?L2a3ezU@@D(xZ)O=_gG87|(m z3Z+HZx??M@kerwq;)0IlSXs&bL&JRPy_Zl|ZSc^p{b({Y#}jz@i+;99LM7R$CM1ru zdA9#~QiVLPS#>?N;aa8=qgYNJT{lp!K|UwQWxcT&0l$bxRYqey-Z&>Si8Xi}J(DF6 ztwx5cP*OwrM3rSUU*!zS`9-^=lf}jLdmBhG?+)N8_MBZolt)_$3obUPDBW1hUNhHq z!G(YkA{vX3$|kw*v0w9V-})TSzIYdw3t_#AmC?m4ig%LAr5H~3knA01>TsT0-ugPa zmaS*oRPuzzl1K4hsOS;zafy-{DrLLAoPrkrJX3}^2-8r=e zuO4K)cppvb*lw2PEzSJzUwx3VLn)rVzlQ~@E<<14$v1xXSxnQxF60z0$tbp$R*TPhj?h`L9fedd0OTu^tqpBzP)1hXT2Uq8XB6^*gN(j zMf98$cssqTyZs>>n>sE)AtcFY{myh`T5?T^X4_Tk}@+)=cnnN8KJ4BiH8n8$1|t5 zqsf5R(Wzpse&1x@?71jQkq`o@X*h0*3l}crr=R;MQ%92A|LgrUExLgC+O>S`w_jp> z>NHY@vGN&&2zd7q0$u4`{pLSlaNsDG7GV7w-^$V}H67=1A)SP?y+NB`#PX{C{WDLODA#F++QZp87`>0N&2{k$%>E=E8noi1?u zr~iVT2e+ZiDwOLYq|Qukiox_GTRPT~n$*~}yO&RYcngc$Yq;mx{kVW8jZ)C$d|kk^ zK||D>2@w9Gf~2!S*-lv}`^7@{!TgPRy7;D8p2Awyx%b#Dh&%8%}gVi={IdGsxVcWjs)Z}C7% z<=>T?QqK0sX1SIX20#ceQ=wcx*r^AIgkuB(L6XS?JNG=zPw)H|-~IVNvu)pfq_flL z!a&!8IJU`ayDw)|WFf<;QKFj0=A|2m1fv|8>Sv-b%=E+%^)qqWg9}-qLTnv;oD=C| z{NuHM!ara0XDp02@SDS1FE4IMog1S5!&8ZHViUF(m~hmpz(AXz1X?_5`D=PY4%Y8EYA4~v`G_M7h#GwNA){p$(ThR~{lRMpk9`_A708sk&b z+;+naXqqZ{ZbjE$6^(bvh^uqD`RB7y&-XrY{E6q3?kL~$RCuhad zwSeQJhd42~k90nXVFaL}8WI$S?h=bbB<2%lsv_T==YKm$l#@rS904>2z7B_Sg4oBG9`#d=-OX&5tv-n-_AhY!ePXG5e5W*p(ho}j~na-uj z+v6aj=!EDD*D+z`$=X?}^#E^Mb_MTSeFN{j=kGa{>)}tpm{%1;J8`VFTRQky0##j>KKTnc;vgEVa?jNvhlU=WYr(N1}6%Jt@zrtw=j74 zd5{6_`1-$b*#&D!=W?@|foC1%W^Y^Pg8aVJ>+>B6&O8E8q#T-kmUyLCDLp7W0>_{c zWO#gvPyF4N$mC2Mx4_bcTexxE8DuU8sPz1^cYbjmyZ_wR&V1FY-}d?ro}50&J%=7AXvDc} z*<~zhS%h*FiOe(wyWr>e4I~oVQRFf%>5RwsC(zL}iPXF<#ojsGKx(?@5?VRj#5nfo zX{@2+ScAtg$ByGp3_vo8%;%6!){hS;geJUPzb24U_jYDYLu#6LPt8F1_m)Cp_{IY} zi^!yLXGT#YgE;-CnCk82Z@=~Dym0Uyf@X-d4J+B)dS9gfN+xnsAqkSFN_}K2V1{SvM}kL^_4|cunyBHcrhL~&*GMiY`OBSWRugxmMr4A zr+!6p{50z~y#aDAmJrme?j#xuF>`u|lg~c|%3;OArEIxiExAI$uNL)2R>?nE8Jj8U z(M##&+}F>RCM;faY5^)O&Y8Q&??VzgcPRv3N7ZOF!gqf42xC(N2qIM1FXYnKzZ)$W zW2ts22Oii(RaGOG2VTRr(+`kxJSy?;?EMX|>Dt0&H5<9}Ta%nTp5!k-dLys7Y#D#} zl{?seq8A||e)+C*Mjb)rDB-2{%93L|OXLLL;(EXz5o5|6;qy;^mV1xf&7WQQ2VAk} zO1fKCbFgnOBU2}^+&sDwK+`pFJw~2%64EIL-SB$eMIt(Zknpo^uHREYLm55-5Eq$G zqH;4>Y7mP<=;*k*jvEYm$BsbQQ*s$ZXgaQ@&DI+wP_7HMjceNoD~DwjaI8Giw2`)r zZ97D?7)QoN=o>%4=JrduxaA6*f*_=HLPmgwcmtjF&FmQ2%XBVDAQq-8qVt1K{sa2d z08t@ns_I~Ad;v>iUDRsTG)8LB5Ii>UB$_aIeapqz%4YY>3;g+$-{7w{y_-9aJqZ|S zB8*Tjj!%>^pI7tJ%3rynvxBCZ)I72j*93BO)YS6PH@=2Hdh2CGsOOj8+Q**f$7$_Y zNirh&_Vd4F-^ebc@KKKlHZHi7(^GvUN#M9y7Su22%4^<+W9S%xFjJWc1`ckeu68+f zHLaLJGWOg-+PADgF0H41{c1d}0+ar}!FhD-)jfKj>zZQ#UhTTTBB3T84!|Fvl!9C~ z&%;}v1-zn<4VSzgJzPzqkfeU?1vKqhMyA$g`A>_)~DYdJD>fRW@NmXq^%0i;0SRT0{jPO1Q@6c~m} zFys;q;-wM;8d6gT*ULwsX&?;rBFTpmXehLN7Ueo9raYcH*T*uru3r*7J3r!e?iJwY zpbepe)KEeqHHl^fy|zXeEQl>)eeDWrf^mY;Fa?$2EB3zgleamU0VzG4gsU7}Hw`E@b}!&#w{7MfH*F%KRrAcly*&MR57Ld(wsa*= z4jts-ZClA%DKssN;}ob4)N;eJ*D;hDWIWpo2x?*-TyxFs5RG6?Oc9F2c=3gYfIMAY z8_|OyY|F%)$uhmKm-?0UL~0uFDl9Y-=`>D73$gz{u9sB~{AwHp6pDbZGcrBRiNQfY zP+i?bN5=}Rf{BKPQi2OEc`e6}ynuCWlm&qciB;FK{m|Wvq)%XIVfIWPr#C&stqZPV zMRFP6|F=QbZ5if0w_nUVZr;FGzxNbh|Mjy>nkfVkbg841Tk;6XCxjw)zG9qbos+rY zLN6mNlt2?PY#i=5`YRqj`6O>&^+w*i=^b3T;(EqXBOD(+#Mty{Of!qn1ZcwRdgITj zWh%^qAR|C(E&)Rj3~B^|ju#NrJr<+V5v}NvNDWu$Wk9Uoy;vxxBA8S`DLp=ZNDXesecx?-NlRZ4V^aRf1ZoBdKig@JfP!74Za$<*W{xE}5Q5 zkWOU*L49o}!9bLpZ6bBAsYQF&Y9_~rnHm}(+SEkt#^qe5zk_Xi?`9}-1Vb9kSXq92 z>H${P9p|RDE%ZKL%l{lW&gD16`25FT%lqGYG5`Ag$N2GsJ4sk+AcCd^Jg3_ANf9d2 zFJ}tY*~HEpTP1U$qrARzx{Q%@Qha;gx47fzUA%qOExc#VJJ_=HdZx3J^o|{6bovzO z{3MRDz4N+9pM$5?F3Qy@i`rlpYipO&8m*x%vVa<+ z3LSxMo45)b1daomE2#-r5i)e19p6cJrkmR~+{EvOcK{j>9e$K2k3Y%Y!Tm@P!F9|t zWTyP*{KwHU0uVoVsiE+yEFDz<#{@K5t82Mt^IG0;?P_k^yoj2*IwpG(-2dZ#j_prl z7s7~OoPIgRLK9&em8B|J%cU3G%<8Un43G5i=+S#oq=<&vxapb?5U*(> zZ<&aKSHyI<=NVil!Qw@i60dD0Yv&P~#L#r|V+kA^Qj?>A1wd7-s$~3L?dyCIyyxTt zc=ZB+<#iMSY|Hj6pr2zeQC+!SKFbz@?xh>B^CmKHQiv+z>$IWcpJiyGH(t=P=AyCr*{InG6|t>Wund>5bj!|VC>FQ4ImAJ|LJ_!OWcM96ET z>30D-GqH5$S@Mi=&H9`7e#iA1dLZLWn@Rp>_jmZ!!3TK#vKx8p`rFvhbs?+THqtlU z$H??a5}9GLX2y#v2n}6&I~Xn~UpQPxp=^m&P`E;Y()=cw3L)LnoO)*`=937p@TS>fC)l^sAg&H5_%H@w1(rncgZd2ZUiM99LMocaKgi3 z1cbNq8ir0Z5T-U1rMgC%RO#P%DJ3fIGuxLFh3gz=NTcvXxVoeSE};p4oz*L+4n*W3!= z*{l2{XCjn*9d{JbXq;d$jGfDq%}wFDR*A)0x}YqZXsniGdK#->fo716N@ANAadG5L z1h+-#N$mh>V~7xza@jh%lid@CxU^{lm$HuJ&mDF>b%;xDso{%%ejA_p;~Tm6;X{1? zjvYL?{{#iwqm!00fDp<%kEzQ2WxnhDfJRaY4ca=lM8bM$8{i*_?OGf0pq9Y!02 znK5ilVo04TO-CXL26bvfQ5vE(G{tIZt!Y9x40=){{PM&@+Onv0fj#ilM6FK$L?AqpcioZLIZQ+s=v z9&pIz1T&6BPjZwUV<$N}IZED10Rkxk2ob_`b3_9TT(aS{EMC0_N3K?Wj;#iQ)rP#aoA;4zs>Z^&@H;~Wgz4(*=q(Vw;2L_KE_s6EQ zqH6(8v14&D1IOH|+TZUw+wMPCC;yKdgUo#(&s{AP3Usu!(Y2t1L&wLNnVu$}Nn^yS zyoQS4bqG`t4o5Lf3mFelP&P`Fgf_IXvHHzKo~h%=$a7d?l7I-JkYt=Jj|^{P+vou{ zH?QJSb3HTPu-JCjQPy1@;f>d<F&6`S!1#=dMTgGnh={(Pjpb(&Lo(yc2a6 zCv>*h&NT|9v#bIK$79D4aZIT0Dz{CJkg)~L5n;<|? z2C&HExQed!4P0^QYpH5%qo7=5-sJJef5GtRL7Hk;bNQCrh}5@`4?D+U^ju^lL^_*g_|Or+rlp~t%^TK`E96Re&B~0&t6>C+ zGB95~K=IPmZ14R4^eTG!)zxvvrZX5m_kK2)Vsc`Tj_S48W&wmOm6sZtfixtRf`+Aa zOq?16Q%7G`!^JJP(fZUvcI>~KlF@Ti^~E7(3K=|OpyS2pG(T8V97U0MV)ofh z%yV=o(S9g}7m}A~B8ICJho%m2Xvc2;d*_c>*SLnOy0>sy_ZAk`EvBP!DYk8r$tRgf zPm<10lP=7VEo3QJDQwpU#|vmGsY-yJm&$XLdgLjEP%f@0aA2kf2(hJk6VqlI+%)=& z|AUTBiYRsAYH$TLv1(eITj(pyaMQvohz2C_aDB_2*0q;4K-~O#w;phO$ad4Ca%HuQCG3aWjXVaP{uDEa^mu*_a>ct%dY9dfj zuwqp`+t|v1##(2*$AVwmY<-y0E;$3fgJ(+CQXNZ!s=<{9; z5Z<}?JjC%wpDn`<}*wJd8;SFInai5K-3GEM-gmD%ye#M07!Qm(BWXt5|(`9eQ1W;l5EGeBu~)KYEmH zd-@p5qw97^(n22#~P_4 zkOTq|zPk7O9GvOlt;^rQi$e$KNgd{j1=q8rVHrQz^F3}@d=1YJ>_k^O_kQrdXw+)y z9qZ@t)G1yZJjx3rhd7n&C+kl7Bh)=G6B4Ctir+jdO0Q`M;l)Z^*THL+={3xZ1!62} zt6{^kcD8Kn=Hd-4EMMA2I35Pmr7)6Z=wyz8o*WaWGNh*+(iw~KLYARyh7-v_dS^x$ z&m>5=g`)ZOe{_N(N_+DPR(EW`EI1tQ-%oX0BWpHpp{lNlOg2lvFmTfuo_zSH^p5Of zVdG}jY`Kx@#cdD`c{1$^^!@}xCy%i8`Cs6;1uow7X1bSeB3H1{bdT8y|M-?mWa)bE zjf`hb@#FWr2`S^=+PE1$c=Mb2!k_;!j*-I^OoqPZEgLVwy9wuJ0neu!ZUV8ImJu za^pEN$sFt6v7Ts+!R`n5p)xwbh@i8xhRmTXTYvRC_76PFwU^yaSLbTBzi=1FPQ6IZ znZY~l*hmx$V=ZiMSj*C2Hw{LJs%mIhAz6P#l&%YEp;|F9nBs4eDUfM=>>|Ejo0?dMG&Pm+{B9JrCiXwhIRF;>8kId zDN;j7k9$WIx8U&rU}8H8%dv2Aa9!Ka_gC&Bc%&ZEASfcppuyXJ@jiA>>?Wi~$=g{j zXt{`67Qcr5qX+rzi8~RZ$i1M58X+P^gz4-IHihz7g@GnL0#N1P&ygynStYVWN$$b4 zZQtMtssb@qbT@F>1zlWq;ZioNZDm164O%<|X@^9Ao}r^N44;@`a=<1r<&sKSOy~2A zSP2F)6P%hEV>p{6;pY8kl9XGg2Z`u$>RMV^(6W-n3)X@I2M#<>h72n=Y^0@qA*OIK zb2%cxYEnZ(Jo@OjnMw|`V)^S>v*ikc&2=bUB3v)?qK&4RI(dpGxBrG@?lc>h-N20> z`WVsfD1oXV!}~`VJvd6hKVfGIc~*Sx?cDdzf5-0s{ZFJ;gX`ol^lB`7iq~Ip1ONGV zp9R;&c3rO-O_8PR|Jn$gd}Ny{BCN}2k5~LnrAj8@2cRNVaX$A?U+4RG{s=>l;<(cH ziv6ILlViiiTe$41HpI9!=gCfG89g$=*vJIeyzL@#xhy-MIL=gW zia_v28s(z5N6)9v)(FI_)c~1OkBJ z!)(2YR&LQ3sQh#Ot1_D){i+@Z*LQ_IWzh)J5Ne{Mrk%xgowV1s(_Ym?Yq*wpw3Zs9 znt*0tXa)h@K-YANtTrgGrI_P5WbGWOe1hKOFrR<)D-2}%(X;@LYtvQTO;edmTp={XU9@(>EK#6s$dfgMj1SEh-aSo zAtpALUHL9LH(rDjDAvS)rs?Q2SyD%OcxuO;Or}n=VeJjv{^dWX{^Et$$|4dAas2+{ z9DDc(hR|`+CQe(Nw)b7mw{N(K(z@ z;rcj@^4a~>*pQ2gKgR$(uMk#AZ(r#b&ayHHl(LD|)bY>%^*z4&!>^+o_1IR9TCI+S z^-I}1e!xTNDHlyQc*|S=l$yp)%={>hu2}o7%c)*egJYQljR0oG#&sP6Q61Y+9N2n_ z(|bn=24TbH%g7DqIrxj+?B2PL^*3x{;pT-{8H>r&r`h?`gY=x-fs5sljN*c_kmz(o zTUcGy&XQOc%`#3nAgF56XeWB4B7_CNk_j*vAWdPVnM^0rnmorgtz! z!pRh80SNh#d=GIq+e?_O_Ag}^ishzW9ei>3bo_Vd2m%CTm})IZP!D1l0Srw?6FQpo z8{2lRNCQ+gsDgK)Hg#->hMIu=vky@YsU14bl_uobpxF>>$(C-(27ZFv_L z+;}y4(;_>OKqwbn9RrR1+aG7wi}%vex{?cTd=u539TcoQuJVagG)XXJkvMRQ=XU;< zk>n{ZyZjd3`OkkvWO+4aB8wK&ne3Ti-!FF)a1B6UjU;Gz!{vrhh_=aFZ2^X|`l99`3~9hZ8&mDgYMZW3;uyC3_O7coWRxM>zHyo}f0 z`cZOD0xO+EtB$bxEf>(RFis&~K$C`dhV(G6h=8Q;&=^ObJB=_cF1_^voD979qZirx z=suQhSxM{0R!qkx?CSI%IlzmL-OJ$UA%uW z`e2wy462$X&C3kB*3{CuycWIP07GIYlk}Y)XYZk5w(sg?*MR{JoE&F#CRwpd83>`H zYd#^T-)UGCyXusb{w2yjDGEY4-rz9|J5-i&mzCrUbAsowXh@-Z&ry2cEYhiYN~-7F zN4TE1Ls97qfS^8B!=)RR@S1Daapk7PtX$cOUK@s#LvC<}!IM*r9L+G%muG4s$Ha7! z;dGXvT!O*$48xfjrt@hMPQib+;xovkdlON@+AO9pbeEQwkRbXecgd$PW<5_mzu>&`$yjY6^ zW;V~#kKD=~pZPRLAG?D{u!ZJGEARW=&uF`BA&-6I=lt@Me~2a}uAAc*|N1qqyzD|! zsgws0Q&f26zefe+OX#v619)B)gHXJx2Eco0Nsu>v?2p-f{2&NHbFhQ!u6rM~t5&jq z*H)f>>_@~RRiv}iXi~>^Q;9UAi4-SOQ=FO^p)WJVgqg!pMen2doemHtqE{2EucN7DAq~xo zscmW^(ol;Q^=cMe+r@DmG%3Jw$xSB74^1&OI)ND|u>SQMS#-fVMtepXIzB*%08%%Q zT9DI+ck|-o_tDba%|$o9fnak31t$kiu@8Vk1`Nblf}ZELv2*{E)YQj$`{zHwrrU4A zv`p-Rg%L9-Oy$`5o88!BHoBqVxC$$45?is5Kxc&ie8Vk3p6>Sbbk=qA+MoUlMoTkQ zarnhw|2^#kL-``7i z#$?e&-3ZOaa>398m_vi~@7}@m(fxFFtfOV)rA+0fIdbB8`cEAqnI7|vfj8-z2+|O$ zrajz1Yq*Ivqn_4aoQ7D4csxkFQ4(*{sO=2XzBoiBRu`wQJ#AK z6ff=>pnqltMZq^V0d!46`3CMBvph>VU%EQJ61rTu`o)*r5(K9*OELEwG@qr|adSYP zNU)aIUb>d|+_r^luUkP?dmZE~Qa$7J?w@4faDs`xB%@<_hG(Yf%Ow~{C+JU4GL}nX zs{9;576=TY;d&bDyQynyqq?n&+NO5GHB}fv16zROIJmas2NYclJ%Df|>7gmo<5Q@h zqNXd#;!BsYbi-0+2J`HH;t-kX6j~@qSO&?b((K;)00T!4v+6s)(z#yoHnd}+oz!L{3Oj-mr1K076 zM!9U3g>Su)hrj+6cHQ{{Aj%b2y#+O`*z~FQua9YXr`!%RXd8pAXRbQf$EIy2^d*6%xtQ&+P2+G><>>18#cb9}{h;rEYNt6T6P0!UpLnlU18r zY3K@LIySBYy41iHxYASZl#_|$Sf84Qpcn_9zPi(-zF_jab?2Y}P7L!~>Sar9yyI`SWw{SA<0? zifqKXulP1gTDy4PTQ27Iw_HZ|x-PKtq>qfU|KU9h97!`akYs!+$?-&jlhdP|NQ^O@ zOJbI=0L54a2qJ`o)zmb0)4ZUIriF{BX=)`Bi9s-ktsHFI#&R62LY`s=CxN%-jwMNq zr^wADsBYF-f9+}(Y+OiFdjrX_JbNBF#Mtq1G$d7#DzKsF;2vIl_7SQ=wcPgpPt&+z zDHFq!xR&D?IoCx5bi%s9>8;z@`N#uMqw#^i{tQ=sqsbt4ShD*U{P5&h)`OoI1IUs)>`-b}yr~V+9?nHAQUb<`UHqH&#YgGS@hI9+QSxNOZL zu6oTnu=1QbIKuDl-^0)D-^R`(eb}ys5D|1ulp0>nhvX`&{rLqI&qs)g9)%_)uCj66 z6c;R6!lys*I^O!GO9;1xDV(0<&@c9JdjB*dr>E!{o8suyB&U<(^kv2v&u4wMW3A#T zbppW#>Kof=TCj-vj)l}WwG*z6A&fAVDq!U;5@sIh?RgeGx?AP|d?9i8CWJMShrJ;=2mxtVMJ;5KR&w^GQM2n)=dMenX*2KV*j zq%EQ~wWz#FA)hbiad41CyPLW5D}Uobmqn1Z7hQ)DiV$wqk!YN}|2gWGcM@GtMf8ef^lGStbXacg4@Wj8j8^!ZD3KXk*32{)IZ!$O-+ot_8@I*s#$zN z6QBI_>-oeVUC(n*AL1K7eum#Zy&u!bp@}#`hzbVTbBTaB>pSMsqs#`NdOLt7JX&za z&C*y^&F4P)M*i>e#?f@P-Ftx4a2`Dn@EWw*iW4uq$k@@nY`AqJ*L?7EG%fEW>o{anDYBzk22YGL za(Du3ra*Obj7VD*$*C-bYyn+*6k&GWq-Nz(_C0nleLJ551Z&n@PG|ROa@ib)=26Dw zrgMxP>Se{^H6;3nz{gO8LSetE)2(p*i^@Ou2yi|zfuc8G#`>VVj!t^H_yx+8#Oh@o z1Lo@q;408{$@+CGx$l`rQNZZnahB$;!wzexpv0((B2!@;%S47ETyo93c=)a)sZ<}D z7C;i@#Gywqbe+|gT#Z{DqGRI{Cj0x*Yhzf60{b35$l#GGmTc;#rmGGM3&-~Q#^nnc zYU;zpYJ#MaCYk9BfqigubeH8Zetg44SO$))myYz;yInl9N){Ib;?duRvdWPymA zC6~&gg@U+sQM8&ES~Ns+%~Bedu4K7ez)q!^92;h$_ar0z$Cwx&C7+$bRVJ=7NfZhs z3ey}(^dr!y4n$~+RCxyBR0Cc6n%Q^%1PxsgmTau$l1mnH`43le;Q3y@^4|~ht0#A3 zDHlyfee#duvYzR@&lZq*3PR2hjWP~h;Pp1J-2$3&_}CjR;|rg;m8P~P2Dc5d|H*Os zds3X79AnRT4|^wi8O^19_>JS=EkHC_Ps4(4T9>V+rK_8&h9(c&;3_mtp@(%sahppLmXTvaO!ZDv$eGmC#c5vCij}dL8J@wlHFPZi zxVVl(q`Hdfz9Ve?;dcRzj*fM#zvMzmVW!h#NDQvL;-j=|SVtfx z(e*He$pnQ&1{pR81tTPQc5h-Ddkj!R0M(snVACp2S@1NKZ%_v;7ZAw z%e&}YSkJEC?x1gLAG#9ghUV4OOC1#p5vYlx#iEF?hR`*T2D%a`%OaaeF*P|vVql2L zk<(0#43bDrV!KI-Sak35m}Ogn)hwxL;ey6REU9Xup-E%$y4e5M+ndK(c3t(o-@VUx z$C|6UyLwbhYN<63mOLX*!2{T4a^S@uFu??4NSsGLm=Hn+NPqw#5MDwEfiOJ>YA(Wc*ecoAN!np&%Jf4x?A?+em+un-+RtJd+)RN+H3vR zTEE3@4;-O%aEwR)>I6Ues~_dBpL-T5%Lr{{aRGy<@U>#ZeWW0>tuunlTlUZMn?L>C zyzUJ*bLq)tp7`7rOQ+gAwXw(}ODA}C1GMm0K%iN*k9K7jv<_;X7QXM08 zOiqVgmW)kSn3}ILwr8AjwS-&Nc%BPbY%R99@bn_*&#cpFg(i6_RU|6Lsaee5xQ7GB z_c1wZAzVSC1yKu@Pp@#{>&t8`wy`WpspQdK-{jQSp5pw8lg#X$;LZQnTe#_McjHai zB;AD5Pp?B@Oa>zBWhsJ+Tmb(&BA{_ij|Q6^4Pdfdg^KtQhHP50k;(WNMaK%DyABR!O8 z*iN_>0nq0$GmRx_%;dxvpM3C(y#Hr^jv(m*nz8aeUj4csVCMEC;Miy_X|Hb~LSyr| zhuR-21IJuzvb7 zU;F5zte#lIlMa^aqEaL2wQFHjJmh!k|Lrg5SAOCx#9I~*e|nJ%Cu5%7xXc$WJjpX_7l~AA z7LFD;qQ>l=>$(1}``CN)Ex5HBX_`P1oa#~l9|2ZXcQ|K zS}dHt%+kUJt(7h+fYP{R|4nSBxP)DoIm^Df5kukxBrSrWi{`W z2^QH`znxdU_WKyW>mZSnV1=5_@`h>4lGvV4+S%ga&wiK-XCFrj2U}W1X~4ey_w$N3 zy&X!D`J47~?B3fr_2fw|zIX=TD1O_Y!2K$&;0HCC|3JXQjdvYl?|hwekDcfFPo1E7vW4SlEYBuQ6-gXoyAD>#A@)4< zSOuqC!gg&Fl%f)ZkXW{bV>zfarQL3_wzR~h7oTF`%(FDtF9IPFJL4`)m~d;{H+z(O zCa>ebOqKgyJHy>?ypborevTjd#oy=ga~F`Zj8^>;)@DoXb&@LMb4NgCCflKF`q>03K6go|i zp2OUMF%H~3$MoSUu4iFuh=riL*=6y$buK=$Mq|B+RG<_Dtv20_%cMea=;pl~f6X1t z+EH(5BhLSro;i4r_tFt%@k zBgf~NJ1{}C6>#b+XF31ECR&5*TFBf#pM?nv1hysl%%A)gYnRUR%GZB4hYsCN6m>x> zgs?L{24%{}cOq&>=eh2UxACvv`Ub-0C4?-ab&4$&zy0&S!rNbaAM4EqmTeo&btv8Y zr3rwcNWfE{e?;qRRQ(4V%eH^^XPPF|>lHrx*I(i9|I?pFVQSwwZjD=RemO5b_b9D! zh1uGj-2d{ov-kcRNy~z$5fH97k+vxUVc8Crj5+bd-|+Rn`8-jyj3dj$N>QIUz-!+8 zcIq?xaHf6ke&8PBPMc>QevY7>;Fo-oBqdBjYExwn+_8`SH_zc$T;en_7=bEQV9{Bu zyT-D>a%}__oo2xLN(*TVruR%hqFH?8948-ofyUVl1QOdb*=@Gtq3RZP%_i&$!XQTY zKK@t*+qY3VtEq=!rTZeG&E3k~69+hU ztje3e^Ek>%`M_^}lt22ymy!5AzqKVr7MT~&3+@_l2iic%l)F|c%hK$!zcRsxKKQ*H zKe&%a9$aH#G2)?xr}*@#uhNb~927AM-<{{^4fk-<%U;3ckpsk15`+y(^$L3rPcd`- z1ogQpLMUXMWO@G@+qH0{%hIJbFMM@@)iWE!kwREDT576e7W=NBVE>J?)aR;5M<8W_ zj-as=aQ4J9mtNQ)+~^pJEl=P$8qf2n&biDTo@D089-MlKFbIf)u=j2^*E>W(!uVvB zO05jGCXKyiRGdrGE=+I_4#C~s-Q696OK`WrA;H}txVyVc7zpkTgS)%y$9|vZ?Dc*> z&RVB`%v4qTeOJ%)>Z-0QMwC-?rIH?+{Wo7>78t0hR3Rlby^4iTD8%sQd&kmd@SswI zk25+N_M(gYj}lGaOLkqU7}qCYiJ)j}-N2~f8v*woZJliGS|@%d`-@!3p?bXa@Y==) z!0*HGoqO`_uZ8D{(ks4_z^x3U;FD)irSjc~&+ejs7Ra90wj2g7v=aF>4yBbd{89l8 zj0Z28=jx`PsE8xRrlGxlnD4#!<-4{a1iR^-r@>9i1FQcI3s&|!t^ZY-P(Fb{?y=sW zeoI#}o}stUya>sye#wA-jUOA=>J@w= zy2~2DqSNKG=R|kypJns|mAZi&xl(eH2r^l8#uxjQzSlb!b#qy1-8k|xmG20Ecnsns zVYs*yVVwYW6>^n;MyQyBgl2R`A+LCBBHrZK5D1v>-I}+vL@aYonFdl(YE*@ zrtV`v=AICzgnd7+3N~4|Bu|^CWdb-`QAytn+wP`@z6{~%l_*}TQVAt3Y6}C1H zXtp{@Oe zBJ_V`%M`rhj);3Rb-x_p>P&olSnc;R%~Gt$$}56C00?{q0lxD-kQ%;>7&>2#&E~HB zGO3BIC}G#^`_|Cy&>TlnQG1cA!>&tF!I;7#=8z

  • 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 G`~Lv?l}M!k literal 0 HcmV?d00001 diff --git a/cmd/memory/main.go b/cmd/memory/main.go deleted file mode 100644 index fe16d30f2..000000000 --- a/cmd/memory/main.go +++ /dev/null @@ -1,72 +0,0 @@ -package main - -import ( - "fmt" - "github.com/hectorgimenez/koolo/internal/helper" - memory2 "github.com/hectorgimenez/koolo/internal/memory" - "log" - "syscall" - "time" - - "github.com/hectorgimenez/d2go/pkg/memory" - - "github.com/hectorgimenez/koolo/internal/config" - "github.com/hectorgimenez/koolo/internal/hid" - "github.com/hectorgimenez/koolo/internal/reader" - "github.com/lxn/win" -) - -func main() { - ptr, err := syscall.UTF16PtrFromString("Diablo II: Resurrected") - if err != nil { - panic(err) - } - window := win.FindWindow(nil, ptr) - if window == win.HWND_TOP { - panic("Diablo II: Resurrected window not found") - } - memory2.HWND = window - - pos := win.WINDOWPLACEMENT{} - point := win.POINT{} - win.ClientToScreen(window, &point) - win.GetWindowPlacement(window, &pos) - - hid.WindowLeftX = int(point.X) - hid.WindowTopY = int(point.Y) - hid.GameAreaSizeX = int(pos.RcNormalPosition.Right) - hid.WindowLeftX - 9 - hid.GameAreaSizeY = int(pos.RcNormalPosition.Bottom) - hid.WindowTopY - 9 - - helper.Screenshot() - - err = config.Load() - config.Config.Debug.RenderMap = true - if err != nil { - log.Fatalf("Error loading configuration: %s", err.Error()) - } - process, err := memory.NewProcess() - if err != nil { - panic(err) - } - - gd := memory.NewGameReader(process) - gr := reader.GameReader{ - GameReader: gd, - } - - start := time.Now() - gr.GetData(true) - if err != nil { - panic(err) - } - - for true { - d := gr.GetData(false) - - d.Roster.FindByName("Ayuso") - fmt.Println(d.PlayerUnit.HPPercent()) - time.Sleep(time.Millisecond * 500) - } - - fmt.Printf("Read time: %dms\n", time.Since(start).Milliseconds()) -} diff --git a/cmd/pickup/main.go b/cmd/pickup/main.go deleted file mode 100644 index 357e56dd1..000000000 --- a/cmd/pickup/main.go +++ /dev/null @@ -1,67 +0,0 @@ -package main - -import ( - log2 "github.com/hectorgimenez/koolo/cmd/koolo/log" - "log" - "syscall" - - "github.com/hectorgimenez/d2go/pkg/memory" - "github.com/hectorgimenez/koolo/internal/action" - "github.com/hectorgimenez/koolo/internal/character" - "github.com/hectorgimenez/koolo/internal/config" - "github.com/hectorgimenez/koolo/internal/health" - "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" - "github.com/hectorgimenez/koolo/internal/reader" - "github.com/hectorgimenez/koolo/internal/town" - "github.com/lxn/win" -) - -func main() { - err := config.Load() - if err != nil { - log.Fatalf("Error loading configuration: %s", err.Error()) - } - - logger, _ := log2.NewLogger(true, "pickup") - ptr, err := syscall.UTF16PtrFromString("Diablo II: Resurrected") - if err != nil { - log.Fatalf(err.Error()) - } - window := win.FindWindow(nil, ptr) - - pos := win.WINDOWPLACEMENT{} - point := win.POINT{} - win.ClientToScreen(window, &point) - win.GetWindowPlacement(window, &pos) - - hid.WindowLeftX = int(point.X + 1) - hid.WindowTopY = int(point.Y) - hid.GameAreaSizeX = int(pos.RcNormalPosition.Right) - hid.WindowLeftX - 9 - hid.GameAreaSizeY = int(pos.RcNormalPosition.Bottom) - hid.WindowTopY - 9 - helper.Sleep(1000) - - process, err := memory.NewProcess() - if err != nil { - panic(err) - } - - gd := memory.NewGameReader(process) - gr := &reader.GameReader{GameReader: gd} - bm := health.NewBeltManager(logger) - sm := town.NewShopManager(logger, bm) - char, err := character.BuildCharacter(logger) - if err != nil { - panic(err) - } - - b := action.NewBuilder(logger, sm, bm, gr, char) - a := b.ItemPickup(true, -1) - - gr.GetData(true) - - for err == nil { - data := gr.GetData(false) - err = a.NextStep(logger, data) - } -} diff --git a/config/koolo.yaml.dist b/config/koolo.yaml.dist new file mode 100644 index 000000000..18764081e --- /dev/null +++ b/config/koolo.yaml.dist @@ -0,0 +1,19 @@ +firstRun: true # If set to true next time the bot starts it will show the setup wizard +debug: + log: true # Prints extra log information + renderMap: false # Render current map data into 'cg.png' file + +logSaveDirectory: logs +D2LoDPath: 'E:\games\Diablo II' # Path to Diablo II Lord of Destruction 1.13c directory +D2RPath: 'C:\Program Files (x86)\Diablo II Resurrected' # Path to Diablo II Resurrected directory + +# In order to use to Discord Bot, you need the Application Token. https://discord.com/developers/docs/intro +discord: + enabled: false + channelId: '' + token: '' + +telegram: + enabled: false + chatId: 0 + token: '' \ No newline at end of file diff --git a/config/config.yaml.dist b/config/template/config.yaml similarity index 93% rename from config/config.yaml.dist rename to config/template/config.yaml index f6c8b04cf..d4ce3e99b 100644 --- a/config/config.yaml.dist +++ b/config/template/config.yaml @@ -1,21 +1,10 @@ -debug: - log: true # Prints extra log information - renderMap: false # Render current map data into 'cg.png' file - -logSaveDirectory: logs maxGameLength: 500 # Max game length (in seconds), bot will try to quit game arrived that point -D2LoDPath: 'E:\games\Diablo II' - -# In order to use to Discord Bot, you need the Application Token. https://discord.com/developers/docs/intro -discord: - enabled: false - channelId: '' - token: '' -telegram: - enabled: false - chatId: 0 - token: '' +# Multiclient settings, this is only required if you want to run multiple clients at the same time with different accounts +# you can leave it empty for single player. +username: '' # Battle.net username (required for multiclient only) +password: '' # Battle.net pwd (required for multiclient only) +realm: 'eu.actual.battle.net' # (required for multiclient only) health: # Healing configuration, all values in % healingPotionAt: 75 @@ -88,7 +77,7 @@ game: # tristram, lower_kurast, stony_tomb, pit, arachnid_lair, tal_rasha_tombs, baal, diablo, cows, terror_zone # leveling: there is a "leveling" run, in combination with "sorceress or paladin" class will be able to start leveling character from level 1 (don't expect too much) # terror_zone: will detect current TZ and clear it - runs: [stony_tomb, pit, arachnid_lair] + runs: [ stony_tomb, pit, arachnid_lair ] # Specific runs settings pindleskin: diff --git a/config/pickit/crafted.nip b/config/template/pickit/crafted.nip similarity index 100% rename from config/pickit/crafted.nip rename to config/template/pickit/crafted.nip diff --git a/config/pickit/magic.nip b/config/template/pickit/magic.nip similarity index 100% rename from config/pickit/magic.nip rename to config/template/pickit/magic.nip diff --git a/config/pickit/misc.nip b/config/template/pickit/misc.nip similarity index 100% rename from config/pickit/misc.nip rename to config/template/pickit/misc.nip diff --git a/config/pickit/rare.nip b/config/template/pickit/rare.nip similarity index 100% rename from config/pickit/rare.nip rename to config/template/pickit/rare.nip diff --git a/config/pickit/set.nip b/config/template/pickit/set.nip similarity index 100% rename from config/pickit/set.nip rename to config/template/pickit/set.nip diff --git a/config/pickit/unid.nip b/config/template/pickit/unid.nip similarity index 100% rename from config/pickit/unid.nip rename to config/template/pickit/unid.nip diff --git a/config/pickit/unique.nip b/config/template/pickit/unique.nip similarity index 100% rename from config/pickit/unique.nip rename to config/template/pickit/unique.nip diff --git a/config/pickit/white.nip b/config/template/pickit/white.nip similarity index 100% rename from config/pickit/white.nip rename to config/template/pickit/white.nip diff --git a/config/pickit_leveling/leveling.nip b/config/template/pickit_leveling/leveling.nip similarity index 70% rename from config/pickit_leveling/leveling.nip rename to config/template/pickit_leveling/leveling.nip index 33ced4062..1aac7cb26 100644 --- a/config/pickit_leveling/leveling.nip +++ b/config/template/pickit_leveling/leveling.nip @@ -48,3 +48,19 @@ [type] == armor # [sockets] == 3 // Treachery [type] == armor # [sockets] == 2 // Stealth [type] == helm # [sockets] == 2 // Lore + +// Paladin Shields +[name] == rondache && [flag] != ethereal // Spirit +[name] == akarantarge && [flag] != ethereal // Spirit +[name] == aerinshield && [flag] != ethereal // Spirit +[name] == akaranrondache && [flag] != ethereal // Spirit +[name] == heraldicshield && [flag] != ethereal // Spirit + + +[type] == gloves && [quality] >= rare +[type] == boots && [quality] >= rare +[type] == amulet && [quality] >= rare +[type] == ring && [quality] >= rare +[type] == orb && [quality] >= rare +[type] == helm && [quality] >= rare +[type] == polearm && [quality] >= rare diff --git a/config/pickit_leveling/quest.nip b/config/template/pickit_leveling/quest.nip similarity index 100% rename from config/pickit_leveling/quest.nip rename to config/template/pickit_leveling/quest.nip diff --git a/go.mod b/go.mod index f588ea100..77ada6f53 100644 --- a/go.mod +++ b/go.mod @@ -6,15 +6,19 @@ require ( github.com/beefsack/go-astar v0.0.0-20200827232313-4ecf9e304482 github.com/bwmarrin/discordgo v0.27.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 - github.com/hectorgimenez/d2go v0.0.0-20240212022119-de5d7c115748 + github.com/hectorgimenez/d2go v0.0.0-20240309143442-8f9f49addc36 + github.com/inkeliz/gowebview v1.0.1 github.com/lxn/win v0.0.0-20210218163916-a377121e959e + github.com/otiai10/copy v1.14.0 golang.org/x/sync v0.6.0 - golang.org/x/sys v0.17.0 + golang.org/x/sys v0.18.0 gopkg.in/yaml.v3 v3.0.1 ) require ( + git.wow.st/gmp/jni v0.0.0-20200827154156-014cd5c7c4c0 // indirect github.com/gorilla/websocket v1.5.1 // indirect - golang.org/x/crypto v0.19.0 // indirect + github.com/inkeliz/w32 v1.0.2 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/net v0.21.0 // indirect ) diff --git a/go.sum b/go.sum index 250311fc6..89379a141 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +git.wow.st/gmp/jni v0.0.0-20200827154156-014cd5c7c4c0 h1:Ynp3h+TC8k1clvf45D28VFQlmy0bPx8M/MG5bB24Vj8= +git.wow.st/gmp/jni v0.0.0-20200827154156-014cd5c7c4c0/go.mod h1:+axXBRUTIDlCeE73IKeD/os7LoEnTKdkp8/gQOFjqyo= github.com/beefsack/go-astar v0.0.0-20200827232313-4ecf9e304482 h1:p4g4uok3+r6Tg6fxXEQUAcMAX/WdK6WhkQW9s0jaT7k= github.com/beefsack/go-astar v0.0.0-20200827232313-4ecf9e304482/go.mod h1:Cu3t5VeqE8kXjUBeNXWQprfuaP5UCIc5ggGjgMx9KFc= github.com/bwmarrin/discordgo v0.27.1 h1:ib9AIc/dom1E/fSIulrBwnez0CToJE113ZGt4HoliGY= @@ -9,27 +11,42 @@ github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/hectorgimenez/d2go v0.0.0-20240212022119-de5d7c115748 h1:e52sPiL5z5LqzxOZvDHy1VZG7hMZ0gFuGjrwgdQHRO8= -github.com/hectorgimenez/d2go v0.0.0-20240212022119-de5d7c115748/go.mod h1:UqWDuAc3lyiNo/zhBWa9J5ZecTYhg+3ljJoJB6vDoG8= +github.com/hectorgimenez/d2go v0.0.0-20240309143442-8f9f49addc36 h1:Y34F29t/4eVcoYAJiYRO1n8CC+fCz0AqwbGa8JfBkXI= +github.com/hectorgimenez/d2go v0.0.0-20240309143442-8f9f49addc36/go.mod h1:UqWDuAc3lyiNo/zhBWa9J5ZecTYhg+3ljJoJB6vDoG8= +github.com/inkeliz/gowebview v1.0.1 h1:4gpLE2qt4kV3DB+xHkHKUeLLiGPN5Xw3or9A3hVqYyA= +github.com/inkeliz/gowebview v1.0.1/go.mod h1:4SNjXp/fogE11MwvJD67kMBmSObY2BBqinEgH8+8eM8= +github.com/inkeliz/w32 v1.0.2 h1:Es8Bmw9ApOY0PVRpGs7wsqIKdK5C3xBkP5TOATfVmtU= +github.com/inkeliz/w32 v1.0.2/go.mod h1:S/jA64It0hxx6uFFOwWBfAjNqvekp0iv1n98qLKd89I= github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc= github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= +github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= +github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= +github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= diff --git a/internal/action/action.go b/internal/action/action.go index 5661116d3..13f3a9c1d 100644 --- a/internal/action/action.go +++ b/internal/action/action.go @@ -2,9 +2,8 @@ package action import ( "errors" - "log/slog" - "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/koolo/internal/container" ) const maxRetries = 5 @@ -16,7 +15,7 @@ var ErrNoMoreSteps = errors.New("action finished, no more steps remaining") var ErrLogAndContinue = errors.New("error occurred, but marking action as completed") type Action interface { - NextStep(logger *slog.Logger, d data.Data) error + NextStep(d data.Data, container container.Container) error Skip() } diff --git a/internal/action/action_builder.go b/internal/action/action_builder.go index 6b35e397a..cc10e2787 100644 --- a/internal/action/action_builder.go +++ b/internal/action/action_builder.go @@ -1,26 +1,23 @@ package action import ( + "github.com/hectorgimenez/koolo/internal/container" "github.com/hectorgimenez/koolo/internal/health" - "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/town" - "log/slog" ) type Builder struct { - logger *slog.Logger - sm town.ShopManager - bm health.BeltManager - gr *reader.GameReader - ch Character + sm town.ShopManager + bm health.BeltManager + ch Character + container.Container } -func NewBuilder(logger *slog.Logger, sm town.ShopManager, bm health.BeltManager, gr *reader.GameReader, ch Character) *Builder { +func NewBuilder(container container.Container, sm town.ShopManager, bm health.BeltManager, ch Character) *Builder { return &Builder{ - logger: logger, - sm: sm, - bm: bm, - gr: gr, - ch: ch, + sm: sm, + bm: bm, + ch: ch, + Container: container, } } diff --git a/internal/action/action_chain.go b/internal/action/action_chain.go index 8f06e7f88..b0bc1378d 100644 --- a/internal/action/action_chain.go +++ b/internal/action/action_chain.go @@ -2,9 +2,8 @@ package action import ( "errors" - "log/slog" - "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/koolo/internal/container" ) type Chain struct { @@ -25,7 +24,7 @@ func NewChain(builder func(d data.Data) []Action, opts ...Option) *Chain { return a } -func (a *Chain) NextStep(logger *slog.Logger, d data.Data) error { +func (a *Chain) NextStep(d data.Data, container container.Container) error { if a.markSkipped { return ErrNoMoreSteps } @@ -40,7 +39,7 @@ func (a *Chain) NextStep(logger *slog.Logger, d data.Data) error { var err error for _, action := range a.actions { - err = action.NextStep(logger, d) + err = action.NextStep(d, container) if errors.Is(err, ErrNoMoreSteps) || errors.Is(err, ErrLogAndContinue) { continue } diff --git a/internal/action/action_step_chain.go b/internal/action/action_step_chain.go index 7248e646b..5d19a5139 100644 --- a/internal/action/action_step_chain.go +++ b/internal/action/action_step_chain.go @@ -3,7 +3,7 @@ package action import ( "errors" "fmt" - "log/slog" + "github.com/hectorgimenez/koolo/internal/container" "reflect" "github.com/hectorgimenez/d2go/pkg/data" @@ -29,7 +29,7 @@ func NewStepChain(builder func(d data.Data) []step.Step, opts ...Option) *StepCh return a } -func (a *StepChainAction) NextStep(logger *slog.Logger, d data.Data) error { +func (a *StepChainAction) NextStep(d data.Data, container container.Container) error { if a.markSkipped { return ErrNoMoreSteps } @@ -40,9 +40,9 @@ func (a *StepChainAction) NextStep(logger *slog.Logger, d data.Data) error { } for _, s := range a.Steps { - if s.Status(d) != step.StatusCompleted { + if s.Status(d, container) != step.StatusCompleted { lastRun := s.LastRun() - err := s.Run(d) + err := s.Run(d, container) if s.LastRun().After(lastRun) { //logger.Debug("Executed step", slog.String("step_name", reflect.TypeOf(s).Elem().Name())) } diff --git a/internal/action/buff.go b/internal/action/buff.go index 2cb6118aa..ceb85804d 100644 --- a/internal/action/buff.go +++ b/internal/action/buff.go @@ -1,6 +1,7 @@ package action import ( + "github.com/hectorgimenez/koolo/internal/game" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -9,9 +10,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/d2go/pkg/data/state" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" ) var lastBuffedAt = time.Time{} @@ -44,15 +43,15 @@ func (b *Builder) Buff() *StepChainAction { } if len(keys) > 0 { - b.logger.Debug("Buffing...") + b.Logger.Debug("Buffing...") steps = append(steps, step.SyncStep(func(_ data.Data) error { for _, kb := range keys { helper.Sleep(200) - hid.PressKey(kb) + b.HID.PressKey(kb) helper.Sleep(300) - hid.Click(hid.RightButton, 300, 300) + b.HID.Click(game.RightButton, 300, 300) helper.Sleep(300) } return nil @@ -96,28 +95,28 @@ func (b *Builder) IsRebuffRequired(d data.Data) bool { func (b *Builder) buffCTA(d data.Data) (steps []step.Step) { if b.isCTAEnabled(d) { - b.logger.Debug("CTA found: swapping weapon and casting Battle Command / Battle Orders") + b.Logger.Debug("CTA found: swapping weapon and casting Battle Command / Battle Orders") // Swap weapon only in case we don't have the CTA, sometimes CTA is already equipped (for example chicken previous game during buff stage) if _, found := d.PlayerUnit.Skills[skill.BattleCommand]; !found { - steps = append(steps, step.SwapToCTA()) + steps = append(steps, step.SwapToCTA(b.CharacterCfg.Bindings.SwapWeapon)) } steps = append(steps, step.SyncStep(func(d data.Data) error { - hid.PressKey(config.Config.Bindings.CTABattleCommand) + b.HID.PressKey(b.CharacterCfg.Bindings.CTABattleCommand) helper.Sleep(100) - hid.Click(hid.RightButton, 300, 300) + b.HID.Click(game.RightButton, 300, 300) helper.Sleep(300) - hid.PressKey(config.Config.Bindings.CTABattleOrders) + b.HID.PressKey(b.CharacterCfg.Bindings.CTABattleOrders) helper.Sleep(100) - hid.Click(hid.RightButton, 300, 300) + b.HID.Click(game.RightButton, 300, 300) helper.Sleep(100) return nil }), step.Wait(time.Millisecond*500), - step.SwapToMainWeapon(), + step.SwapToMainWeapon(b.CharacterCfg.Bindings.SwapWeapon), ) } @@ -125,7 +124,7 @@ func (b *Builder) buffCTA(d data.Data) (steps []step.Step) { } func (b *Builder) isCTAEnabled(d data.Data) bool { - if config.Config.Bindings.CTABattleCommand == "" || config.Config.Bindings.CTABattleOrders == "" { + if b.CharacterCfg.Bindings.CTABattleCommand == "" || b.CharacterCfg.Bindings.CTABattleOrders == "" { return false } diff --git a/internal/action/clear_area.go b/internal/action/clear_area.go index abc6d1e22..55081e5bc 100644 --- a/internal/action/clear_area.go +++ b/internal/action/clear_area.go @@ -16,7 +16,7 @@ func (b *Builder) ClearAreaAroundPlayer(distance int) Action { for _, m := range d.Monsters.Enemies() { d := pather.DistanceFromPoint(originalPosition, m.Position) if d <= distance { - b.logger.Debug("Clearing area...", slog.Int("monsterID", int(m.Name))) + b.Logger.Debug("Clearing area...", slog.Int("monsterID", int(m.Name))) return m.UnitID, true } } diff --git a/internal/action/clear_level.go b/internal/action/clear_level.go index 816f7884f..806009de5 100644 --- a/internal/action/clear_level.go +++ b/internal/action/clear_level.go @@ -1,7 +1,6 @@ package action import ( - "github.com/hectorgimenez/koolo/internal/config" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -30,7 +29,7 @@ func (b *Builder) ClearArea(openChests bool, filter data.MonsterFilter) *Chain { if isLevelingChar { _, healingPotsFound := d.Items.Belt.GetFirstPotion(data.HealingPotion) _, manaPotsFound := d.Items.Belt.GetFirstPotion(data.ManaPotion) - if ((!healingPotsFound && config.Config.Inventory.BeltColumns.Healing > 0) || (!manaPotsFound && config.Config.Inventory.BeltColumns.Mana > 0)) && d.PlayerUnit.TotalGold() > 1000 { + if ((!healingPotsFound && b.CharacterCfg.Inventory.BeltColumns.Healing > 0) || (!manaPotsFound && b.CharacterCfg.Inventory.BeltColumns.Mana > 0)) && d.PlayerUnit.TotalGold() > 1000 { return b.InRunReturnTownRoutine() } } @@ -40,7 +39,7 @@ func (b *Builder) ClearArea(openChests bool, filter data.MonsterFilter) *Chain { for _, o := range d.Objects { if o.IsDoor() && pather.DistanceFromMe(d, o.Position) < 10 && openedDoors[o.Name] != o.Position { if o.Selectable { - b.logger.Info("Door detected and teleport is not available, trying to open it...") + b.Logger.Info("Door detected and teleport is not available, trying to open it...") return []Action{b.InteractObject(o.Name, func(d data.Data) bool { for _, obj := range d.Objects { if obj.Name == o.Name && obj.Position == o.Position && !obj.Selectable { @@ -71,13 +70,13 @@ func (b *Builder) ClearArea(openChests bool, filter data.MonsterFilter) *Chain { } } - path, _, mPathFound := pather.GetPath(d, targetMonster.Position) + path, _, mPathFound := b.PathFinder.GetPath(d, targetMonster.Position) if mPathFound { doorIsBlocking := false if !helper.CanTeleport(d) { for _, o := range d.Objects { if o.IsDoor() && o.Selectable && path.Intersects(d, o.Position, 4) { - b.logger.Debug("Door is blocking the path to the monster, skipping attack sequence") + b.Logger.Debug("Door is blocking the path to the monster, skipping attack sequence") doorIsBlocking = true } } @@ -88,7 +87,7 @@ func (b *Builder) ClearArea(openChests bool, filter data.MonsterFilter) *Chain { return targetMonster.UnitID, true }, nil)} } else { - b.logger.Debug("Door is blocking the path to the monster, skipping attack sequence") + b.Logger.Debug("Door is blocking the path to the monster, skipping attack sequence") } } } @@ -96,7 +95,7 @@ func (b *Builder) ClearArea(openChests bool, filter data.MonsterFilter) *Chain { if alreadyCleared(currentRoom, clearedRooms) { // Finished, all rooms are clear if len(clearedRooms) == len(d.Rooms) { - b.logger.Debug("All the rooms for this level have been cleared, finishing run.") + b.Logger.Debug("All the rooms for this level have been cleared, finishing run.") return nil } @@ -115,18 +114,19 @@ func (b *Builder) ClearArea(openChests bool, filter data.MonsterFilter) *Chain { } return []Action{NewStepChain(func(d data.Data) []step.Step { - _, distance, found := pather.GetPath(d, closestRoom.GetCenter()) + _, distance, found := b.PathFinder.GetPath(d, closestRoom.GetCenter()) // We don't need to be very precise, usually chests are not close to the map border tiles if !found && d.PlayerUnit.Area != area.LowerKurast { - _, distance, found = pather.GetClosestWalkablePath(d, closestRoom.GetCenter()) + _, distance, found = b.PathFinder.GetClosestWalkablePath(d, closestRoom.GetCenter()) } if !found || distance <= 5 { - b.logger.Debug("Next room is not walkable, skipping it.") + b.Logger.Debug("Next room is not walkable, skipping it.") clearedRooms = append(clearedRooms, closestRoom) return []step.Step{} } return []step.Step{step.MoveTo( + b.CharacterCfg, closestRoom.GetCenter(), step.ClosestWalkable(), step.WithTimeout(time.Second), diff --git a/internal/action/gambling.go b/internal/action/gambling.go index c1bb8023d..09fe6778a 100644 --- a/internal/action/gambling.go +++ b/internal/action/gambling.go @@ -1,6 +1,7 @@ package action import ( + "github.com/hectorgimenez/koolo/internal/game" "log/slog" "time" @@ -10,16 +11,14 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/d2go/pkg/itemfilter" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/town" "github.com/hectorgimenez/koolo/internal/ui" ) func (b *Builder) Gamble() *Chain { return NewChain(func(d data.Data) (actions []Action) { - if config.Config.Gambling.Enabled && d.PlayerUnit.Stats[stat.StashGold] >= 2500000 { - b.logger.Info("Time to gamble! Visiting vendor...") + if b.CharacterCfg.Gambling.Enabled && d.PlayerUnit.Stats[stat.StashGold] >= 2500000 { + b.Logger.Info("Time to gamble! Visiting vendor...") openShopStep := step.KeySequence("home", "down", "down", "enter") vendorNPC := town.GetTownByArea(d.PlayerUnit.Area).GamblingNPC() @@ -58,12 +57,12 @@ func (b *Builder) gambleItems() *StepChainAction { if lastStep { if d.OpenMenus.Inventory { return []step.Step{step.SyncStep(func(d data.Data) error { - hid.PressKey("esc") + b.HID.PressKey("esc") return nil })} } - b.logger.Info("Finished gambling", slog.Int("currentGold", d.PlayerUnit.TotalGold())) + b.Logger.Info("Finished gambling", slog.Int("currentGold", d.PlayerUnit.TotalGold())) return nil } @@ -74,12 +73,12 @@ func (b *Builder) gambleItems() *StepChainAction { if itm.UnitID == itemBought.UnitID { itemBought = itm itemBought.Location = item.LocationInventory - b.logger.Debug("Gambled for item", slog.Any("item", itemBought)) + b.Logger.Debug("Gambled for item", slog.Any("item", itemBought)) break } } - if itemfilter.Evaluate(itemBought, config.Config.Runtime.Rules) { + if itemfilter.Evaluate(itemBought, b.CharacterCfg.Runtime.Rules) { lastStep = true return []step.Step{step.Wait(time.Millisecond * 200)} } else { @@ -97,9 +96,9 @@ func (b *Builder) gambleItems() *StepChainAction { return []step.Step{step.Wait(time.Millisecond * 200)} } - for idx, itmName := range config.Config.Gambling.Items { + for idx, itmName := range b.CharacterCfg.Gambling.Items { // Let's try to get one of each every time - if currentIdx == len(config.Config.Gambling.Items) { + if currentIdx == len(b.CharacterCfg.Gambling.Items) { currentIdx = 0 } @@ -109,10 +108,10 @@ func (b *Builder) gambleItems() *StepChainAction { itm, found := d.Items.Find(itmName, item.LocationVendor) if !found { - b.logger.Debug("Item not found in gambling window, refreshing...", slog.String("item", string(itmName))) + b.Logger.Debug("Item not found in gambling window, refreshing...", slog.String("item", string(itmName))) return []step.Step{step.SyncStep(func(d data.Data) error { - hid.Click(hid.LeftButton, ui.GambleRefreshButtonX, ui.GambleRefreshButtonY) + b.HID.Click(game.LeftButton, ui.GambleRefreshButtonX, ui.GambleRefreshButtonY) return nil }), step.Wait(time.Millisecond * 500), diff --git a/internal/action/heal.go b/internal/action/heal.go index 77360dcdd..9c95b8d52 100644 --- a/internal/action/heal.go +++ b/internal/action/heal.go @@ -6,7 +6,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/town" ) @@ -14,12 +13,12 @@ func (b *Builder) Heal() *Chain { return NewChain(func(d data.Data) []Action { shouldHeal := false if d.PlayerUnit.HPPercent() < 80 { - b.logger.Info(fmt.Sprintf("Current life is %d%%, healing on NPC", d.PlayerUnit.HPPercent())) + b.Logger.Info(fmt.Sprintf("Current life is %d%%, healing on NPC", d.PlayerUnit.HPPercent())) shouldHeal = true } if d.PlayerUnit.HasDebuff() { - b.logger.Info(fmt.Sprintf("Debuff detected, healing on NPC")) + b.Logger.Info(fmt.Sprintf("Debuff detected, healing on NPC")) shouldHeal = true } @@ -28,7 +27,7 @@ func (b *Builder) Heal() *Chain { town.GetTownByArea(d.PlayerUnit.Area).HealNPC(), step.SyncStep(func(d data.Data) error { helper.Sleep(300) - hid.PressKey("esc") + b.HID.PressKey("esc") helper.Sleep(100) return nil }), diff --git a/internal/action/horadric_cube.go b/internal/action/horadric_cube.go index 951570a9e..a748950ac 100644 --- a/internal/action/horadric_cube.go +++ b/internal/action/horadric_cube.go @@ -5,8 +5,8 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/item" "github.com/hectorgimenez/d2go/pkg/data/object" "github.com/hectorgimenez/koolo/internal/action/step" + "github.com/hectorgimenez/koolo/internal/game" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/ui" "log/slog" ) @@ -15,7 +15,7 @@ func (b *Builder) CubeAddItems(items ...data.Item) *Chain { return NewChain(func(d data.Data) (actions []Action) { cube, found := d.Items.Find("HoradricCube", item.LocationInventory, item.LocationStash) if !found { - b.logger.Info("No Horadric Cube found in inventory") + b.Logger.Info("No Horadric Cube found in inventory") return nil } @@ -26,7 +26,7 @@ func (b *Builder) CubeAddItems(items ...data.Item) *Chain { })) } - b.logger.Info("Adding items to the Horadric Cube", slog.Any("items", items)) + b.Logger.Info("Adding items to the Horadric Cube", slog.Any("items", items)) // If items are on the Stash, pickup them to the inventory (only personal stash is supported for now) for _, itm := range items { @@ -35,10 +35,10 @@ func (b *Builder) CubeAddItems(items ...data.Item) *Chain { continue } - b.logger.Debug("Item found on the stash, picking it up", slog.String("Item", string(nwIt.Name))) + b.Logger.Debug("Item found on the stash, picking it up", slog.String("Item", string(nwIt.Name))) actions = append(actions, NewStepChain(func(d data.Data) []step.Step { screenPos := ui.GetScreenCoordsForItem(nwIt) - hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) + b.HID.ClickWithModifier(game.LeftButton, screenPos.X, screenPos.Y, game.CtrlKey) helper.Sleep(300) return nil @@ -52,9 +52,9 @@ func (b *Builder) CubeAddItems(items ...data.Item) *Chain { actions = append(actions, NewStepChain(func(d data.Data) []step.Step { for _, updatedItem := range d.Items.AllItems { if nwIt.UnitID == updatedItem.UnitID { - b.logger.Debug("Moving Item to the Horadric Cube", slog.String("Item", string(nwIt.Name))) + b.Logger.Debug("Moving Item to the Horadric Cube", slog.String("Item", string(nwIt.Name))) screenPos := ui.GetScreenCoordsForItem(updatedItem) - hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) + b.HID.ClickWithModifier(game.LeftButton, screenPos.X, screenPos.Y, game.CtrlKey) helper.Sleep(300) } } @@ -71,25 +71,25 @@ func (b *Builder) CubeTransmute() *Chain { return NewChain(func(d data.Data) (actions []Action) { cube, found := d.Items.Find("HoradricCube", item.LocationInventory, item.LocationStash) if !found { - b.logger.Info("No Horadric Cube found in inventory") + b.Logger.Info("No Horadric Cube found in inventory") return nil } actions = append(actions, b.ensureCubeIsOpen(cube)) actions = append(actions, NewStepChain(func(d data.Data) []step.Step { - b.logger.Debug("Transmuting items in the Horadric Cube") + b.Logger.Debug("Transmuting items in the Horadric Cube") helper.Sleep(150) - hid.Click(hid.LeftButton, ui.CubeTransmuteBtnX, ui.CubeTransmuteBtnY) + b.HID.Click(game.LeftButton, ui.CubeTransmuteBtnX, ui.CubeTransmuteBtnY) helper.Sleep(3000) // Move the Item back to the inventory - hid.ClickWithModifier(hid.LeftButton, 238, 262, hid.CtrlKey) + b.HID.ClickWithModifier(game.LeftButton, 238, 262, game.CtrlKey) helper.Sleep(300) return []step.Step{ step.SyncStepWithCheck(func(d data.Data) error { - hid.PressKey("esc") + b.HID.PressKey("esc") helper.Sleep(300) return nil }, func(d data.Data) step.Status { @@ -107,17 +107,17 @@ func (b *Builder) CubeTransmute() *Chain { func (b *Builder) ensureCubeIsOpen(cube data.Item) Action { return NewStepChain(func(d data.Data) []step.Step { - b.logger.Debug("Opening Horadric Cube...") + b.Logger.Debug("Opening Horadric Cube...") return []step.Step{ step.SyncStepWithCheck(func(d data.Data) error { screenPos := ui.GetScreenCoordsForItem(cube) helper.Sleep(300) - hid.Click(hid.RightButton, screenPos.X, screenPos.Y) + b.HID.Click(game.RightButton, screenPos.X, screenPos.Y) helper.Sleep(200) return nil }, func(d data.Data) step.Status { if d.OpenMenus.Cube { - b.logger.Debug("Horadric Cube window detected") + b.Logger.Debug("Horadric Cube window detected") return step.StatusCompleted } return step.StatusInProgress diff --git a/internal/action/identify.go b/internal/action/identify.go index 28a8efd6f..c5e923110 100644 --- a/internal/action/identify.go +++ b/internal/action/identify.go @@ -2,14 +2,12 @@ package action import ( "fmt" - "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/item" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/game" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/ui" ) @@ -17,28 +15,28 @@ func (b *Builder) IdentifyAll(skipIdentify bool) *Chain { return NewChain(func(d data.Data) (actions []Action) { items := b.itemsToIdentify(d) - b.logger.Debug("Checking for items to identify...") + b.Logger.Debug("Checking for items to identify...") if len(items) == 0 || skipIdentify { - b.logger.Debug("No items to identify...") + b.Logger.Debug("No items to identify...") return } idTome, found := d.Items.Find(item.TomeOfIdentify, item.LocationInventory) if !found { - b.logger.Warn("ID Tome not found, not identifying items") + b.Logger.Warn("ID Tome not found, not identifying items") return } if st, statFound := idTome.Stats[stat.Quantity]; !statFound || st.Value < len(items) { - b.logger.Info("Not enough ID scrolls, refilling...") + b.Logger.Info("Not enough ID scrolls, refilling...") actions = append(actions, b.VendorRefill(true, false)) } - b.logger.Info(fmt.Sprintf("Identifying %d items...", len(items))) + b.Logger.Info(fmt.Sprintf("Identifying %d items...", len(items))) actions = append(actions, NewStepChain(func(d data.Data) []step.Step { return []step.Step{ step.SyncStepWithCheck(func(d data.Data) error { - hid.PressKey(config.Config.Bindings.OpenInventory) + b.HID.PressKey(b.CharacterCfg.Bindings.OpenInventory) return nil }, func(d data.Data) step.Status { if d.OpenMenus.Inventory { @@ -49,10 +47,10 @@ func (b *Builder) IdentifyAll(skipIdentify bool) *Chain { step.SyncStep(func(d data.Data) error { for _, i := range items { - identifyItem(idTome, i) + b.identifyItem(idTome, i) } - hid.PressKey("esc") + b.HID.PressKey("esc") return nil }), @@ -75,13 +73,13 @@ func (b *Builder) itemsToIdentify(d data.Data) (items []data.Item) { return } -func identifyItem(idTome data.Item, i data.Item) { +func (b *Builder) identifyItem(idTome data.Item, i data.Item) { screenPos := ui.GetScreenCoordsForItem(idTome) helper.Sleep(500) - hid.Click(hid.RightButton, screenPos.X, screenPos.Y) + b.HID.Click(game.RightButton, screenPos.X, screenPos.Y) helper.Sleep(1000) screenPos = ui.GetScreenCoordsForItem(i) - hid.Click(hid.LeftButton, screenPos.X, screenPos.Y) + b.HID.Click(game.LeftButton, screenPos.X, screenPos.Y) helper.Sleep(350) } diff --git a/internal/action/item_pickup.go b/internal/action/item_pickup.go index 4086b0b9a..005c0a097 100644 --- a/internal/action/item_pickup.go +++ b/internal/action/item_pickup.go @@ -10,7 +10,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/d2go/pkg/itemfilter" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -27,7 +26,7 @@ func (b *Builder) ItemPickup(waitForDrop bool, maxDistance int) *Chain { if len(itemsToPickup) > 0 { for _, m := range d.Monsters.Enemies() { if dist := pather.DistanceFromMe(d, m.Position); dist < 7 { - b.logger.Debug("Aborting item pickup, monster nearby", slog.Any("monster", m)) + b.Logger.Debug("Aborting item pickup, monster nearby", slog.Any("monster", m)) itemBeingPickedUp = -1 return []Action{b.ch.KillMonsterSequence(func(d data.Data) (data.UnitID, bool) { return m.UnitID, true @@ -39,14 +38,14 @@ func (b *Builder) ItemPickup(waitForDrop bool, maxDistance int) *Chain { // Error picking up Item, go back to town, sell junk, stash and try again. if itemBeingPickedUp == i.UnitID { - b.logger.Debug("Item could not be picked up, going back to town to sell junk and stash") + b.Logger.Debug("Item could not be picked up, going back to town to sell junk and stash") return []Action{NewChain(func(d data.Data) []Action { itemBeingPickedUp = -1 return b.InRunReturnTownRoutine() })} } - b.logger.Debug(fmt.Sprintf( + b.Logger.Debug(fmt.Sprintf( "Item Detected: %s [%d] at X:%d Y:%d", i.Name, i.Quality, @@ -58,7 +57,7 @@ func (b *Builder) ItemPickup(waitForDrop bool, maxDistance int) *Chain { return []Action{ b.MoveToCoords(i.Position), NewStepChain(func(d data.Data) []step.Step { - return []step.Step{step.PickupItem(b.logger, i)} + return []step.Step{step.PickupItem(b.Logger, i)} }, IgnoreErrors()), } } @@ -66,7 +65,7 @@ func (b *Builder) ItemPickup(waitForDrop bool, maxDistance int) *Chain { // Add small delay, drop is not instant if waitForDrop && time.Since(firstCallTime) < time.Second { msToWait := time.Second - time.Since(firstCallTime) - b.logger.Debug("No items detected, waiting a bit and will try again", slog.Int("waitMs", int(msToWait.Milliseconds()))) + b.Logger.Debug("No items detected, waiting a bit and will try again", slog.Int("waitMs", int(msToWait.Milliseconds()))) return []Action{b.Wait(msToWait)} } @@ -132,7 +131,7 @@ func (b *Builder) getItemsToPickup(d data.Data, maxDistance int) []data.Item { func (b *Builder) shouldBePickedUp(d data.Data, i data.Item) bool { // Skip picking up gold if we can not carry more if d.PlayerUnit.Stats[stat.Gold] >= d.PlayerUnit.MaxGold() { - b.logger.Debug("Skipping gold pickup, inventory full") + b.Logger.Debug("Skipping gold pickup, inventory full") return false } @@ -155,5 +154,5 @@ func (b *Builder) shouldBePickedUp(d data.Data, i data.Item) bool { return true } - return itemfilter.Evaluate(i, config.Config.Runtime.Rules) + return itemfilter.Evaluate(i, b.CharacterCfg.Runtime.Rules) } diff --git a/internal/action/leveling_tools.go b/internal/action/leveling_tools.go index e46c8d4bf..80b1909a4 100644 --- a/internal/action/leveling_tools.go +++ b/internal/action/leveling_tools.go @@ -1,6 +1,7 @@ package action import ( + "github.com/hectorgimenez/koolo/internal/game" "log/slog" "slices" "time" @@ -12,9 +13,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/skill" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/town" "github.com/hectorgimenez/koolo/internal/ui" ) @@ -45,7 +44,7 @@ func (b *Builder) EnsureStatPoints() *StepChainAction { if d.OpenMenus.Character { return []step.Step{ step.SyncStep(func(_ data.Data) error { - hid.PressKey("esc") + b.HID.PressKey("esc") return nil }), } @@ -63,7 +62,7 @@ func (b *Builder) EnsureStatPoints() *StepChainAction { if !d.OpenMenus.Character { return []step.Step{ step.SyncStep(func(_ data.Data) error { - hid.PressKey(config.Config.Bindings.OpenCharacterScreen) + b.HID.PressKey(b.CharacterCfg.Bindings.OpenCharacterScreen) return nil }), } @@ -73,7 +72,7 @@ func (b *Builder) EnsureStatPoints() *StepChainAction { return []step.Step{ step.SyncStep(func(_ data.Data) error { helper.Sleep(100) - hid.Click(hid.LeftButton, statBtnPosition.X, statBtnPosition.Y) + b.HID.Click(game.LeftButton, statBtnPosition.X, statBtnPosition.Y) helper.Sleep(500) return nil }), @@ -93,7 +92,7 @@ func (b *Builder) EnsureSkillPoints() *StepChainAction { if d.OpenMenus.SkillTree { return []step.Step{ step.SyncStep(func(_ data.Data) error { - hid.PressKey("esc") + b.HID.PressKey("esc") return nil }), } @@ -115,14 +114,14 @@ func (b *Builder) EnsureSkillPoints() *StepChainAction { if !found || int(characterPoints.Level) < assignedPoints[sk] { skillDesc, skFound := skill.Desc[sk] if !skFound { - b.logger.Error("skill not found for character", slog.Any("skill", sk)) + b.Logger.Error("skill not found for character", slog.Any("skill", sk)) return nil } if !d.OpenMenus.SkillTree { return []step.Step{ step.SyncStep(func(_ data.Data) error { - hid.PressKey(config.Config.Bindings.OpenSkillTree) + b.HID.PressKey(b.CharacterCfg.Bindings.OpenSkillTree) return nil }), } @@ -132,9 +131,9 @@ func (b *Builder) EnsureSkillPoints() *StepChainAction { step.SyncStep(func(_ data.Data) error { assignAttempts++ helper.Sleep(100) - hid.Click(hid.LeftButton, uiSkillPagePosition[skillDesc.Page-1].X, uiSkillPagePosition[skillDesc.Page-1].Y) + b.HID.Click(game.LeftButton, uiSkillPagePosition[skillDesc.Page-1].X, uiSkillPagePosition[skillDesc.Page-1].Y) helper.Sleep(200) - hid.Click(hid.LeftButton, uiSkillColumnPosition[skillDesc.Column-1], uiSkillRowPosition[skillDesc.Row-1]) + b.HID.Click(game.LeftButton, uiSkillColumnPosition[skillDesc.Column-1], uiSkillRowPosition[skillDesc.Row-1]) helper.Sleep(500) return nil }), @@ -154,12 +153,12 @@ func (b *Builder) UpdateQuestLog() *StepChainAction { return []step.Step{ step.SyncStep(func(_ data.Data) error { - hid.PressKey(config.Config.Bindings.OpenQuestLog) + b.HID.PressKey(b.CharacterCfg.Bindings.OpenQuestLog) return nil }), step.Wait(time.Second), step.SyncStep(func(_ data.Data) error { - hid.PressKey(config.Config.Bindings.OpenQuestLog) + b.HID.PressKey(b.CharacterCfg.Bindings.OpenQuestLog) return nil }), } @@ -173,15 +172,15 @@ func (b *Builder) EnsureSkillBindings() *StepChainAction { } char, _ := b.ch.(LevelingCharacter) skillBindings := char.GetKeyBindings(d) - skillBindings[skill.TomeOfTownPortal] = config.Config.Bindings.TP + skillBindings[skill.TomeOfTownPortal] = b.CharacterCfg.Bindings.TP if len(skillBindings) > 0 && len(d.PlayerUnit.Skills) != previousTotalSkillNumber { return []step.Step{ // Right click skill bindings step.SyncStep(func(d data.Data) error { - hid.Click(hid.LeftButton, ui.SecondarySkillButtonX, ui.SecondarySkillButtonY) + b.HID.Click(game.LeftButton, ui.SecondarySkillButtonX, ui.SecondarySkillButtonY) helper.Sleep(300) - hid.MovePointer(10, 10) + b.HID.MovePointer(10, 10) helper.Sleep(300) for sk, binding := range skillBindings { @@ -194,9 +193,9 @@ func (b *Builder) EnsureSkillBindings() *StepChainAction { continue } - hid.MovePointer(skillPosition.X, skillPosition.Y) + b.HID.MovePointer(skillPosition.X, skillPosition.Y) helper.Sleep(100) - hid.PressKey(binding) + b.HID.PressKey(binding) helper.Sleep(300) } @@ -210,9 +209,9 @@ func (b *Builder) EnsureSkillBindings() *StepChainAction { if binding != "" { continue } - hid.Click(hid.LeftButton, ui.MainSkillButtonX, ui.MainSkillButtonY) + b.HID.Click(game.LeftButton, ui.MainSkillButtonX, ui.MainSkillButtonY) helper.Sleep(300) - hid.MovePointer(10, 10) + b.HID.MovePointer(10, 10) helper.Sleep(300) skillPosition, found := b.calculateSkillPositionInUI(d, false, sk) @@ -220,7 +219,7 @@ func (b *Builder) EnsureSkillBindings() *StepChainAction { return nil } helper.Sleep(100) - hid.Click(hid.LeftButton, skillPosition.X, skillPosition.Y) + b.HID.Click(game.LeftButton, skillPosition.X, skillPosition.Y) } return nil }), @@ -306,10 +305,10 @@ func (b *Builder) calculateSkillPositionInUI(d data.Data, mainSkill bool, skillI func (b *Builder) HireMerc() *Chain { return NewChain(func(d data.Data) (actions []Action) { _, isLevelingChar := b.ch.(LevelingCharacter) - if isLevelingChar && config.Config.Character.UseMerc { + if isLevelingChar && b.CharacterCfg.Character.UseMerc { // Hire the merc if we don't have one, we have enough gold, and we are in act 2. We assume that ReviveMerc was called before this. - if config.Config.Game.Difficulty == difficulty.Normal && d.MercHPPercent() <= 0 && d.PlayerUnit.TotalGold() > 30000 && d.PlayerUnit.Area == area.LutGholein { - b.logger.Info("Hiring merc...") + if b.CharacterCfg.Game.Difficulty == difficulty.Normal && d.MercHPPercent() <= 0 && d.PlayerUnit.TotalGold() > 30000 && d.PlayerUnit.Area == area.LutGholein { + b.Logger.Info("Hiring merc...") // TODO: Hire Holy Freeze merc if available, if not, hire Defiance merc. actions = append(actions, b.InteractNPC( @@ -317,9 +316,9 @@ func (b *Builder) HireMerc() *Chain { step.KeySequence("home", "down", "enter"), step.Wait(time.Second*2), step.SyncStep(func(d data.Data) error { - hid.Click(hid.LeftButton, ui.FirstMercFromContractorListX, ui.FirstMercFromContractorListY) + b.HID.Click(game.LeftButton, ui.FirstMercFromContractorListX, ui.FirstMercFromContractorListY) helper.Sleep(300) - hid.Click(hid.LeftButton, ui.FirstMercFromContractorListX, ui.FirstMercFromContractorListY) + b.HID.Click(game.LeftButton, ui.FirstMercFromContractorListX, ui.FirstMercFromContractorListY) return nil }), diff --git a/internal/action/move.go b/internal/action/move.go index 847e9d454..a0b13a2b1 100644 --- a/internal/action/move.go +++ b/internal/action/move.go @@ -2,7 +2,6 @@ package action import ( "fmt" - "github.com/hectorgimenez/koolo/internal/config" "log/slog" "time" @@ -13,14 +12,13 @@ import ( "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/pather" - "github.com/hectorgimenez/koolo/internal/reader" ) func (b *Builder) MoveToArea(dst area.Area, opts ...step.MoveToStepOption) *Chain { // Exception for Arcane Sanctuary, we need to find the portal first if dst == area.ArcaneSanctuary { return NewChain(func(d data.Data) []Action { - b.logger.Debug("Arcane Sanctuary detected, finding the Portal") + b.Logger.Debug("Arcane Sanctuary detected, finding the Portal") portal, _ := d.Objects.FindOne(object.ArcaneSanctuaryPortal) return []Action{ b.MoveToCoords(portal.Position), @@ -37,13 +35,13 @@ func (b *Builder) MoveToArea(dst area.Area, opts ...step.MoveToStepOption) *Chai toFun := func(d data.Data) (data.Position, bool) { if d.PlayerUnit.Area == dst { - b.logger.Debug("Reached area", slog.Any("area", dst)) + b.Logger.Debug("Reached area", slog.Any("area", dst)) return data.Position{}, false } switch dst { case area.MonasteryGate: - b.logger.Debug("Monastery Gate detected, moving to static coords") + b.Logger.Debug("Monastery Gate detected, moving to static coords") return data.Position{X: 15139, Y: 5056}, true } @@ -51,7 +49,7 @@ func (b *Builder) MoveToArea(dst area.Area, opts ...step.MoveToStepOption) *Chai if a.Area == dst { // To correctly detect the two possible exits from Lut Gholein if dst == area.RockyWaste && d.PlayerUnit.Area == area.LutGholein { - if _, _, found := pather.GetPath(d, data.Position{X: 5004, Y: 5065}); found { + if _, _, found := b.PathFinder.GetPath(d, data.Position{X: 5004, Y: 5065}); found { return data.Position{X: 4989, Y: 5063}, true } else { return data.Position{X: 5096, Y: 4997}, true @@ -63,12 +61,12 @@ func (b *Builder) MoveToArea(dst area.Area, opts ...step.MoveToStepOption) *Chai return a.Position, true } - lvl, _ := reader.CachedMapData.GetLevelData(a.Area) - _, _, objects, _ := reader.CachedMapData.NPCsExitsAndObjects(lvl.Offset, a.Area) + lvl, _ := b.Reader.CachedMapData.GetLevelData(a.Area) + _, _, objects, _ := b.Reader.CachedMapData.NPCsExitsAndObjects(lvl.Offset, a.Area) // Let's try to find any random object to use as a destination point, once we enter the level we will exit this flow for _, obj := range objects { - _, _, found := pather.GetPath(d, obj.Position) + _, _, found := b.PathFinder.GetPath(d, obj.Position) if found { return obj.Position, true } @@ -78,7 +76,7 @@ func (b *Builder) MoveToArea(dst area.Area, opts ...step.MoveToStepOption) *Chai } } - b.logger.Debug("Destination area not found", slog.Any("area", dst)) + b.Logger.Debug("Destination area not found", slog.Any("area", dst)) return data.Position{}, false } @@ -128,7 +126,7 @@ func (b *Builder) MoveTo(toFunc func(d data.Data) (data.Position, bool), opts .. if isLevelingChar && !d.PlayerUnit.Area.IsTown() { _, healingPotsFound := d.Items.Belt.GetFirstPotion(data.HealingPotion) _, manaPotsFound := d.Items.Belt.GetFirstPotion(data.ManaPotion) - if ((!healingPotsFound && config.Config.Inventory.BeltColumns.Healing > 0) || (!manaPotsFound && config.Config.Inventory.BeltColumns.Mana > 0)) && d.PlayerUnit.TotalGold() > 1000 { + if ((!healingPotsFound && b.CharacterCfg.Inventory.BeltColumns.Healing > 0) || (!manaPotsFound && b.CharacterCfg.Inventory.BeltColumns.Mana > 0)) && d.PlayerUnit.TotalGold() > 1000 { return []Action{NewChain(func(d data.Data) []Action { return b.InRunReturnTownRoutine() })} @@ -139,7 +137,7 @@ func (b *Builder) MoveTo(toFunc func(d data.Data) (data.Position, bool), opts .. // If we can teleport, and we're not on leveling sequence, just return the normal MoveTo step and stop here if !isLevelingChar { return []Action{NewStepChain(func(d data.Data) []step.Step { - return []step.Step{step.MoveTo(to, opts...)} + return []step.Step{step.MoveTo(b.CharacterCfg, to, opts...)} })} } // But if we are leveling and have enough money (to buy mana pots), let's teleport. We add the timeout @@ -147,7 +145,7 @@ func (b *Builder) MoveTo(toFunc func(d data.Data) (data.Position, bool), opts .. if d.PlayerUnit.TotalGold() > 30000 { return []Action{NewStepChain(func(d data.Data) []step.Step { newOpts := append(opts, step.WithTimeout(5*time.Second)) - return []step.Step{step.MoveTo(to, newOpts...)} + return []step.Step{step.MoveTo(b.CharacterCfg, to, newOpts...)} })} } } @@ -157,7 +155,7 @@ func (b *Builder) MoveTo(toFunc func(d data.Data) (data.Position, bool), opts .. if o.IsDoor() && pather.DistanceFromMe(d, o.Position) < 10 && openedDoors[o.Name] != o.Position { if o.Selectable { return []Action{NewStepChain(func(d data.Data) []step.Step { - b.logger.Info("Door detected and teleport is not available, trying to open it...") + b.Logger.Info("Door detected and teleport is not available, trying to open it...") openedDoors[o.Name] = o.Position return []step.Step{step.InteractObject(o.Name, func(d data.Data) bool { for _, obj := range d.Objects { @@ -208,17 +206,17 @@ func (b *Builder) MoveTo(toFunc func(d data.Data) (data.Position, bool), opts .. if len(targetedNormalEnemies) > 5 || len(targetedElites) > 0 || (stuck && (len(targetedNormalEnemies) > 0 || len(targetedElites) > 0)) || (pather.IsNarrowMap(d.PlayerUnit.Area) && (len(targetedNormalEnemies) > 0 || len(targetedElites) > 0)) { if stuck { - b.logger.Info("Character stuck and monsters detected, trying to kill monsters around") + b.Logger.Info("Character stuck and monsters detected, trying to kill monsters around") } else { - b.logger.Info(fmt.Sprintf("At least %d monsters detected close to the character, targeting closest one: %d", len(targetedNormalEnemies)+len(targetedElites), closestMonster.Name)) + b.Logger.Info(fmt.Sprintf("At least %d monsters detected close to the character, targeting closest one: %d", len(targetedNormalEnemies)+len(targetedElites), closestMonster.Name)) } - path, _, mPathFound := pather.GetPath(d, closestMonster.Position) + path, _, mPathFound := b.PathFinder.GetPath(d, closestMonster.Position) if mPathFound { doorIsBlocking := false for _, o := range d.Objects { if o.IsDoor() && o.Selectable && path.Intersects(d, o.Position, 4) { - b.logger.Debug("Door is blocking the path to the monster, skipping attack sequence") + b.Logger.Debug("Door is blocking the path to the monster, skipping attack sequence") doorIsBlocking = true } } @@ -243,6 +241,7 @@ func (b *Builder) MoveTo(toFunc func(d data.Data) (data.Position, bool), opts .. previousIterationPosition = d.PlayerUnit.Position if currentStep == nil { currentStep = step.MoveTo( + b.CharacterCfg, to, newOpts..., ) diff --git a/internal/action/pre_run.go b/internal/action/pre_run.go index 3bc236a2f..0107a3c78 100644 --- a/internal/action/pre_run.go +++ b/internal/action/pre_run.go @@ -1,9 +1,7 @@ package action -import "github.com/hectorgimenez/koolo/internal/config" - func (b *Builder) PreRun(firstRun bool) []Action { - if config.Config.Companion.Enabled && !config.Config.Companion.Leader { + if b.CharacterCfg.Companion.Enabled && !b.CharacterCfg.Companion.Leader { return []Action{ b.RecoverCorpse(), b.Heal(), diff --git a/internal/action/recover_corpse.go b/internal/action/recover_corpse.go index e2abdd2bd..72bafbfd5 100644 --- a/internal/action/recover_corpse.go +++ b/internal/action/recover_corpse.go @@ -3,24 +3,23 @@ package action import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/hid" - "github.com/hectorgimenez/koolo/internal/pather" + "github.com/hectorgimenez/koolo/internal/game" ) func (b *Builder) RecoverCorpse() *StepChainAction { return NewStepChain(func(d data.Data) (steps []step.Step) { - b.logger.Debug("Checking for character corpse...") + b.Logger.Debug("Checking for character corpse...") if d.Corpse.Found { - b.logger.Info("Corpse found, let's recover our stuff...") + b.Logger.Info("Corpse found, let's recover our stuff...") steps = append(steps, step.SyncStepWithCheck(func(d data.Data) error { - x, y := pather.GameCoordsToScreenCords( + x, y := b.PathFinder.GameCoordsToScreenCords( d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, d.Corpse.Position.X, d.Corpse.Position.Y, ) - hid.Click(hid.LeftButton, x, y) + b.HID.Click(game.LeftButton, x, y) return nil }, func(d data.Data) step.Status { @@ -32,7 +31,7 @@ func (b *Builder) RecoverCorpse() *StepChainAction { }), ) } else { - b.logger.Debug("Character corpse not found :D") + b.Logger.Debug("Character corpse not found :D") } return diff --git a/internal/action/repair.go b/internal/action/repair.go index 6c4f3b77e..bc7ff1639 100644 --- a/internal/action/repair.go +++ b/internal/action/repair.go @@ -2,14 +2,13 @@ package action import ( "fmt" - "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/item" "github.com/hectorgimenez/d2go/pkg/data/npc" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action/step" + "github.com/hectorgimenez/koolo/internal/game" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/town" ) @@ -18,7 +17,7 @@ func (b *Builder) Repair() *Chain { for _, i := range d.Items.ByLocation(item.LocationEquipped) { du, found := i.Stats[stat.Durability] if _, maxDurabilityFound := i.Stats[stat.MaxDurability]; maxDurabilityFound && !found || (found && du.Value <= 1) { - b.logger.Info(fmt.Sprintf("Repairing %s, durability is: %d", i.Name, du.Value)) + b.Logger.Info(fmt.Sprintf("Repairing %s, durability is: %d", i.Name, du.Value)) repairNPC := town.GetTownByArea(d.PlayerUnit.Area).RepairNPC() if repairNPC == npc.Hratli { actions = append(actions, b.MoveToCoords(data.Position{X: 5224, Y: 5045})) @@ -34,7 +33,7 @@ func (b *Builder) Repair() *Chain { step.KeySequence(keys...), step.SyncStep(func(_ data.Data) error { helper.Sleep(100) - hid.Click(hid.LeftButton, 390, 515) + b.HID.Click(game.LeftButton, 390, 515) helper.Sleep(500) return nil }), diff --git a/internal/action/revive_merc.go b/internal/action/revive_merc.go index 1fc1eee50..c06320a60 100644 --- a/internal/action/revive_merc.go +++ b/internal/action/revive_merc.go @@ -6,20 +6,19 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/difficulty" "github.com/hectorgimenez/d2go/pkg/data/npc" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/town" ) func (b *Builder) ReviveMerc() *Chain { return NewChain(func(d data.Data) []Action { _, isLevelingChar := b.ch.(LevelingCharacter) - if config.Config.Character.UseMerc && d.MercHPPercent() <= 0 { - if isLevelingChar && d.PlayerUnit.Area == area.RogueEncampment && config.Config.Game.Difficulty == difficulty.Normal { + if b.CharacterCfg.Character.UseMerc && d.MercHPPercent() <= 0 { + if isLevelingChar && d.PlayerUnit.Area == area.RogueEncampment && b.CharacterCfg.Game.Difficulty == difficulty.Normal { // Ignoring because merc is not hired yet return nil } - b.logger.Info("Merc is dead, let's revive it!") + b.Logger.Info("Merc is dead, let's revive it!") mercNPC := town.GetTownByArea(d.PlayerUnit.Area).MercContractorNPC() diff --git a/internal/action/stash.go b/internal/action/stash.go index 096179c06..d4dc6d6d0 100644 --- a/internal/action/stash.go +++ b/internal/action/stash.go @@ -9,10 +9,9 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/d2go/pkg/itemfilter" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" - stat2 "github.com/hectorgimenez/koolo/internal/event/stat" + "github.com/hectorgimenez/koolo/internal/event" + "github.com/hectorgimenez/koolo/internal/game" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/ui" "log/slog" ) @@ -27,13 +26,13 @@ const ( func (b *Builder) Stash(forceStash bool) *Chain { return NewChain(func(d data.Data) (actions []Action) { - b.logger.Debug("Checking for items to stash...") + b.Logger.Debug("Checking for items to stash...") if !b.isStashingRequired(d, forceStash) { - b.logger.Debug("No items to stash...") + b.Logger.Debug("No items to stash...") return } - b.logger.Info("Stashing items...") + b.Logger.Info("Stashing items...") switch d.PlayerUnit.Area { case area.KurastDocks: @@ -51,7 +50,7 @@ func (b *Builder) Stash(forceStash bool) *Chain { b.stashGold(d) b.orderInventoryPotions(d) b.stashInventory(d, forceStash) - hid.PressKey("esc") + b.HID.PressKey("esc") return nil }), ), @@ -62,12 +61,12 @@ func (b *Builder) Stash(forceStash bool) *Chain { func (b *Builder) orderInventoryPotions(d data.Data) { for _, i := range d.Items.ByLocation(item.LocationInventory) { if i.IsPotion() { - if config.Config.Inventory.InventoryLock[i.Position.Y][i.Position.X] == 0 { + if b.CharacterCfg.Inventory.InventoryLock[i.Position.Y][i.Position.X] == 0 { continue } screenPos := ui.GetScreenCoordsForItem(i) helper.Sleep(100) - hid.Click(hid.RightButton, screenPos.X, screenPos.Y) + b.HID.Click(game.RightButton, screenPos.X, screenPos.Y) helper.Sleep(200) } } @@ -93,30 +92,30 @@ func (b *Builder) stashGold(d data.Data) { return } - b.logger.Info("Stashing gold...", slog.Int("gold", gold)) + b.Logger.Info("Stashing gold...", slog.Int("gold", gold)) if d.PlayerUnit.Stats[stat.StashGold] < maxGoldPerStashTab { - switchTab(1) - clickStashGoldBtn() + b.switchTab(1) + b.clickStashGoldBtn() helper.Sleep(500) } for i := 2; i < 5; i++ { - d = b.gr.GetData(false) + d = b.Reader.GetData(false) gold, found = d.PlayerUnit.Stats[stat.Gold] if !found || gold == 0 { return } - switchTab(i) - clickStashGoldBtn() + b.switchTab(i) + b.clickStashGoldBtn() } - b.logger.Info("All stash tabs are full of gold :D") + b.Logger.Info("All stash tabs are full of gold :D") } func (b *Builder) stashInventory(d data.Data, forceStash bool) { currentTab := 1 - switchTab(currentTab) + b.switchTab(currentTab) for _, i := range d.Items.ByLocation(item.LocationInventory) { if !b.shouldStashIt(i, forceStash) { @@ -124,15 +123,15 @@ func (b *Builder) stashInventory(d data.Data, forceStash bool) { } for currentTab < 5 { if b.stashItemAction(i, forceStash) { - b.logger.Debug(fmt.Sprintf("Item %s [%d] stashed", i.Name, i.Quality)) + b.Logger.Debug(fmt.Sprintf("Item %s [%d] stashed", i.Name, i.Quality)) break } if currentTab == 5 { // TODO: Stop the bot, stash is full } - b.logger.Debug(fmt.Sprintf("Tab %d is full, switching to next one", currentTab)) + b.Logger.Debug(fmt.Sprintf("Tab %d is full, switching to next one", currentTab)) currentTab++ - switchTab(currentTab) + b.switchTab(currentTab) } } } @@ -148,23 +147,23 @@ func (b *Builder) shouldStashIt(i data.Item, forceStash bool) bool { return false } - if config.Config.Inventory.InventoryLock[i.Position.Y][i.Position.X] == 0 || i.IsPotion() { + if b.CharacterCfg.Inventory.InventoryLock[i.Position.Y][i.Position.X] == 0 || i.IsPotion() { return false } - return forceStash || itemfilter.Evaluate(i, config.Config.Runtime.Rules) + return forceStash || itemfilter.Evaluate(i, b.CharacterCfg.Runtime.Rules) } func (b *Builder) stashItemAction(i data.Item, forceStash bool) bool { screenPos := ui.GetScreenCoordsForItem(i) - hid.MovePointer(screenPos.X, screenPos.Y) + b.HID.MovePointer(screenPos.X, screenPos.Y) helper.Sleep(170) - screenshot := helper.Screenshot() + screenshot := b.Reader.Screenshot() helper.Sleep(150) - hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) + b.HID.ClickWithModifier(game.LeftButton, screenPos.X, screenPos.Y, game.CtrlKey) helper.Sleep(500) - d := b.gr.GetData(false) + d := b.Reader.GetData(false) for _, it := range d.Items.ByLocation(item.LocationInventory) { if it.UnitID == i.UnitID { return false @@ -173,25 +172,25 @@ func (b *Builder) stashItemAction(i data.Item, forceStash bool) bool { // Don't log items that we already have in inventory during first run if !forceStash { - stat2.ItemStashed(i, screenshot) + b.EventChan <- event.ItemStashed(event.WithScreenshot(fmt.Sprintf("Item %s [%d] stashed", i.Name, i.Quality), screenshot), i) } return true } -func clickStashGoldBtn() { +func (b *Builder) clickStashGoldBtn() { helper.Sleep(170) - hid.Click(hid.LeftButton, stashGoldBtnX, stashGoldBtnY) + b.HID.Click(game.LeftButton, stashGoldBtnX, stashGoldBtnY) helper.Sleep(1000) - hid.Click(hid.LeftButton, stashGoldBtnConfirmX, stashGoldBtnConfirmY) + b.HID.Click(game.LeftButton, stashGoldBtnConfirmX, stashGoldBtnConfirmY) helper.Sleep(700) } -func switchTab(tab int) { +func (b *Builder) switchTab(tab int) { x := 107 y := 128 tabSize := 82 x = x + tabSize*tab - tabSize/2 - hid.Click(hid.LeftButton, x, y) + b.HID.Click(game.LeftButton, x, y) helper.Sleep(500) } diff --git a/internal/action/step/attack.go b/internal/action/step/attack.go index d5e03a85f..0a4c68949 100644 --- a/internal/action/step/attack.go +++ b/internal/action/step/attack.go @@ -1,18 +1,20 @@ package step import ( + "github.com/hectorgimenez/koolo/internal/container" + "github.com/hectorgimenez/koolo/internal/game" "time" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/pather" ) type AttackStep struct { basicStep + cfg *config.CharacterCfg target data.UnitID standStillBinding string numOfAttacksRemaining int @@ -43,14 +45,15 @@ func EnsureAura(keyBinding string) AttackOption { } } -func PrimaryAttack(target data.UnitID, numOfAttacks int, opts ...AttackOption) *AttackStep { +func PrimaryAttack(cfg *config.CharacterCfg, target data.UnitID, numOfAttacks int, opts ...AttackOption) *AttackStep { s := &AttackStep{ primaryAttack: true, basicStep: newBasicStep(), target: target, - standStillBinding: config.Config.Bindings.StandStill, + standStillBinding: cfg.Bindings.StandStill, numOfAttacksRemaining: numOfAttacks, aoe: target == 0, + cfg: cfg, } for _, o := range opts { @@ -59,15 +62,16 @@ func PrimaryAttack(target data.UnitID, numOfAttacks int, opts ...AttackOption) * return s } -func SecondaryAttack(keyBinding string, target data.UnitID, numOfAttacks int, opts ...AttackOption) *AttackStep { +func SecondaryAttack(cfg *config.CharacterCfg, keyBinding string, target data.UnitID, numOfAttacks int, opts ...AttackOption) *AttackStep { s := &AttackStep{ primaryAttack: false, basicStep: newBasicStep(), target: target, - standStillBinding: config.Config.Bindings.StandStill, + standStillBinding: cfg.Bindings.StandStill, numOfAttacksRemaining: numOfAttacks, keyBinding: keyBinding, aoe: target == 0, + cfg: cfg, } for _, o := range opts { o(s) @@ -75,19 +79,19 @@ func SecondaryAttack(keyBinding string, target data.UnitID, numOfAttacks int, op return s } -func (p *AttackStep) Status(_ data.Data) Status { +func (p *AttackStep) Status(_ data.Data, _ container.Container) Status { if p.status == StatusCompleted { return StatusCompleted } - if p.numOfAttacksRemaining <= 0 && time.Since(p.lastRun) > config.Config.Runtime.CastDuration { + if p.numOfAttacksRemaining <= 0 && time.Since(p.lastRun) > p.cfg.Runtime.CastDuration { return p.tryTransitionStatus(StatusCompleted) } return p.status } -func (p *AttackStep) Run(d data.Data) error { +func (p *AttackStep) Run(d data.Data, container container.Container) error { monster, found := d.Monsters.FindByID(p.target) if !p.aoe { @@ -99,12 +103,12 @@ func (p *AttackStep) Run(d data.Data) error { // Move into the attack distance range before starting if p.followEnemy { - if !p.ensureEnemyIsInRange(monster, d) { + if !p.ensureEnemyIsInRange(container, monster, d) { return nil } } else { // Since we are not following the enemy, and it's not in range, we can't attack it - _, distance, found := pather.GetPath(d, monster.Position) + _, distance, found := container.PathFinder.GetPath(d, monster.Position) if !found || distance > p.maxDistance { p.tryTransitionStatus(StatusCompleted) return nil @@ -114,28 +118,28 @@ func (p *AttackStep) Run(d data.Data) error { if p.status == StatusNotStarted || p.forceApplyKeyBinding { if p.keyBinding != "" { - hid.PressKey(p.keyBinding) + container.HID.PressKey(p.keyBinding) helper.Sleep(100) } if p.auraKeyBinding != "" { - hid.PressKey(p.auraKeyBinding) + container.HID.PressKey(p.auraKeyBinding) } p.forceApplyKeyBinding = false } p.tryTransitionStatus(StatusInProgress) - if time.Since(p.lastRun) > config.Config.Runtime.CastDuration && p.numOfAttacksRemaining > 0 { - hid.KeyDown(p.standStillBinding) - x, y := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, monster.Position.X, monster.Position.Y) + if time.Since(p.lastRun) > p.cfg.Runtime.CastDuration && p.numOfAttacksRemaining > 0 { + container.HID.KeyDown(p.standStillBinding) + x, y := container.PathFinder.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, monster.Position.X, monster.Position.Y) if p.primaryAttack { - hid.Click(hid.LeftButton, x, y) + container.HID.Click(game.LeftButton, x, y) } else { - hid.Click(hid.RightButton, x, y) + container.HID.Click(game.RightButton, x, y) } helper.Sleep(20) - hid.KeyUp(p.standStillBinding) + container.HID.KeyUp(p.standStillBinding) p.lastRun = time.Now() p.numOfAttacksRemaining-- } @@ -143,12 +147,12 @@ func (p *AttackStep) Run(d data.Data) error { return nil } -func (p *AttackStep) ensureEnemyIsInRange(monster data.Monster, d data.Data) bool { +func (p *AttackStep) ensureEnemyIsInRange(container container.Container, monster data.Monster, d data.Data) bool { if !p.followEnemy { return true } - path, distance, found := pather.GetPath(d, monster.Position) + path, distance, found := container.PathFinder.GetPath(d, monster.Position) // We can not reach the enemy, let's skip the attack sequence if !found { @@ -166,7 +170,7 @@ func (p *AttackStep) ensureEnemyIsInRange(monster data.Monster, d data.Data) boo } pos := path.AstarPather[moveTo].(*pather.Tile) - p.moveToStep = MoveTo(data.Position{ + p.moveToStep = MoveTo(p.cfg, data.Position{ X: pos.X + d.AreaOrigin.X, Y: pos.Y + d.AreaOrigin.Y, }) @@ -174,12 +178,12 @@ func (p *AttackStep) ensureEnemyIsInRange(monster data.Monster, d data.Data) boo } if p.moveToStep == nil { - p.moveToStep = MoveTo(data.Position{X: monster.Position.X, Y: monster.Position.Y}) + p.moveToStep = MoveTo(p.cfg, data.Position{X: monster.Position.X, Y: monster.Position.Y}) } } - if p.moveToStep.Status(d) != StatusCompleted { - p.moveToStep.Run(d) + if p.moveToStep.Status(d, container) != StatusCompleted { + p.moveToStep.Run(d, container) p.forceApplyKeyBinding = true return false } diff --git a/internal/action/step/interact_entrance.go b/internal/action/step/interact_entrance.go index 054a5729c..b526ba9f9 100644 --- a/internal/action/step/interact_entrance.go +++ b/internal/action/step/interact_entrance.go @@ -3,12 +3,13 @@ package step import ( "errors" "fmt" + "github.com/hectorgimenez/koolo/internal/container" + "github.com/hectorgimenez/koolo/internal/game" "time" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -26,7 +27,7 @@ func InteractEntrance(area area.Area) *InteractEntranceStep { } } -func (m *InteractEntranceStep) Status(d data.Data) Status { +func (m *InteractEntranceStep) Status(d data.Data, _ container.Container) Status { if m.status == StatusCompleted { return StatusCompleted } @@ -39,7 +40,7 @@ func (m *InteractEntranceStep) Status(d data.Data) Status { return m.status } -func (m *InteractEntranceStep) Run(d data.Data) error { +func (m *InteractEntranceStep) Run(d data.Data, container container.Container) error { m.tryTransitionStatus(StatusInProgress) if m.mouseOverAttempts > maxInteractions { @@ -59,14 +60,14 @@ func (m *InteractEntranceStep) Run(d data.Data) error { } if l.IsEntrance { - lx, ly := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, l.Position.X-2, l.Position.Y-2) + lx, ly := container.PathFinder.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, l.Position.X-2, l.Position.Y-2) if d.HoverData.UnitType == 5 || d.HoverData.UnitType == 2 && d.HoverData.IsHovered { - hid.Click(hid.LeftButton, lx, ly) + container.HID.Click(game.LeftButton, lx, ly) m.waitingForInteraction = true } x, y := helper.Spiral(m.mouseOverAttempts) - hid.MovePointer(lx+x, ly+y) + container.HID.MovePointer(lx+x, ly+y) m.mouseOverAttempts++ return nil } diff --git a/internal/action/step/interact_npc.go b/internal/action/step/interact_npc.go index 3c98c881b..25247f2b1 100644 --- a/internal/action/step/interact_npc.go +++ b/internal/action/step/interact_npc.go @@ -2,11 +2,12 @@ package step import ( "fmt" + "github.com/hectorgimenez/koolo/internal/container" + "github.com/hectorgimenez/koolo/internal/game" "time" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/npc" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -32,7 +33,7 @@ func InteractNPCWithCheck(npc npc.ID, isCompletedFn func(d data.Data) bool) *Int } } -func (i *InteractNPCStep) Status(d data.Data) Status { +func (i *InteractNPCStep) Status(d data.Data, _ container.Container) Status { if i.status == StatusCompleted { return StatusCompleted } @@ -49,7 +50,7 @@ func (i *InteractNPCStep) Status(d data.Data) Status { return i.status } -func (i *InteractNPCStep) Run(d data.Data) error { +func (i *InteractNPCStep) Run(d data.Data, container container.Container) error { i.tryTransitionStatus(StatusInProgress) // Give some time before retrying the interaction @@ -60,9 +61,9 @@ func (i *InteractNPCStep) Run(d data.Data) error { i.lastRun = time.Now() m, found := d.Monsters.FindOne(i.NPC, data.MonsterTypeNone) if found { - x, y := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, m.Position.X, m.Position.Y) + x, y := container.PathFinder.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, m.Position.X, m.Position.Y) if m.IsHovered { - hid.Click(hid.LeftButton, x, y) + container.HID.Click(game.LeftButton, x, y) i.waitingForInteraction = true return nil } @@ -74,9 +75,9 @@ func (i *InteractNPCStep) Run(d data.Data) error { // Act 4 Tyrael has a super weird hitbox if i.NPC == npc.Tyrael2 { - hid.MovePointer(x, y-20) + container.HID.MovePointer(x, y-20) } else { - hid.MovePointer(x, y) + container.HID.MovePointer(x, y) } return nil diff --git a/internal/action/step/interact_object.go b/internal/action/step/interact_object.go index e838321f4..7a4165b0e 100644 --- a/internal/action/step/interact_object.go +++ b/internal/action/step/interact_object.go @@ -2,12 +2,13 @@ package step import ( "fmt" + "github.com/hectorgimenez/koolo/internal/container" + "github.com/hectorgimenez/koolo/internal/game" "time" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/object" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -27,7 +28,7 @@ func InteractObject(name object.Name, isCompleted func(data.Data) bool) *Interac } } -func (i *InteractObjectStep) Status(d data.Data) Status { +func (i *InteractObjectStep) Status(d data.Data, _ container.Container) Status { if i.status == StatusCompleted { return StatusCompleted } @@ -45,7 +46,7 @@ func (i *InteractObjectStep) Status(d data.Data) Status { return i.status } -func (i *InteractObjectStep) Run(d data.Data) error { +func (i *InteractObjectStep) Run(d data.Data, container container.Container) error { i.tryTransitionStatus(StatusInProgress) if i.mouseOverAttempts > maxInteractions { @@ -61,9 +62,9 @@ func (i *InteractObjectStep) Run(d data.Data) error { if o, found := d.Objects.FindOne(i.objectName); found { objectX := o.Position.X - 2 objectY := o.Position.Y - 2 - mX, mY := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, objectX, objectY) + mX, mY := container.PathFinder.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, objectX, objectY) if o.IsHovered { - hid.Click(hid.LeftButton, mX, mY) + container.HID.Click(game.LeftButton, mX, mY) i.waitingForInteraction = true return nil } else { @@ -74,11 +75,11 @@ func (i *InteractObjectStep) Run(d data.Data) error { // In order to avoid the spiral (super slow and shitty) let's try to point the mouse to the top of the portal directly if i.mouseOverAttempts == 2 && i.objectName == object.TownPortal { - mX, mY = pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, objectX-4, objectY-4) + mX, mY = container.PathFinder.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, objectX-4, objectY-4) } x, y := helper.Spiral(i.mouseOverAttempts) - hid.MovePointer(mX+x, mY+y) + container.HID.MovePointer(mX+x, mY+y) i.mouseOverAttempts++ return nil diff --git a/internal/action/step/key_sequence.go b/internal/action/step/key_sequence.go index bf2759210..23e4b86fb 100644 --- a/internal/action/step/key_sequence.go +++ b/internal/action/step/key_sequence.go @@ -1,10 +1,10 @@ package step import ( + "github.com/hectorgimenez/koolo/internal/container" "time" "github.com/hectorgimenez/d2go/pkg/data" - "github.com/hectorgimenez/koolo/internal/hid" ) type KeySequenceStep struct { @@ -19,7 +19,7 @@ func KeySequence(keysToPress ...string) *KeySequenceStep { } } -func (o *KeySequenceStep) Status(_ data.Data) Status { +func (o *KeySequenceStep) Status(_ data.Data, container container.Container) Status { if o.status == StatusCompleted { return StatusCompleted } @@ -32,14 +32,14 @@ func (o *KeySequenceStep) Status(_ data.Data) Status { return o.status } -func (o *KeySequenceStep) Run(_ data.Data) error { +func (o *KeySequenceStep) Run(_ data.Data, container container.Container) error { if time.Since(o.lastRun) < time.Millisecond*200 { return nil } var k string k, o.keysToPress = o.keysToPress[0], o.keysToPress[1:] - hid.PressKey(k) + container.HID.PressKey(k) o.lastRun = time.Now() return nil diff --git a/internal/action/step/move_to.go b/internal/action/step/move_to.go index 2d892800e..44791e01c 100644 --- a/internal/action/step/move_to.go +++ b/internal/action/step/move_to.go @@ -2,13 +2,13 @@ package step import ( "errors" + "github.com/hectorgimenez/koolo/internal/container" "time" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/skill" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -19,15 +19,17 @@ type MoveToStep struct { nearestWalkable bool timeout time.Duration startedAt time.Time + cfg *config.CharacterCfg } type MoveToStepOption func(step *MoveToStep) -func MoveTo(destination data.Position, opts ...MoveToStepOption) *MoveToStep { +func MoveTo(cfg *config.CharacterCfg, destination data.Position, opts ...MoveToStepOption) *MoveToStep { step := &MoveToStep{ pathingStep: newPathingStep(), destination: destination, timeout: time.Second * 30, + cfg: cfg, } for _, o := range opts { @@ -55,7 +57,7 @@ func WithTimeout(timeout time.Duration) MoveToStepOption { } } -func (m *MoveToStep) Status(d data.Data) Status { +func (m *MoveToStep) Status(d data.Data, _ container.Container) Status { if m.status == StatusCompleted { return StatusCompleted } @@ -68,15 +70,15 @@ func (m *MoveToStep) Status(d data.Data) Status { return m.status } -func (m *MoveToStep) Run(d data.Data) error { +func (m *MoveToStep) Run(d data.Data, container container.Container) error { // Press the Teleport keybinding if it's available, otherwise use vigor (if available) if helper.CanTeleport(d) { if d.PlayerUnit.RightSkill != skill.Teleport { - hid.PressKey(config.Config.Bindings.Teleport) + container.HID.PressKey(m.cfg.Bindings.Teleport) } - } else if d.PlayerUnit.Skills[skill.Vigor].Level > 0 && config.Config.Bindings.Paladin.Vigor != "" { + } else if d.PlayerUnit.Skills[skill.Vigor].Level > 0 && m.cfg.Bindings.Paladin.Vigor != "" { if d.PlayerUnit.RightSkill != skill.Vigor { - hid.PressKey(config.Config.Bindings.Paladin.Vigor) + container.HID.PressKey(m.cfg.Bindings.Paladin.Vigor) } } @@ -97,7 +99,7 @@ func (m *MoveToStep) Run(d data.Data) error { return nil } - if helper.CanTeleport(d) && time.Since(m.lastRun) < config.Config.Runtime.CastDuration { + if helper.CanTeleport(d) && time.Since(m.lastRun) < m.cfg.Runtime.CastDuration { return nil } @@ -106,7 +108,7 @@ func (m *MoveToStep) Run(d data.Data) error { if m.path == nil || !m.cachePath(d) || stuck { if stuck { if len(m.path.AstarPather) == 0 { - pather.RandomMovement() + container.PathFinder.RandomMovement() m.lastRun = time.Now() return nil @@ -116,11 +118,11 @@ func (m *MoveToStep) Run(d data.Data) error { } } - path, _, found := pather.GetPath(d, m.destination, m.blacklistedPositions...) + path, _, found := container.PathFinder.GetPath(d, m.destination, m.blacklistedPositions...) if !found { // Try to find the nearest walkable place if m.nearestWalkable { - path, _, found = pather.GetClosestWalkablePath(d, m.destination, m.blacklistedPositions...) + path, _, found = container.PathFinder.GetClosestWalkablePath(d, m.destination, m.blacklistedPositions...) if !found { return errors.New("path could not be calculated, maybe there is an obstacle or a flying platform (arcane sanctuary)") } @@ -137,7 +139,7 @@ func (m *MoveToStep) Run(d data.Data) error { if len(m.path.AstarPather) == 0 { return nil } - pather.MoveThroughPath(m.path, calculateMaxDistance(d, walkDuration), helper.CanTeleport(d)) + container.PathFinder.MoveThroughPath(m.path, calculateMaxDistance(d, walkDuration), helper.CanTeleport(d)) return nil } diff --git a/internal/action/step/open_portal.go b/internal/action/step/open_portal.go index 65cad867e..39966d5e2 100644 --- a/internal/action/step/open_portal.go +++ b/internal/action/step/open_portal.go @@ -1,23 +1,27 @@ package step import ( + "github.com/hectorgimenez/koolo/internal/container" + "github.com/hectorgimenez/koolo/internal/game" "time" "github.com/hectorgimenez/d2go/pkg/data" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" ) type OpenPortalStep struct { basicStep + tpKB string } -func OpenPortal() *OpenPortalStep { - return &OpenPortalStep{basicStep: newBasicStep()} +func OpenPortal(tpKB string) *OpenPortalStep { + return &OpenPortalStep{ + basicStep: newBasicStep(), + tpKB: tpKB, + } } -func (s *OpenPortalStep) Status(d data.Data) Status { +func (s *OpenPortalStep) Status(d data.Data, _ container.Container) Status { if s.status == StatusCompleted { return StatusCompleted } @@ -35,15 +39,15 @@ func (s *OpenPortalStep) Status(d data.Data) Status { return StatusInProgress } -func (s *OpenPortalStep) Run(_ data.Data) error { +func (s *OpenPortalStep) Run(_ data.Data, container container.Container) error { // Give some time to portal to popup before retrying... if time.Since(s.LastRun()) < time.Second*2 { return nil } - hid.PressKey(config.Config.Bindings.TP) + container.HID.PressKey(s.tpKB) helper.Sleep(250) - hid.Click(hid.RightButton, 300, 300) + container.HID.Click(game.RightButton, 300, 300) s.lastRun = time.Now() return nil diff --git a/internal/action/step/pickup_item.go b/internal/action/step/pickup_item.go index bd59db8dc..fab7cd2d9 100644 --- a/internal/action/step/pickup_item.go +++ b/internal/action/step/pickup_item.go @@ -2,13 +2,14 @@ package step import ( "fmt" + "github.com/hectorgimenez/koolo/internal/container" + "github.com/hectorgimenez/koolo/internal/game" "log/slog" "time" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/item" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -31,7 +32,7 @@ func PickupItem(logger *slog.Logger, item data.Item) *PickupItemStep { } } -func (p *PickupItemStep) Status(d data.Data) Status { +func (p *PickupItemStep) Status(d data.Data, _ container.Container) Status { if p.status == StatusCompleted { return p.status } @@ -47,7 +48,7 @@ func (p *PickupItemStep) Status(d data.Data) Status { return p.tryTransitionStatus(StatusCompleted) } -func (p *PickupItemStep) Run(d data.Data) error { +func (p *PickupItemStep) Run(d data.Data, container container.Container) error { for _, m := range d.Monsters.Enemies() { if dist := pather.DistanceFromMe(d, m.Position); dist < 7 && p.mouseOverAttempts > 1 { return fmt.Errorf("monster %d [%s] is too close to item %s [%s]", m.Name, m.Type, p.item.Name, p.item.Quality.ToString()) @@ -77,10 +78,10 @@ func (p *PickupItemStep) Run(d data.Data) error { if i.UnitID == p.item.UnitID { objectX := i.Position.X - 1 objectY := i.Position.Y - 1 - mX, mY := pather.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, objectX, objectY) + mX, mY := container.PathFinder.GameCoordsToScreenCords(d.PlayerUnit.Position.X, d.PlayerUnit.Position.Y, objectX, objectY) if i.IsHovered { - hid.Click(hid.LeftButton, mX, mY) + container.HID.Click(game.LeftButton, mX, mY) if p.waitingForInteraction.IsZero() { p.waitingForInteraction = time.Now() } @@ -89,7 +90,7 @@ func (p *PickupItemStep) Run(d data.Data) error { // Sometimes we got stuck because mouse is hovering a chest and item is in behind, it usually happens a lot // on Andariel, so we open it if p.isChestHovered(d) { - hid.Click(hid.LeftButton, mX, mY) + container.HID.Click(game.LeftButton, mX, mY) } distance := pather.DistanceFromMe(d, i.Position) @@ -99,7 +100,7 @@ func (p *PickupItemStep) Run(d data.Data) error { } x, y := helper.Spiral(p.mouseOverAttempts) - hid.MovePointer(mX+x, mY+y) + container.HID.MovePointer(mX+x, mY+y) p.mouseOverAttempts++ return nil diff --git a/internal/action/step/step.go b/internal/action/step/step.go index 8908f58b6..6af1ce116 100644 --- a/internal/action/step/step.go +++ b/internal/action/step/step.go @@ -1,6 +1,7 @@ package step import ( + "github.com/hectorgimenez/koolo/internal/container" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -14,8 +15,8 @@ const ( type Status string type Step interface { - Status(data.Data) Status - Run(data.Data) error + Status(data.Data, container.Container) Status + Run(data.Data, container.Container) error Reset() LastRun() time.Time } diff --git a/internal/action/step/swap_weapon.go b/internal/action/step/swap_weapon.go index 6b00e3e17..76168e54a 100644 --- a/internal/action/step/swap_weapon.go +++ b/internal/action/step/swap_weapon.go @@ -1,12 +1,11 @@ package step import ( + "github.com/hectorgimenez/koolo/internal/container" "time" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/skill" - "github.com/hectorgimenez/koolo/internal/config" - "github.com/hectorgimenez/koolo/internal/hid" ) type SwapWeaponStep struct { @@ -15,22 +14,22 @@ type SwapWeaponStep struct { wantCTA bool } -func SwapToMainWeapon() *SwapWeaponStep { +func SwapToMainWeapon(swapWeaponKB string) *SwapWeaponStep { return &SwapWeaponStep{ basicStep: newBasicStep(), - binding: config.Config.Bindings.SwapWeapon, + binding: swapWeaponKB, } } -func SwapToCTA() *SwapWeaponStep { +func SwapToCTA(swapWeaponKB string) *SwapWeaponStep { return &SwapWeaponStep{ basicStep: newBasicStep(), - binding: config.Config.Bindings.SwapWeapon, + binding: swapWeaponKB, wantCTA: true, } } -func (s *SwapWeaponStep) Status(d data.Data) Status { +func (s *SwapWeaponStep) Status(d data.Data, _ container.Container) Status { _, found := d.PlayerUnit.Skills[skill.BattleOrders] if (s.wantCTA && found) || (!s.wantCTA && !found) { return s.tryTransitionStatus(StatusCompleted) @@ -39,7 +38,7 @@ func (s *SwapWeaponStep) Status(d data.Data) Status { return s.status } -func (s *SwapWeaponStep) Run(d data.Data) error { +func (s *SwapWeaponStep) Run(d data.Data, container container.Container) error { s.tryTransitionStatus(StatusInProgress) if time.Since(s.lastRun) < time.Second { @@ -53,7 +52,7 @@ func (s *SwapWeaponStep) Run(d data.Data) error { return nil } - hid.PressKey(s.binding) + container.HID.PressKey(s.binding) s.lastRun = time.Now() diff --git a/internal/action/step/sync_action.go b/internal/action/step/sync_action.go index cc622e24f..9b17e6f14 100644 --- a/internal/action/step/sync_action.go +++ b/internal/action/step/sync_action.go @@ -1,6 +1,9 @@ package step -import "github.com/hectorgimenez/d2go/pkg/data" +import ( + "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/koolo/internal/container" +) type SyncActionStep struct { basicStep @@ -23,7 +26,7 @@ func SyncStepWithCheck(action func(data.Data) error, statusChecker func(data.Dat } } -func (s *SyncActionStep) Status(d data.Data) Status { +func (s *SyncActionStep) Status(d data.Data, container container.Container) Status { if s.status == StatusCompleted { return StatusCompleted } @@ -35,7 +38,7 @@ func (s *SyncActionStep) Status(d data.Data) Status { return s.status } -func (s *SyncActionStep) Run(d data.Data) error { +func (s *SyncActionStep) Run(d data.Data, container container.Container) error { if s.statusChecker == nil { s.tryTransitionStatus(StatusCompleted) } diff --git a/internal/action/step/wait.go b/internal/action/step/wait.go index ae85cc93e..426183f23 100644 --- a/internal/action/step/wait.go +++ b/internal/action/step/wait.go @@ -1,6 +1,7 @@ package step import ( + "github.com/hectorgimenez/koolo/internal/container" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -19,7 +20,7 @@ func Wait(duration time.Duration) *WaitStep { } } -func (o *WaitStep) Status(_ data.Data) Status { +func (o *WaitStep) Status(_ data.Data, _ container.Container) Status { if o.status == StatusCompleted { return StatusCompleted } @@ -27,7 +28,7 @@ func (o *WaitStep) Status(_ data.Data) Status { return o.status } -func (o *WaitStep) Run(_ data.Data) error { +func (o *WaitStep) Run(_ data.Data, _ container.Container) error { if o.firstRun.IsZero() { o.firstRun = time.Now() o.tryTransitionStatus(StatusInProgress) diff --git a/internal/action/tp_actions.go b/internal/action/tp_actions.go index eb9d2ee72..c345a7c3a 100644 --- a/internal/action/tp_actions.go +++ b/internal/action/tp_actions.go @@ -15,7 +15,7 @@ func (b *Builder) ReturnTown() *StepChainAction { } return []step.Step{ - step.OpenPortal(), + step.OpenPortal(b.CharacterCfg.Bindings.TP), step.InteractObject(object.TownPortal, func(d data.Data) bool { return d.PlayerUnit.Area.IsTown() }), diff --git a/internal/action/vendor.go b/internal/action/vendor.go index 7e11cbae9..0971a6639 100644 --- a/internal/action/vendor.go +++ b/internal/action/vendor.go @@ -17,7 +17,7 @@ func (b *Builder) VendorRefill(forceRefill, sellJunk bool) *Chain { return nil } - b.logger.Info("Visiting vendor...", slog.Bool("forceRefill", forceRefill)) + b.Logger.Info("Visiting vendor...", slog.Bool("forceRefill", forceRefill)) openShopStep := step.KeySequence("home", "down", "enter") vendorNPC := town.GetTownByArea(d.PlayerUnit.Area).RefillNPC() @@ -37,7 +37,7 @@ func (b *Builder) VendorRefill(forceRefill, sellJunk bool) *Chain { openShopStep, step.Wait(time.Second), step.SyncStep(func(d data.Data) error { - switchTab(4) + b.switchTab(4) b.sm.BuyConsumables(d, forceRefill) return nil }), @@ -67,12 +67,12 @@ func (b *Builder) BuyAtVendor(vendor npc.ID, items ...VendorItemRequest) *Chain step.Wait(time.Second), step.SyncStep(func(d data.Data) error { for _, i := range items { - switchTab(i.Tab) + b.switchTab(i.Tab) itm, found := d.Items.Find(i.Item, item.LocationVendor) if found { b.sm.BuyItem(itm, i.Quantity) } else { - b.logger.Warn("Item not found in vendor", slog.String("Item", string(i.Item))) + b.Logger.Warn("Item not found in vendor", slog.String("Item", string(i.Item))) } } @@ -92,7 +92,7 @@ type VendorItemRequest struct { func (b *Builder) shouldVisitVendor(d data.Data) bool { // Check if we should sell junk - if len(town.ItemsToBeSold(d)) > 0 { + if len(town.ItemsToBeSold(b.CharacterCfg.Inventory.InventoryLock, d)) > 0 { return true } diff --git a/internal/action/waypoint.go b/internal/action/waypoint.go index 94f435a25..eefc14881 100644 --- a/internal/action/waypoint.go +++ b/internal/action/waypoint.go @@ -4,8 +4,8 @@ import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/koolo/internal/action/step" + hid2 "github.com/hectorgimenez/koolo/internal/game" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "log/slog" "slices" ) @@ -47,7 +47,7 @@ func (b *Builder) openWPAndSelectTab(a area.Area, d data.Data) Action { step.SyncStep(func(d data.Data) error { actTabX := wpTabStartX + (wpCoords.Tab-1)*wpTabSizeX + (wpTabSizeX / 2) - hid.Click(hid.LeftButton, actTabX, wpTabStartY) + b.HID.Click(hid2.LeftButton, actTabX, wpTabStartY) helper.Sleep(200) return nil @@ -80,7 +80,7 @@ func (b *Builder) useWP(a area.Area) *Chain { return []step.Step{ step.SyncStep(func(d data.Data) error { areaBtnY := wpListStartY + (currentWP.Row-1)*wpAreaBtnHeight + (wpAreaBtnHeight / 2) - hid.Click(hid.LeftButton, wpListPositionX, areaBtnY) + b.HID.Click(hid2.LeftButton, wpListPositionX, areaBtnY) helper.Sleep(1000) return nil @@ -96,7 +96,7 @@ func (b *Builder) useWP(a area.Area) *Chain { traverseAreas = append(traverseAreas, finalDestination) // Next keep traversing all the areas from the previous available waypoint until we reach the destination, trying to discover WPs during the way - b.logger.Info("Traversing areas to reach destination", slog.Any("areas", traverseAreas)) + b.Logger.Info("Traversing areas to reach destination", slog.Any("areas", traverseAreas)) for i, dst := range traverseAreas { if !dst.IsTown() { diff --git a/internal/action/waypoint_discover.go b/internal/action/waypoint_discover.go index fe3355e14..32d92b93f 100644 --- a/internal/action/waypoint_discover.go +++ b/internal/action/waypoint_discover.go @@ -4,13 +4,12 @@ import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "log/slog" ) func (b *Builder) DiscoverWaypoint() *Chain { return NewChain(func(d data.Data) []Action { - b.logger.Info("Trying to autodiscover Waypoint for current area", slog.Any("area", d.PlayerUnit.Area)) + b.Logger.Info("Trying to autodiscover Waypoint for current area", slog.Any("area", d.PlayerUnit.Area)) for _, o := range d.Objects { if o.IsWaypoint() { return []Action{b.InteractObject(o.Name, @@ -18,16 +17,16 @@ func (b *Builder) DiscoverWaypoint() *Chain { return d.OpenMenus.Waypoint }, step.SyncStep(func(d data.Data) error { - b.logger.Info("Waypoint discovered", slog.Any("area", d.PlayerUnit.Area)) + b.Logger.Info("Waypoint discovered", slog.Any("area", d.PlayerUnit.Area)) helper.Sleep(500) - hid.PressKey("esc") + b.HID.PressKey("esc") return nil }), )} } } - b.logger.Info("Waypoint not found :(", slog.Any("area", d.PlayerUnit.Area)) + b.Logger.Info("Waypoint not found :(", slog.Any("area", d.PlayerUnit.Area)) return nil }) } diff --git a/internal/bot.go b/internal/bot.go index 5bbd478ec..45cdaddc8 100644 --- a/internal/bot.go +++ b/internal/bot.go @@ -4,39 +4,44 @@ import ( "context" "errors" "fmt" + "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/container" "log/slog" "time" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/event" - "github.com/hectorgimenez/koolo/internal/event/stat" "github.com/hectorgimenez/koolo/internal/health" - "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/run" ) // Bot will be in charge of running the run loop: create games, traveling, killing bosses, repairing, picking... type Bot struct { - logger *slog.Logger - hm health.Manager - ab *action.Builder - gr *reader.GameReader - paused bool + logger *slog.Logger + hm health.Manager + ab *action.Builder + container container.Container + eventChan chan<- event.Event + paused bool + supervisorName string } func NewBot( logger *slog.Logger, hm health.Manager, ab *action.Builder, - gr *reader.GameReader, + container container.Container, + supervisorName string, + eventChan chan<- event.Event, ) *Bot { return &Bot{ - logger: logger, - hm: hm, - ab: ab, - gr: gr, + logger: logger, + hm: hm, + ab: ab, + container: container, + supervisorName: supervisorName, + eventChan: eventChan, } } @@ -51,7 +56,7 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) (err error loadingScreensDetected := 0 for k, r := range runs { - stat.StartRun(r.Name()) + b.eventChan <- event.RunStarted(event.Text("Starting run"), r.Name()) runStart := time.Now() b.logger.Info(fmt.Sprintf("Running: %s", r.Name())) @@ -78,7 +83,7 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) (err error time.Sleep(time.Millisecond*10 - time.Since(loopTime)) } - d := b.gr.GetData(false) + d := b.container.Reader.GetData(false) // Skip running stuff if loading screen is present if d.OpenMenus.LoadingScreen { @@ -106,18 +111,18 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) (err error } // TODO: Maybe add some kind of "on every iteration action", something that can be executed/skipped on every iteration - if b.ab.IsRebuffRequired(d) && (buffAct == nil || buffAct.Steps == nil || buffAct.Steps[len(buffAct.Steps)-1].Status(d) == step.StatusCompleted) { + if b.ab.IsRebuffRequired(d) && (buffAct == nil || buffAct.Steps == nil || buffAct.Steps[len(buffAct.Steps)-1].Status(d, b.container) == step.StatusCompleted) { buffAct = b.ab.BuffIfRequired(d) actions = append([]action.Action{buffAct}, actions...) } for k, act := range actions { - err := act.NextStep(b.logger, d) + err := act.NextStep(d, b.container) loopTime = time.Now() if errors.Is(err, action.ErrNoMoreSteps) { if len(actions)-1 == k { b.logger.Info(fmt.Sprintf("Run %s finished, length: %0.2fs", r.Name(), time.Since(runStart).Seconds())) - stat.FinishCurrentRun(event.Kill) + b.eventChan <- event.RunFinished(event.Text("Finished run"), r.Name(), event.FinishedOK) running = false } continue @@ -127,7 +132,7 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) (err error break } if errors.Is(err, action.ErrCanBeSkipped) { - event.Events <- event.WithScreenshot(fmt.Sprintf("error occurred on action that can be skipped, game will continue: %s", err.Error())) + b.eventChan <- event.RunFinished(event.WithScreenshot(err.Error(), b.container.Reader.Screenshot()), r.Name(), event.FinishedError) b.logger.Warn("error occurred on action that can be skipped, game will continue", slog.Any("error", err)) act.Skip() break @@ -137,7 +142,6 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) (err error break } if err != nil { - stat.FinishCurrentRun(event.Error) return err } break @@ -150,7 +154,7 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) (err error } func (b *Bot) maxGameLengthExceeded(startedAt time.Time) error { - if time.Since(startedAt).Seconds() > float64(config.Config.MaxGameLength) { + if time.Since(startedAt).Seconds() > float64(config.Characters[b.supervisorName].MaxGameLength) { return fmt.Errorf( "max game length reached, try to exit game: %0.2f", time.Since(startedAt).Seconds(), @@ -161,7 +165,7 @@ func (b *Bot) maxGameLengthExceeded(startedAt time.Time) error { } func (b *Bot) postRunActions(currentRun int, runs []run.Run) []action.Action { - if config.Config.Companion.Enabled && !config.Config.Companion.Leader { + if config.Characters[b.supervisorName].Companion.Enabled && !config.Characters[b.supervisorName].Companion.Leader { return []action.Action{} } @@ -172,7 +176,7 @@ func (b *Bot) postRunActions(currentRun int, runs []run.Run) []action.Action { // Don't return town on last run if currentRun != len(runs)-1 { - if config.Config.Game.ClearTPArea { + if config.Characters[b.supervisorName].Game.ClearTPArea { actions = append(actions, b.ab.ClearAreaAroundPlayer(5)) actions = append(actions, b.ab.ItemPickup(false, -1)) } diff --git a/internal/character/blizzard_sorceress.go b/internal/character/blizzard_sorceress.go index 885d2adbb..0c44f6944 100644 --- a/internal/character/blizzard_sorceress.go +++ b/internal/character/blizzard_sorceress.go @@ -9,7 +9,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -63,7 +62,7 @@ func (s BlizzardSorceress) KillMonsterSequence( for _, m := range d.Monsters.Enemies() { if d := pather.DistanceFromMe(d, m.Position); d < 4 { s.logger.Debug("Monster detected close to the player, casting Blizzard over it") - steps = append(steps, step.SecondaryAttack(config.Config.Bindings.Sorceress.Blizzard, m.UnitID, 1, opts...)) + steps = append(steps, step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.Blizzard, m.UnitID, 1, opts...)) break } } @@ -78,8 +77,8 @@ func (s BlizzardSorceress) KillMonsterSequence( } steps = append(steps, - step.SecondaryAttack(config.Config.Bindings.Sorceress.Blizzard, id, 1, opts...), - step.PrimaryAttack(id, 4, opts...), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.Blizzard, id, 1, opts...), + step.PrimaryAttack(s.container.CharacterCfg, id, 4, opts...), ) completedAttackLoops++ previousUnitID = int(id) @@ -90,7 +89,7 @@ func (s BlizzardSorceress) KillMonsterSequence( func (s BlizzardSorceress) BuffSkills() map[skill.ID]string { return map[skill.ID]string{ - skill.FrozenArmor: config.Config.Bindings.Sorceress.FrozenArmor, + skill.FrozenArmor: s.container.CharacterCfg.Bindings.Sorceress.FrozenArmor, } } @@ -155,7 +154,7 @@ func (s BlizzardSorceress) KillDiablo() action.Action { return []action.Action{ action.NewStepChain(func(d data.Data) []step.Step { return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, diablo.UnitID, 5, step.Distance(3, 8)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, diablo.UnitID, 5, step.Distance(3, 8)), } }), s.killMonster(npc.Diablo, data.MonsterTypeNone), @@ -169,7 +168,7 @@ func (s BlizzardSorceress) KillIzual() action.Action { action.NewStepChain(func(d data.Data) []step.Step { m, _ := d.Monsters.FindOne(npc.Izual, data.MonsterTypeNone) return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, m.UnitID, 7, step.Distance(5, 8)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, m.UnitID, 7, step.Distance(5, 8)), } }), // We will need a lot of cycles to kill him probably @@ -190,7 +189,7 @@ func (s BlizzardSorceress) KillBaal() action.Action { action.NewStepChain(func(d data.Data) []step.Step { m, _ := d.Monsters.FindOne(npc.BaalCrab, data.MonsterTypeNone) return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, m.UnitID, 5, step.Distance(5, 8)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, m.UnitID, 5, step.Distance(5, 8)), } }), // We will need a lot of cycles to kill him probably diff --git a/internal/character/character.go b/internal/character/character.go index a6861f62f..c7cee2536 100644 --- a/internal/character/character.go +++ b/internal/character/character.go @@ -2,22 +2,23 @@ package character import ( "fmt" + "github.com/hectorgimenez/koolo/internal/container" "log/slog" "strings" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" - "github.com/hectorgimenez/koolo/internal/config" ) -func BuildCharacter(logger *slog.Logger) (action.Character, error) { +func BuildCharacter(logger *slog.Logger, container container.Container) (action.Character, error) { bc := BaseCharacter{ - logger: logger, + logger: logger, + container: container, } - if config.Config.Game.Runs[0] == "leveling" { - switch strings.ToLower(config.Config.Character.Class) { + if container.CharacterCfg.Game.Runs[0] == "leveling" { + switch strings.ToLower(container.CharacterCfg.Character.Class) { case "sorceress": return SorceressLeveling{BaseCharacter: bc}, nil case "paladin": @@ -27,7 +28,7 @@ func BuildCharacter(logger *slog.Logger) (action.Character, error) { return nil, fmt.Errorf("leveling only available for sorceress and paladin") } - switch strings.ToLower(config.Config.Character.Class) { + switch strings.ToLower(container.CharacterCfg.Character.Class) { case "sorceress": return BlizzardSorceress{BaseCharacter: bc}, nil case "lightning": @@ -36,11 +37,12 @@ func BuildCharacter(logger *slog.Logger) (action.Character, error) { return Hammerdin{BaseCharacter: bc}, nil } - return nil, fmt.Errorf("class %s not implemented", config.Config.Character.Class) + return nil, fmt.Errorf("class %s not implemented", container.CharacterCfg.Character.Class) } type BaseCharacter struct { - logger *slog.Logger + logger *slog.Logger + container container.Container } func (bc BaseCharacter) preBattleChecks(d data.Data, id data.UnitID, skipOnImmunities []stat.Resist) bool { diff --git a/internal/character/hammerdin.go b/internal/character/hammerdin.go index f5efa25d3..0e185e6d7 100644 --- a/internal/character/hammerdin.go +++ b/internal/character/hammerdin.go @@ -10,7 +10,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/helper" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -55,7 +54,7 @@ func (s Hammerdin) KillMonsterSequence( step.SyncStep(func(d data.Data) error { monster, f := d.Monsters.FindByID(id) if f && monster.Stats[stat.Life] > 0 { - pather.RandomMovement() + s.container.PathFinder.RandomMovement() } return nil }), @@ -63,10 +62,11 @@ func (s Hammerdin) KillMonsterSequence( } steps = append(steps, step.PrimaryAttack( + s.container.CharacterCfg, id, 8, step.Distance(2, 8), - step.EnsureAura(config.Config.Bindings.Paladin.Concentration), + step.EnsureAura(s.container.CharacterCfg.Bindings.Paladin.Concentration), ), ) completedAttackLoops++ @@ -78,7 +78,7 @@ func (s Hammerdin) KillMonsterSequence( func (s Hammerdin) BuffSkills() map[skill.ID]string { return map[skill.ID]string{ - skill.HolyShield: config.Config.Bindings.Paladin.HolyShield, + skill.HolyShield: s.container.CharacterCfg.Bindings.Paladin.HolyShield, } } @@ -174,10 +174,11 @@ func (s Hammerdin) KillCouncil() action.Action { for range hammerdinMaxAttacksLoop { steps = append(steps, step.PrimaryAttack( + s.container.CharacterCfg, m.UnitID, 8, step.Distance(2, 8), - step.EnsureAura(config.Config.Bindings.Paladin.Concentration), + step.EnsureAura(s.container.CharacterCfg.Bindings.Paladin.Concentration), ), ) } @@ -201,10 +202,11 @@ func (s Hammerdin) killMonster(npc npc.ID, t data.MonsterType) action.Action { for range hammerdinMaxAttacksLoop { steps = append(steps, step.PrimaryAttack( + s.container.CharacterCfg, m.UnitID, 8, step.Distance(2, 8), - step.EnsureAura(config.Config.Bindings.Paladin.Concentration), + step.EnsureAura(s.container.CharacterCfg.Bindings.Paladin.Concentration), ), ) } diff --git a/internal/character/lightning_sorceress.go b/internal/character/lightning_sorceress.go index 1d9b8466a..61360b871 100644 --- a/internal/character/lightning_sorceress.go +++ b/internal/character/lightning_sorceress.go @@ -9,7 +9,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -56,7 +55,7 @@ func (s LightningSorceress) KillMonsterSequence( for _, m := range d.Monsters.Enemies() { if d := pather.DistanceFromMe(d, m.Position); d < 5 { s.logger.Debug("Monster detected close to the player, casting Nova over it") - steps = append(steps, step.SecondaryAttack(config.Config.Bindings.Sorceress.Nova, 0, 3, opts...)) + steps = append(steps, step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.Nova, 0, 3, opts...)) break } } @@ -70,7 +69,7 @@ func (s LightningSorceress) KillMonsterSequence( } steps = append(steps, - step.SecondaryAttack(config.Config.Bindings.Sorceress.Nova, id, 5, opts...), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.Nova, id, 5, opts...), ) completedAttackLoops++ previousUnitID = int(id) @@ -81,8 +80,8 @@ func (s LightningSorceress) KillMonsterSequence( func (s LightningSorceress) BuffSkills() map[skill.ID]string { return map[skill.ID]string{ - skill.FrozenArmor: config.Config.Bindings.Sorceress.FrozenArmor, - skill.EnergyShield: config.Config.Bindings.Sorceress.EnergyShield, + skill.FrozenArmor: s.container.CharacterCfg.Bindings.Sorceress.FrozenArmor, + skill.EnergyShield: s.container.CharacterCfg.Bindings.Sorceress.EnergyShield, } } @@ -147,7 +146,7 @@ func (s LightningSorceress) KillDiablo() action.Action { return []action.Action{ action.NewStepChain(func(d data.Data) []step.Step { return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, diablo.UnitID, 5, step.Distance(3, 8)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, diablo.UnitID, 5, step.Distance(3, 8)), } }), s.killMonster(npc.Diablo, data.MonsterTypeNone), @@ -161,7 +160,7 @@ func (s LightningSorceress) KillIzual() action.Action { action.NewStepChain(func(d data.Data) []step.Step { m, _ := d.Monsters.FindOne(npc.Izual, data.MonsterTypeNone) return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, m.UnitID, 7, step.Distance(5, 8)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, m.UnitID, 7, step.Distance(5, 8)), } }), // We will need a lot of cycles to kill him probably @@ -182,7 +181,7 @@ func (s LightningSorceress) KillBaal() action.Action { action.NewStepChain(func(d data.Data) []step.Step { m, _ := d.Monsters.FindOne(npc.BaalCrab, data.MonsterTypeNone) return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, m.UnitID, 5, step.Distance(5, 8)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, m.UnitID, 5, step.Distance(5, 8)), } }), // We will need a lot of cycles to kill him probably diff --git a/internal/character/paladin_leveling.go b/internal/character/paladin_leveling.go index 5415619ee..dbbcc1a73 100644 --- a/internal/character/paladin_leveling.go +++ b/internal/character/paladin_leveling.go @@ -11,7 +11,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -21,7 +20,7 @@ type PaladinLeveling struct { func (p PaladinLeveling) BuffSkills() map[skill.ID]string { return map[skill.ID]string{ - skill.HolyShield: config.Config.Bindings.Paladin.HolyShield, + skill.HolyShield: p.container.CharacterCfg.Bindings.Paladin.HolyShield, } } @@ -167,13 +166,13 @@ func (p PaladinLeveling) KillMonsterSequence(monsterSelector func(d data.Data) ( if previousUnitID == id { steps = append(steps, step.SyncStep(func(_ data.Data) error { - pather.RandomMovement() + p.container.PathFinder.RandomMovement() return nil }), ) } steps = append(steps, - step.PrimaryAttack(id, numOfAttacks, step.Distance(2, 7), step.EnsureAura(config.Config.Bindings.Paladin.Concentration)), + step.PrimaryAttack(p.container.CharacterCfg, id, numOfAttacks, step.Distance(2, 7), step.EnsureAura(p.container.CharacterCfg.Bindings.Paladin.Concentration)), ) } else { if d.PlayerUnit.Skills[skill.Zeal].Level > 0 { @@ -181,7 +180,7 @@ func (p PaladinLeveling) KillMonsterSequence(monsterSelector func(d data.Data) ( } steps = append(steps, - step.PrimaryAttack(id, numOfAttacks, step.Distance(1, 3), step.EnsureAura(config.Config.Bindings.Paladin.Concentration)), + step.PrimaryAttack(p.container.CharacterCfg, id, numOfAttacks, step.Distance(1, 3), step.EnsureAura(p.container.CharacterCfg.Bindings.Paladin.Concentration)), ) } @@ -348,8 +347,8 @@ func (p PaladinLeveling) SkillPoints(d data.Data) []skill.ID { func (p PaladinLeveling) GetKeyBindings(d data.Data) map[skill.ID]string { skillBindings := map[skill.ID]string{ - skill.Vigor: config.Config.Bindings.Paladin.Vigor, - skill.HolyShield: config.Config.Bindings.Paladin.HolyShield, + skill.Vigor: p.container.CharacterCfg.Bindings.Paladin.Vigor, + skill.HolyShield: p.container.CharacterCfg.Bindings.Paladin.HolyShield, } if d.PlayerUnit.Skills[skill.BlessedHammer].Level > 0 && d.PlayerUnit.Stats[stat.Level] >= 18 { @@ -359,12 +358,12 @@ func (p PaladinLeveling) GetKeyBindings(d data.Data) map[skill.ID]string { } if d.PlayerUnit.Skills[skill.Concentration].Level > 0 && d.PlayerUnit.Stats[stat.Level] >= 18 { - skillBindings[skill.Concentration] = config.Config.Bindings.Paladin.Concentration + skillBindings[skill.Concentration] = p.container.CharacterCfg.Bindings.Paladin.Concentration } else { if _, found := d.PlayerUnit.Skills[skill.HolyFire]; found { - skillBindings[skill.HolyFire] = config.Config.Bindings.Paladin.Concentration + skillBindings[skill.HolyFire] = p.container.CharacterCfg.Bindings.Paladin.Concentration } else if _, found := d.PlayerUnit.Skills[skill.Might]; found { - skillBindings[skill.Might] = config.Config.Bindings.Paladin.Concentration + skillBindings[skill.Might] = p.container.CharacterCfg.Bindings.Paladin.Concentration } } diff --git a/internal/character/sorceress_leveling.go b/internal/character/sorceress_leveling.go index 6ec673852..c4d01c0a3 100644 --- a/internal/character/sorceress_leveling.go +++ b/internal/character/sorceress_leveling.go @@ -11,7 +11,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -29,19 +28,19 @@ func (s SorceressLeveling) ShouldResetSkills(d data.Data) bool { func (s SorceressLeveling) GetKeyBindings(d data.Data) map[skill.ID]string { skillBindings := map[skill.ID]string{ - skill.FrozenArmor: config.Config.Bindings.Sorceress.FrozenArmor, - skill.StaticField: config.Config.Bindings.Sorceress.StaticField, - skill.Teleport: config.Config.Bindings.Teleport, - skill.TomeOfTownPortal: config.Config.Bindings.TP, + skill.FrozenArmor: s.container.CharacterCfg.Bindings.Sorceress.FrozenArmor, + skill.StaticField: s.container.CharacterCfg.Bindings.Sorceress.StaticField, + skill.Teleport: s.container.CharacterCfg.Bindings.Teleport, + skill.TomeOfTownPortal: s.container.CharacterCfg.Bindings.TP, } if d.PlayerUnit.Skills[skill.Blizzard].Level > 0 { - skillBindings[skill.Blizzard] = config.Config.Bindings.Sorceress.Blizzard + skillBindings[skill.Blizzard] = s.container.CharacterCfg.Bindings.Sorceress.Blizzard skillBindings[skill.GlacialSpike] = "" } else if d.PlayerUnit.Skills[skill.FireBall].Level > 0 { - skillBindings[skill.FireBall] = config.Config.Bindings.Sorceress.FireBall + skillBindings[skill.FireBall] = s.container.CharacterCfg.Bindings.Sorceress.FireBall } else if d.PlayerUnit.Skills[skill.FireBolt].Level > 0 { - skillBindings[skill.FireBolt] = config.Config.Bindings.Sorceress.FireBall + skillBindings[skill.FireBolt] = s.container.CharacterCfg.Bindings.Sorceress.FireBall } return skillBindings @@ -205,8 +204,8 @@ func (s SorceressLeveling) KillAndariel() action.Action { action.NewStepChain(func(d data.Data) []step.Step { m, _ := d.Monsters.FindOne(npc.Andariel, data.MonsterTypeNone) return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.Blizzard, m.UnitID, 1, step.Distance(25, 30)), - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, m.UnitID, s.staticFieldCasts(), step.Distance(3, 5)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.Blizzard, m.UnitID, 1, step.Distance(25, 30)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, m.UnitID, s.staticFieldCasts(), step.Distance(3, 5)), } }), s.killMonster(npc.Andariel, data.MonsterTypeNone), @@ -224,7 +223,7 @@ func (s SorceressLeveling) KillDuriel() action.Action { action.NewStepChain(func(d data.Data) []step.Step { m, _ := d.Monsters.FindOne(npc.Duriel, data.MonsterTypeNone) return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, m.UnitID, s.staticFieldCasts(), step.Distance(1, 5)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, m.UnitID, s.staticFieldCasts(), step.Distance(1, 5)), } }), s.killMonster(npc.Duriel, data.MonsterTypeNone), @@ -246,7 +245,7 @@ func (s SorceressLeveling) KillMephisto() action.Action { // step.Wait(time.Second * 3), // step.MoveTo(moatTrickPosition), // step.Wait(time.Second * 3), - // step.SecondaryAttack(config.Config.Bindings.Sorceress.Blizzard, mephisto.UnitID, 3), + // step.SecondaryAttack(s.container.CharacterCfg.Bindings.Sorceress.Blizzard, mephisto.UnitID, 3), // } // }), // } @@ -257,7 +256,7 @@ func (s SorceressLeveling) KillMephisto() action.Action { action.NewStepChain(func(d data.Data) []step.Step { mephisto, _ := d.Monsters.FindOne(npc.Mephisto, data.MonsterTypeNone) return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, mephisto.UnitID, s.staticFieldCasts(), step.Distance(1, 5)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, mephisto.UnitID, s.staticFieldCasts(), step.Distance(1, 5)), } }), s.killMonster(npc.Mephisto, data.MonsterTypeNone), @@ -331,7 +330,7 @@ func (s SorceressLeveling) KillDiablo() action.Action { return []action.Action{ action.NewStepChain(func(d data.Data) []step.Step { return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, diablo.UnitID, s.staticFieldCasts(), step.Distance(1, 5)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, diablo.UnitID, s.staticFieldCasts(), step.Distance(1, 5)), } }), s.killMonster(npc.Diablo, data.MonsterTypeNone), @@ -345,7 +344,7 @@ func (s SorceressLeveling) KillIzual() action.Action { action.NewStepChain(func(d data.Data) []step.Step { monster, _ := d.Monsters.FindOne(npc.Izual, data.MonsterTypeNone) return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, monster.UnitID, s.staticFieldCasts(), step.Distance(1, 4)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, monster.UnitID, s.staticFieldCasts(), step.Distance(1, 4)), } }), // We will need a lot of cycles to kill him probably @@ -366,7 +365,7 @@ func (s SorceressLeveling) KillBaal() action.Action { action.NewStepChain(func(d data.Data) []step.Step { baal, _ := d.Monsters.FindOne(npc.BaalCrab, data.MonsterTypeNone) return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, baal.UnitID, s.staticFieldCasts(), step.Distance(1, 4)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, baal.UnitID, s.staticFieldCasts(), step.Distance(1, 4)), } }), // We will need a lot of cycles to kill him probably @@ -385,8 +384,8 @@ func (s SorceressLeveling) KillAncients() action.Action { action.NewStepChain(func(d data.Data) []step.Step { m, _ := d.Monsters.FindOne(m.Name, data.MonsterTypeSuperUnique) return []step.Step{ - step.SecondaryAttack(config.Config.Bindings.Sorceress.StaticField, m.UnitID, s.staticFieldCasts(), step.Distance(8, 10)), - step.MoveTo(data.Position{ + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, m.UnitID, s.staticFieldCasts(), step.Distance(8, 10)), + step.MoveTo(s.container.CharacterCfg, data.Position{ X: 10062, Y: 12639, }), @@ -428,25 +427,25 @@ func (s SorceressLeveling) KillMonsterSequence(monsterSelector func(d data.Data) // During early game stages amount of mana is ridiculous... if d.PlayerUnit.MPPercent() < 15 && d.PlayerUnit.Stats[stat.Level] < 15 { - steps = append(steps, step.PrimaryAttack(id, 1, step.Distance(1, 3))) + steps = append(steps, step.PrimaryAttack(s.container.CharacterCfg, id, 1, step.Distance(1, 3))) } else { if _, found := d.PlayerUnit.Skills[skill.Blizzard]; found { if completedAttackLoops%2 == 0 { for _, m := range d.Monsters.Enemies() { if d := pather.DistanceFromMe(d, m.Position); d < 4 { s.logger.Debug("Monster detected close to the player, casting Blizzard over it") - steps = append(steps, step.SecondaryAttack(config.Config.Bindings.Sorceress.Blizzard, m.UnitID, 1, step.Distance(25, 30))) + steps = append(steps, step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.Blizzard, m.UnitID, 1, step.Distance(25, 30))) break } } } steps = append(steps, - step.SecondaryAttack(config.Config.Bindings.Sorceress.Blizzard, id, 1, step.Distance(25, 30)), - step.PrimaryAttack(id, 3, step.Distance(25, 30)), + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.Blizzard, id, 1, step.Distance(25, 30)), + step.PrimaryAttack(s.container.CharacterCfg, id, 3, step.Distance(25, 30)), ) } else { - steps = append(steps, step.SecondaryAttack(config.Config.Bindings.Sorceress.FireBall, id, 4, step.Distance(1, 25))) + steps = append(steps, step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.FireBall, id, 4, step.Distance(1, 25))) } } @@ -470,12 +469,12 @@ func (s SorceressLeveling) killMonster(npc npc.ID, t data.MonsterType) action.Ac func (s SorceressLeveling) BuffSkills() map[skill.ID]string { return map[skill.ID]string{ - skill.FrozenArmor: config.Config.Bindings.Sorceress.FrozenArmor, + skill.FrozenArmor: s.container.CharacterCfg.Bindings.Sorceress.FrozenArmor, } } func (s SorceressLeveling) staticFieldCasts() int { - switch config.Config.Game.Difficulty { + switch s.container.CharacterCfg.Game.Difficulty { case difficulty.Normal: return 8 } diff --git a/internal/companion_supervisor.go b/internal/companion_supervisor.go index 4dabaa264..cbd7df32e 100644 --- a/internal/companion_supervisor.go +++ b/internal/companion_supervisor.go @@ -4,13 +4,12 @@ import ( "context" "errors" "fmt" - "log/slog" + "github.com/hectorgimenez/koolo/internal/container" "time" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/event" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/run" ) @@ -24,7 +23,7 @@ type CompanionGameData struct { } type CompanionSupervisor struct { - baseSupervisor + *baseSupervisor companionCh chan CompanionGameData } @@ -32,69 +31,76 @@ func (s *CompanionSupervisor) JoinGame(gameName, password string) { s.companionCh <- CompanionGameData{GameName: gameName, Password: password} } -func NewCompanionSupervisor(logger *slog.Logger, bot *Bot, gr *reader.GameReader, gm *helper.GameManager) *CompanionSupervisor { - return &CompanionSupervisor{ - baseSupervisor: baseSupervisor{ - logger: logger, - bot: bot, - gr: gr, - gm: gm, - }, - companionCh: make(chan CompanionGameData), +func NewCompanionSupervisor(name string, bot *Bot, runFactory *run.Factory, statsHandler *StatsHandler, listener *event.Listener, c container.Container) (*CompanionSupervisor, error) { + bs, err := newBaseSupervisor(bot, runFactory, name, statsHandler, listener, c) + if err != nil { + return nil, err } + + return &CompanionSupervisor{ + baseSupervisor: bs, + companionCh: make(chan CompanionGameData), + }, nil } -// Start will stay running during the application lifecycle, it will orchestrate all the required bot pieces -func (s *CompanionSupervisor) Start(ctx context.Context, factory *run.Factory) error { - err := s.ensureProcessIsRunningAndPrepare() +// Start will return error if it can not be started, otherwise will always return nil +func (s *CompanionSupervisor) Start() error { + ctx, cancel := context.WithCancel(context.Background()) + s.cancelFn = cancel + + err := s.ensureProcessIsRunningAndPrepare(ctx) if err != nil { return fmt.Errorf("error preparing game: %w", err) } gameCounter := 0 firstRun := true - for { - select { - case <-ctx.Done(): - return nil - default: - if config.Config.Companion.Leader { - gameName, err := s.gm.CreateOnlineGame(gameCounter) - gameCounter++ // Sometimes game is created but error during join, so game name will be in use - if err != nil { - s.logger.Error(fmt.Sprintf("Error creating new game: %s", err.Error())) - continue - } + go func() { + for { + select { + case <-ctx.Done(): + return + default: + if config.Characters[s.name].Companion.Leader { + gameName, err := s.c.Manager.CreateOnlineGame(gameCounter) + gameCounter++ // Sometimes game is created but error during join, so game name will be in use + if err != nil { + s.c.Logger.Error(fmt.Sprintf("Error creating new game: %s", err.Error())) + continue + } - event.Events <- event.Text(fmt.Sprintf("New game created. GameName: " + gameName + "|||" + config.Config.Companion.GamePassword)) + s.c.EventChan <- event.GameCreated(event.Text("New game created: %s"), gameName, config.Characters[s.name].Companion.GamePassword) - err = s.startBot(ctx, factory.BuildRuns(), firstRun) - firstRun = false - if err != nil { - return err - } - } else { - for { - s.logger.Debug("Waiting for new game to be created...") - select { - case gd := <-s.companionCh: - err := s.gm.JoinOnlineGame(gd.GameName, gd.Password) - if err != nil { - s.logger.Error(err.Error()) - continue - } + err = s.startBot(ctx, s.runFactory.BuildRuns(), firstRun) + if err != nil { + return + } + firstRun = false + } else { + for { + s.c.Logger.Debug("Waiting for new game to be created...") + select { + case gd := <-s.companionCh: + err := s.c.Manager.JoinOnlineGame(gd.GameName, gd.Password) + if err != nil { + s.c.Logger.Error(err.Error()) + continue + } - runs := factory.BuildRuns() - err = s.startBot(ctx, runs, firstRun) - firstRun = false - if err != nil { - return err + runs := s.runFactory.BuildRuns() + err = s.startBot(ctx, runs, firstRun) + firstRun = false + if err != nil { + return + } } } } } } - } + }() + + return nil } func (s *CompanionSupervisor) startBot(ctx context.Context, runs []run.Run, firstRun bool) error { @@ -106,15 +112,14 @@ func (s *CompanionSupervisor) startBot(ctx context.Context, runs []run.Run, firs return nil } errorMsg := fmt.Sprintf("Game finished with errors, reason: %s. Game total time: %0.2fs", err.Error(), time.Since(gameStart).Seconds()) - event.Events <- event.WithScreenshot(errorMsg) - s.logger.Warn(errorMsg) + s.c.EventChan <- event.GameFinished(event.WithScreenshot(errorMsg, s.c.Reader.Screenshot()), event.FinishedError) + s.c.Logger.Warn(errorMsg) } - if exitErr := s.gm.ExitGame(); exitErr != nil { + if exitErr := s.c.Manager.ExitGame(); exitErr != nil { return fmt.Errorf("error exiting game: %s", exitErr) } firstRun = false - s.updateGameStats() helper.Sleep(5000) return nil diff --git a/internal/config/config.go b/internal/config/config.go index 5371310e0..1589d3a6d 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -1,31 +1,36 @@ package config import ( + "errors" "fmt" + "github.com/hectorgimenez/d2go/pkg/data/area" + "github.com/hectorgimenez/d2go/pkg/data/difficulty" + "github.com/hectorgimenez/d2go/pkg/data/item" + "github.com/hectorgimenez/d2go/pkg/data/stat" + cp "github.com/otiai10/copy" "os" + "strings" "time" - "github.com/hectorgimenez/d2go/pkg/data/area" - "github.com/hectorgimenez/d2go/pkg/data/item" "github.com/hectorgimenez/d2go/pkg/nip" - "github.com/hectorgimenez/d2go/pkg/data/difficulty" - "github.com/hectorgimenez/d2go/pkg/data/stat" "gopkg.in/yaml.v3" ) var ( - Config *StructConfig + Koolo *KooloCfg + Characters map[string]*CharacterCfg ) -type StructConfig struct { - Debug struct { +type KooloCfg struct { + FirstRun bool `yaml:"firstRun"` + Debug struct { Log bool `yaml:"log"` RenderMap bool `yaml:"renderMap"` } `yaml:"debug"` LogSaveDirectory string `yaml:"logSaveDirectory"` - MaxGameLength int `yaml:"maxGameLength"` D2LoDPath string `yaml:"D2LoDPath"` + D2RPath string `yaml:"D2RPath"` Discord struct { Enabled bool `yaml:"enabled"` ChannelID string `yaml:"channelId"` @@ -36,7 +41,14 @@ type StructConfig struct { ChatID int64 `yaml:"chatId"` Token string `yaml:"token"` } - Health struct { +} + +type CharacterCfg struct { + MaxGameLength int `yaml:"maxGameLength"` + Username string `yaml:"username"` + Password string `yaml:"password"` + Realm string `yaml:"realm"` + Health struct { HealingPotionAt int `yaml:"healingPotionAt"` ManaPotionAt int `yaml:"manaPotionAt"` RejuvPotionAtLife int `yaml:"rejuvPotionAtLife"` @@ -142,33 +154,101 @@ type StructConfig struct { // Load reads the config.ini file and returns a Config struct filled with data from the ini file func Load() error { - r, err := os.Open("config/config.yaml") + Characters = make(map[string]*CharacterCfg) + r, err := os.Open("config/koolo.yaml") if err != nil { - return fmt.Errorf("error loading config.yaml: %w", err) + return fmt.Errorf("error loading koolo.yaml: %w", err) } d := yaml.NewDecoder(r) - if err = d.Decode(&Config); err != nil { + if err = d.Decode(&Koolo); err != nil { return fmt.Errorf("error reading config: %w", err) } - rules, err := nip.ReadDir("config/pickit/") + entries, err := os.ReadDir("config") if err != nil { - return err + return fmt.Errorf("error reading config: %w", err) } - if Config.Game.Runs[0] == "leveling" { - levelingRules, err := nip.ReadDir("config/pickit_leveling/") + for _, entry := range entries { + if !entry.IsDir() { + continue + } + + charCfg := CharacterCfg{} + r, err = os.Open("config/" + entry.Name() + "/config.yaml") + if err != nil { + return fmt.Errorf("error loading config.yaml: %w", err) + } + + d := yaml.NewDecoder(r) + if err = d.Decode(&charCfg); err != nil { + return fmt.Errorf("error reading %s character config: %w", entry.Name(), err) + } + + rules, err := nip.ReadDir("config/" + entry.Name() + "/pickit/") if err != nil { return err } - rules = append(rules, levelingRules...) - } - Config.Runtime.Rules = rules + if charCfg.Game.Runs[0] == "leveling" { + levelingRules, err := nip.ReadDir("config/" + entry.Name() + "/pickit_leveling/") + if err != nil { + return err + } + rules = append(rules, levelingRules...) + } - secs := float32(Config.Character.CastingFrames)*0.04 + 0.01 - Config.Runtime.CastDuration = time.Duration(secs*1000) * time.Millisecond + charCfg.Runtime.Rules = rules + + secs := float32(charCfg.Character.CastingFrames)*0.04 + 0.01 + charCfg.Runtime.CastDuration = time.Duration(secs*1000) * time.Millisecond + Characters[entry.Name()] = &charCfg + } return nil } + +func CreateFromTemplate(name string) error { + if name == "" { + return errors.New("name cannot be empty") + } + + if _, err := os.Stat("config/" + name); !os.IsExist(err) { + return errors.New("configuration with that name already exists") + } + + err := cp.Copy("config/template", "config/"+name) + if err != nil { + return fmt.Errorf("error copying template: %w", err) + } + + return Load() +} + +func ValidateAndSaveConfig(config KooloCfg) error { + // Trim executable from the path, just in case + config.D2LoDPath = strings.ReplaceAll(strings.ToLower(config.D2LoDPath), "game.exe", "") + config.D2RPath = strings.ReplaceAll(strings.ToLower(config.D2RPath), "d2r.exe", "") + + // Validate paths + if _, err := os.Stat(config.D2LoDPath + "/d2data.mpq"); os.IsNotExist(err) { + return errors.New("D2LoDPath is not valid") + } + + if _, err := os.Stat(config.D2RPath + "/d2r.exe"); os.IsNotExist(err) { + return errors.New("D2RPath is not valid") + } + + text, err := yaml.Marshal(config) + if err != nil { + return fmt.Errorf("error parsing koolo config: %w", err) + } + + err = os.WriteFile("config/koolo.yaml", text, 0644) + if err != nil { + return fmt.Errorf("error writing koolo config: %w", err) + } + + return Load() +} diff --git a/internal/container/container.go b/internal/container/container.go new file mode 100644 index 000000000..52829f561 --- /dev/null +++ b/internal/container/container.go @@ -0,0 +1,20 @@ +package container + +import ( + "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/event" + "github.com/hectorgimenez/koolo/internal/game" + "github.com/hectorgimenez/koolo/internal/pather" + "log/slog" +) + +type Container struct { + Logger *slog.Logger + Reader *game.MemoryReader + HID *game.HID + Injector *game.MemoryInjector + Manager *game.Manager + PathFinder pather.PathFinder + CharacterCfg *config.CharacterCfg + EventChan chan<- event.Event +} diff --git a/internal/event/event.go b/internal/event/event.go index 1ef78ef01..9b562aff5 100644 --- a/internal/event/event.go +++ b/internal/event/event.go @@ -1,37 +1,134 @@ package event import ( + "github.com/hectorgimenez/d2go/pkg/data" "image" - - "github.com/hectorgimenez/koolo/internal/helper" + "time" ) const ( - Kill Event = "kill" - Death Event = "death" - Chicken Event = "chicken" - MercChicken Event = "merc chicken" - Error Event = "error" + FinishedOK FinishReason = "ok" + FinishedDied FinishReason = "death" + FinishedChicken FinishReason = "chicken" + FinishedMercChicken FinishReason = "merc chicken" + FinishedError FinishReason = "error" ) -type Event string +type FinishReason string + +type Event interface { + Message() string + Image() image.Image + OccurredAt() time.Time +} + +type BaseEvent struct { + message string + image image.Image + occurredAt time.Time +} + +func (b BaseEvent) Message() string { + return b.message +} + +func (b BaseEvent) Image() image.Image { + return b.image +} + +func (b BaseEvent) OccurredAt() time.Time { + return b.occurredAt +} + +func WithScreenshot(message string, img image.Image) BaseEvent { + return BaseEvent{ + message: message, + image: img, + occurredAt: time.Now(), + } +} + +func Text(message string) BaseEvent { + return BaseEvent{ + message: message, + occurredAt: time.Now(), + } +} + +type UsedPotionEvent struct { + BaseEvent + PotionType data.PotionType + OnMerc bool +} + +func UsedPotion(be BaseEvent, pt data.PotionType, onMerc bool) UsedPotionEvent { + return UsedPotionEvent{ + BaseEvent: be, + PotionType: pt, + OnMerc: onMerc, + } +} + +type GameCreatedEvent struct { + BaseEvent + Name string + Password string +} -var Events = make(chan Message, 10) +func GameCreated(be BaseEvent, name string, password string) GameCreatedEvent { + return GameCreatedEvent{ + BaseEvent: be, + Name: name, + Password: password, + } +} -type Message struct { - Message string - Image image.Image +type GameFinishedEvent struct { + BaseEvent + Reason FinishReason } -func WithScreenshot(message string) Message { - return Message{ - Message: message, - Image: helper.Screenshot(), +func GameFinished(be BaseEvent, reason FinishReason) GameFinishedEvent { + return GameFinishedEvent{ + BaseEvent: be, + Reason: reason, } } -func Text(message string) Message { - return Message{ - Message: message, +type RunFinishedEvent struct { + BaseEvent + RunName string + Reason FinishReason +} + +func RunFinished(be BaseEvent, runName string, reason FinishReason) RunFinishedEvent { + return RunFinishedEvent{ + BaseEvent: be, + RunName: runName, + Reason: reason, + } +} + +type ItemStashedEvent struct { + BaseEvent + Item data.Item +} + +func ItemStashed(be BaseEvent, item data.Item) ItemStashedEvent { + return ItemStashedEvent{ + BaseEvent: be, + Item: item, + } +} + +type RunStartedEvent struct { + BaseEvent + RunName string +} + +func RunStarted(be BaseEvent, runName string) RunStartedEvent { + return RunStartedEvent{ + BaseEvent: be, + RunName: runName, } } diff --git a/internal/event/listener.go b/internal/event/listener.go index 9e27e7d2d..fa33fadef 100644 --- a/internal/event/listener.go +++ b/internal/event/listener.go @@ -10,15 +10,19 @@ import ( ) type Listener struct { - handlers []Handler - logger *slog.Logger + handlers []Handler + logger *slog.Logger + characterName string + events <-chan Event } -type Handler func(ctx context.Context, m Message) error +type Handler func(ctx context.Context, e Event) error -func NewListener(logger *slog.Logger) Listener { - return Listener{ - logger: logger, +func NewListener(logger *slog.Logger, characterName string, channel chan Event) *Listener { + return &Listener{ + events: channel, + characterName: characterName, + logger: logger, } } @@ -29,7 +33,7 @@ func (l *Listener) Register(h Handler) { func (l *Listener) Listen(ctx context.Context) error { for { select { - case e := <-Events: + case e := <-l.events: if _, err := os.Stat("screenshots"); os.IsNotExist(err) { err = os.MkdirAll("screenshots", os.ModePerm) if err != nil { @@ -37,9 +41,9 @@ func (l *Listener) Listen(ctx context.Context) error { } } - if e.Image != nil { - fileName := fmt.Sprintf("screenshots/error-%s.jpeg", time.Now().Format("2006-01-02 15_04_05")) - err := helper.SaveImageJPEG(e.Image, fileName) + if e.Image() != nil { + fileName := fmt.Sprintf("screenshots/error-%s-%s.jpeg", l.characterName, time.Now().Format("2006-01-02 15_04_05")) + err := helper.SaveImageJPEG(e.Image(), fileName) if err != nil { l.logger.Error("error saving screenshot", slog.Any("error", err)) } diff --git a/internal/event/stat/game_stats.go b/internal/event/stat/game_stats.go deleted file mode 100644 index 8212107bf..000000000 --- a/internal/event/stat/game_stats.go +++ /dev/null @@ -1,102 +0,0 @@ -package stat - -import ( - "fmt" - "image" - "strings" - "time" - - "github.com/hectorgimenez/d2go/pkg/data" - "github.com/hectorgimenez/koolo/internal/event" -) - -var Status = GameStatus{} - -func StartRun(runName string) { - if Status.RunStats == nil { - Status.RunStats = map[string]*RunStats{} - } - - rs, found := Status.RunStats[runName] - if !found { - rs = &RunStats{} - Status.RunStats[runName] = rs - } - - Status.CurrentRun = runName - Status.CurrentRunStart = time.Now() -} - -func FinishCurrentRun(evt event.Event) { - rs := Status.RunStats[Status.CurrentRun] - switch evt { - case event.Kill: - rs.Kills++ - case event.Death: - rs.Deaths++ - case event.Chicken: - rs.Chickens++ - case event.MercChicken: - rs.MerChicken++ - case event.Error: - rs.Errors++ - } - - runTime := time.Since(Status.CurrentRunStart) - rs.TotalRunsTime += runTime -} - -func UsedPotion(potionType data.PotionType, onMerc bool) { - switch potionType { - case data.HealingPotion: - if onMerc { - Status.RunStats[Status.CurrentRun].MercHealingPotionsUsed++ - } else { - Status.RunStats[Status.CurrentRun].HealingPotionsUsed++ - } - case data.ManaPotion: - Status.RunStats[Status.CurrentRun].ManaPotionsUsed++ - case data.RejuvenationPotion: - if onMerc { - Status.RunStats[Status.CurrentRun].MercRejuvPotionsUsed++ - } else { - Status.RunStats[Status.CurrentRun].RejuvPotionsUsed++ - } - } -} - -func ItemStashed(item data.Item, screenshot image.Image) { - if item.IsPotion() || strings.EqualFold(string(item.Name), "Gold") { - return - } - - Status.RunStats[Status.CurrentRun].ItemsFound = append(Status.RunStats[Status.CurrentRun].ItemsFound, item) - event.Events <- event.Message{ - Message: fmt.Sprintf("Item stashed! %s", item.Name), - Image: screenshot, - } -} - -type GameStatus struct { - ApplicationStartedAt time.Time - TotalGames int - RunStats map[string]*RunStats - - CurrentRun string - CurrentRunStart time.Time -} - -type RunStats struct { - TotalRunsTime time.Duration - Kills int - Deaths int - Chickens int - MerChicken int - Errors int - ItemsFound []data.Item - HealingPotionsUsed int - ManaPotionsUsed int - RejuvPotionsUsed int - MercHealingPotionsUsed int - MercRejuvPotionsUsed int -} diff --git a/internal/game/handle_killer.go b/internal/game/handle_killer.go new file mode 100644 index 000000000..89d7c57d6 --- /dev/null +++ b/internal/game/handle_killer.go @@ -0,0 +1,32 @@ +package game + +import ( + "fmt" + "os/exec" + "strings" +) + +func KillCheckForClientHandles() error { + stdout, err := exec.Command("./tools/handle64.exe", "-accepteula", "-nobanner", "-a", "-v", "-p", "d2r.exe", "Check For Other Instances").Output() + if err != nil && !strings.Contains(string(stdout), "No matching handles found.") { + return fmt.Errorf("error running handle64.exe: %d", stdout) + } + + stdoutLines := strings.Split(string(stdout), "\r\n") + + // Maybe the handle was previously closed, so we don't need to do anything + if len(stdoutLines) > 1 { + for _, line := range stdoutLines { + if strings.Contains(line, "Check For Other Instances") { + cols := strings.Split(line, ",") // 0: process, 1: pid, 2: type, 3: handle, 4: name + + stdout, err = exec.Command("./tools/handle64.exe", "-accepteula", "-nobanner", "-p", fmt.Sprintf("%s", cols[1]), "-c", cols[3], "-y").Output() + if err != nil { + return fmt.Errorf("error running handle64.exe: %d", stdout) + } + } + } + } + + return nil +} diff --git a/internal/game/hid.go b/internal/game/hid.go new file mode 100644 index 000000000..3f6e6d653 --- /dev/null +++ b/internal/game/hid.go @@ -0,0 +1,13 @@ +package game + +type HID struct { + gr *MemoryReader + gi *MemoryInjector +} + +func NewHID(gr *MemoryReader, gi *MemoryInjector) *HID { + return &HID{ + gr: gr, + gi: gi, + } +} diff --git a/internal/hid/keyboard.go b/internal/game/keyboard.go similarity index 72% rename from internal/hid/keyboard.go rename to internal/game/keyboard.go index d651ab2ee..6a21236ad 100644 --- a/internal/hid/keyboard.go +++ b/internal/game/keyboard.go @@ -1,7 +1,6 @@ -package hid +package game import ( - "github.com/hectorgimenez/koolo/internal/memory" "math/rand" "strings" "time" @@ -15,23 +14,23 @@ const ( ) // PressKey toggles a key, it holds the key between keyPressMinTime and keyPressMaxTime ms randomly -func PressKey(key string) { - asciiChar := getASCIICode(key) - win.PostMessage(memory.HWND, win.WM_KEYDOWN, asciiChar, 0) +func (hid *HID) PressKey(key string) { + asciiChar := hid.getASCIICode(key) + win.PostMessage(hid.gr.HWND, win.WM_KEYDOWN, asciiChar, 0) sleepTime := rand.Intn(keyPressMaxTime-keyPressMinTime) + keyPressMinTime time.Sleep(time.Duration(sleepTime) * time.Millisecond) - win.PostMessage(memory.HWND, win.WM_KEYUP, asciiChar, 0) + win.PostMessage(hid.gr.HWND, win.WM_KEYUP, asciiChar, 0) } -func KeyDown(key string) { - win.PostMessage(memory.HWND, win.WM_KEYDOWN, getASCIICode(key), 0) +func (hid *HID) KeyDown(key string) { + win.PostMessage(hid.gr.HWND, win.WM_KEYDOWN, hid.getASCIICode(key), 0) } -func KeyUp(key string) { - win.PostMessage(memory.HWND, win.WM_KEYUP, getASCIICode(key), 0) +func (hid *HID) KeyUp(key string) { + win.PostMessage(hid.gr.HWND, win.WM_KEYUP, hid.getASCIICode(key), 0) } -func getASCIICode(key string) uintptr { +func (hid *HID) getASCIICode(key string) uintptr { if len(key) == 1 { return uintptr(strings.ToUpper(key)[0]) } diff --git a/internal/game/manager.go b/internal/game/manager.go new file mode 100644 index 000000000..d5265cfc5 --- /dev/null +++ b/internal/game/manager.go @@ -0,0 +1,224 @@ +package game + +import ( + "errors" + "fmt" + "github.com/hectorgimenez/d2go/pkg/data/difficulty" + "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/helper" + "github.com/lxn/win" + "golang.org/x/sys/windows" + "os/exec" + "syscall" + "unsafe" +) + +type Manager struct { + gr *MemoryReader + hid *HID + supervisorName string +} + +func NewGameManager(gr *MemoryReader, hid *HID, sueprvisorName string) *Manager { + return &Manager{gr: gr, hid: hid, supervisorName: sueprvisorName} +} + +func (gm *Manager) ExitGame() error { + // First try to exit game as fast as possible, without any check, useful when chickening + gm.hid.PressKey("esc") + gm.hid.Click(LeftButton, gm.gr.GameAreaSizeX/2, int(float64(gm.gr.GameAreaSizeY)/2.2)) + + for range 5 { + if !gm.gr.InGame() { + return nil + } + helper.Sleep(1000) + } + + // If we are still in game, probably character is dead, so let's do it nicely. + // Probably closing the socket is more reliable, but was not working properly for me on singleplayer. + for range 10 { + if gm.gr.GetData(false).OpenMenus.QuitMenu { + gm.hid.Click(LeftButton, gm.gr.GameAreaSizeX/2, int(float64(gm.gr.GameAreaSizeY)/2.2)) + + for range 5 { + if !gm.gr.InGame() { + return nil + } + helper.Sleep(1000) + } + } + gm.hid.PressKey("esc") + helper.Sleep(1000) + } + + return errors.New("error exiting game! Timeout") +} + +func (gm *Manager) NewGame() error { + if gm.gr.InGame() { + return errors.New("character still in a game") + } + + for range 30 { + gm.gr.InGame() + if gm.gr.InCharacterSelectionScreen() { + helper.Sleep(2000) // Wait for character selection screen to load + break + } + helper.Sleep(500) + } + + difficultyPosition := map[difficulty.Difficulty]struct { + X, Y int + }{ + difficulty.Normal: {X: 640, Y: 311}, + difficulty.Nightmare: {X: 640, Y: 355}, + difficulty.Hell: {X: 640, Y: 403}, + } + + createX := difficultyPosition[config.Characters[gm.supervisorName].Game.Difficulty].X + createY := difficultyPosition[config.Characters[gm.supervisorName].Game.Difficulty].Y + gm.hid.Click(LeftButton, 600, 650) + helper.Sleep(250) + gm.hid.Click(LeftButton, createX, createY) + + for range 30 { + if gm.gr.InGame() { + return nil + } + helper.Sleep(1000) + } + + return errors.New("error creating game! Timeout") +} + +func (gm *Manager) clearGameNameOrPasswordField() { + for range 16 { + gm.hid.PressKey("backspace") + } +} + +func (gm *Manager) CreateOnlineGame(gameCounter int) (string, error) { + // Enter bnet lobby + gm.hid.Click(LeftButton, 744, 650) + helper.Sleep(1200) + + // Click "Create game" tab + gm.hid.Click(LeftButton, 845, 54) + helper.Sleep(200) + + // Click the game name textbox, delete text and type new game name + gm.hid.Click(LeftButton, 1000, 116) + gm.clearGameNameOrPasswordField() + gameName := config.Characters[gm.supervisorName].Companion.GameNameTemplate + fmt.Sprintf("%d", gameCounter) + for _, ch := range gameName { + gm.hid.PressKey(fmt.Sprintf("%c", ch)) + } + + // Same for password + gm.hid.Click(LeftButton, 1000, 161) + helper.Sleep(200) + gamePassword := config.Characters[gm.supervisorName].Companion.GamePassword + if gamePassword != "" { + gm.clearGameNameOrPasswordField() + for _, ch := range gamePassword { + gm.hid.PressKey(fmt.Sprintf("%c", ch)) + } + } + gm.hid.PressKey("enter") + + for range 30 { + if gm.gr.InGame() { + return gameName, nil + } + helper.Sleep(1000) + } + + return gameName, errors.New("error creating game! Timeout") +} + +func (gm *Manager) JoinOnlineGame(gameName, password string) error { + // Enter bnet lobby + gm.hid.Click(LeftButton, 744, 650) + helper.Sleep(1200) + + // Click "Join game" tab + gm.hid.Click(LeftButton, 977, 54) + helper.Sleep(200) + + // Click the game name textbox, delete text and type new game name + gm.hid.Click(LeftButton, 950, 100) + helper.Sleep(200) + gm.clearGameNameOrPasswordField() + helper.Sleep(200) + for _, ch := range gameName { + gm.hid.PressKey(fmt.Sprintf("%c", ch)) + } + + // Same for password + gm.hid.Click(LeftButton, 1130, 100) + helper.Sleep(200) + gm.clearGameNameOrPasswordField() + helper.Sleep(200) + for _, ch := range password { + gm.hid.PressKey(fmt.Sprintf("%c", ch)) + } + gm.hid.PressKey("enter") + + for range 30 { + if gm.gr.InGame() { + return nil + } + helper.Sleep(1000) + } + + return errors.New("error joining game! Timeout") +} + +func (gm *Manager) InGame() bool { + return gm.gr.InGame() +} + +func StartGame(username string, password string, realm string) (uint32, win.HWND, error) { + // First check for other instances of the game and kill the handles, otherwise we will not be able to start the game + err := KillCheckForClientHandles() + if err != nil { + return 0, 0, err + } + + cmd := exec.Command(config.Koolo.D2RPath+"\\D2R.exe", "-username", username, "-password", password, "-address", realm) + // In case multiclient info is not set, start the game without any parameters + if username == "" || password == "" || realm == "" { + cmd = exec.Command(config.Koolo.D2RPath + "\\D2R.exe") + } + err = cmd.Start() + if err != nil { + return 0, 0, err + } + + var foundHwnd windows.HWND + cb := syscall.NewCallback(func(hwnd windows.HWND, lParam uintptr) uintptr { + var pid uint32 + windows.GetWindowThreadProcessId(hwnd, &pid) + if pid == uint32(cmd.Process.Pid) { + foundHwnd = hwnd + return 0 + } + return 1 + }) + for { + windows.EnumWindows(cb, unsafe.Pointer(&cmd.Process.Pid)) + if foundHwnd != 0 { + break + } + } + + // Close the handle for the new process, it will allow the user to open another instance of the game + err = KillCheckForClientHandles() + if err != nil { + return 0, 0, err + } + + return uint32(cmd.Process.Pid), win.HWND(foundHwnd), nil +} diff --git a/internal/reader/map_client/client.go b/internal/game/map_client/client.go similarity index 97% rename from internal/reader/map_client/client.go rename to internal/game/map_client/client.go index bfb271a33..559e83065 100644 --- a/internal/reader/map_client/client.go +++ b/internal/game/map_client/client.go @@ -15,7 +15,7 @@ import ( ) func GetMapData(seed string, difficulty difficulty.Difficulty) MapData { - stdout, err := exec.Command("./koolo-map.exe", config.Config.D2LoDPath, "-s", seed, "-d", getDifficultyAsNum(difficulty)).Output() + stdout, err := exec.Command("./tools/koolo-map.exe", config.Koolo.D2LoDPath, "-s", seed, "-d", getDifficultyAsNum(difficulty)).Output() if err != nil { panic(fmt.Sprintf( "Error detected fetching Map Data from Diablo II: LoD 1.13c game, please make sure you have the classic expansion game installed AND config.yaml D2LoDPath is pointing to the correct game path. Error: %s", diff --git a/internal/reader/map_client/data.go b/internal/game/map_client/data.go similarity index 100% rename from internal/reader/map_client/data.go rename to internal/game/map_client/data.go diff --git a/internal/reader/map_client/structures.go b/internal/game/map_client/structures.go similarity index 100% rename from internal/reader/map_client/structures.go rename to internal/game/map_client/structures.go diff --git a/internal/game/memory_injector.go b/internal/game/memory_injector.go new file mode 100644 index 000000000..9c56c63ff --- /dev/null +++ b/internal/game/memory_injector.go @@ -0,0 +1,159 @@ +package game + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "github.com/hectorgimenez/d2go/pkg/memory" + "golang.org/x/sys/windows" + "strings" + "syscall" +) + +const fullAccess = windows.PROCESS_VM_OPERATION | windows.PROCESS_VM_WRITE | windows.PROCESS_VM_READ + +type MemoryInjector struct { + pid uint32 + handle windows.Handle + getCursorPosAddr uintptr + getCursorPosOrigBytes [32]byte + trackMouseEventAddr uintptr + trackMouseEventBytes [32]byte + getKeyStateAddr uintptr + getKeyStateOrigBytes [18]byte +} + +func InjectorInit(pid uint32) (*MemoryInjector, error) { + i := &MemoryInjector{pid: pid} + pHandle, err := windows.OpenProcess(fullAccess, false, pid) + if err != nil { + return nil, fmt.Errorf("error opening process: %w", err) + } + i.handle = pHandle + + return i, nil +} + +func (i *MemoryInjector) Load() error { + modules, err := memory.GetProcessModules(i.pid) + if err != nil { + return fmt.Errorf("error getting process modules: %w", err) + } + + syscall.MustLoadDLL("USER32.dll") + + for _, module := range modules { + // GetCursorPos + if strings.Contains(strings.ToLower(module.ModuleName), "user32.dll") { + i.getCursorPosAddr, err = syscall.GetProcAddress(module.ModuleHandle, "GetCursorPos") + i.getKeyStateAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "GetKeyState") + i.trackMouseEventAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "TrackMouseEvent") + + err = windows.ReadProcessMemory(i.handle, i.getCursorPosAddr, &i.getCursorPosOrigBytes[0], uintptr(len(i.getCursorPosOrigBytes)), nil) + if err != nil { + return fmt.Errorf("error reading memory: %w", err) + } + + err = i.stopTrackingMouseLeaveEvents() + if err != nil { + return err + } + + err = windows.ReadProcessMemory(i.handle, i.getKeyStateAddr, &i.getKeyStateOrigBytes[0], uintptr(len(i.getKeyStateOrigBytes)), nil) + if err != nil { + return fmt.Errorf("error reading memory: %w", err) + } + } + } + if i.getCursorPosAddr == 0 || i.getKeyStateAddr == 0 { + return errors.New("could not find GetCursorPos address") + } + + return nil +} + +func (i *MemoryInjector) Unload() error { + if err := i.RestoreMemory(); err != nil { + return err + } + + return windows.CloseHandle(i.handle) +} + +func (i *MemoryInjector) RestoreMemory() error { + err := i.RestoreGetCursorPosAddr() + if err != nil { + return fmt.Errorf("error writing to memory: %w", err) + } + + return i.RestoreGetKeyState() +} + +func (i *MemoryInjector) CursorPos(x, y int) error { + /* + push rax + mov rax, rcx + mov dword ptr [rax], 1 // X + mov dword ptr [rax+4], 2 // Y + pop rax + mov al, 1 + ret + */ + bytes := []byte{0x50, 0x48, 0x89, 0xC8, 0xC7, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC7, 0x40, 0x04, 0x02, 0x00, 0x00, 0x00, 0x58, 0xB0, 0x01, 0xC3} + + buff := make([]byte, 4) + binary.LittleEndian.PutUint32(buff, uint32(x)) + copy(bytes[6:], buff) + + binary.LittleEndian.PutUint32(buff, uint32(y)) + copy(bytes[13:], buff) + + return windows.WriteProcessMemory(i.handle, i.getCursorPosAddr, &bytes[0], uintptr(len(bytes)), nil) +} + +func (i *MemoryInjector) OverrideGetKeyState(key int) error { + /* + cmp rcx, 0x12 + mov rax, 0x8000 + ret + */ + bytes := []byte{0x48, 0x81, 0xF9, byte(key), 0x00, 0x00, 0x00, 0x48, 0xB8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3} + return windows.WriteProcessMemory(i.handle, i.getKeyStateAddr, &bytes[0], uintptr(len(bytes)), nil) +} + +func (i *MemoryInjector) RestoreGetKeyState() error { + return windows.WriteProcessMemory(i.handle, i.getKeyStateAddr, &i.getKeyStateOrigBytes[0], uintptr(len(i.getKeyStateOrigBytes)), nil) +} + +func (i *MemoryInjector) RestoreGetCursorPosAddr() error { + return windows.WriteProcessMemory(i.handle, i.getCursorPosAddr, &i.getCursorPosOrigBytes[0], uintptr(len(i.getCursorPosOrigBytes)), nil) +} + +// This is needed in order to let the game keep processing mouse events even if the mouse is not over the window +func (i *MemoryInjector) stopTrackingMouseLeaveEvents() error { + err := windows.ReadProcessMemory(i.handle, i.trackMouseEventAddr, &i.trackMouseEventBytes[0], uintptr(len(i.trackMouseEventBytes)), nil) + if err != nil { + return err + } + + // and dword ptr [rcx+4], 0xFFFFFFFD + // Modify TRACKMOUSEEVENT struct to disable mouse leave events, since we are injecting our events even if the mouse is not over the window + disableMouseLeaveRequest := []byte{0x81, 0x61, 0x04, 0xFD, 0xFF, 0xFF, 0xFF} + + // Already hooked + if bytes.Contains(i.trackMouseEventBytes[:], disableMouseLeaveRequest) { + return nil + } + + // We need to move back the pointer 7 bytes to get the correct position, since we are injecting 7 bytes in front of it + num := int32(binary.LittleEndian.Uint32(i.trackMouseEventBytes[2:6])) + num -= 7 + numberBytes := make([]byte, 4) + binary.LittleEndian.PutUint32(numberBytes, uint32(num)) + injectBytes := append(i.trackMouseEventBytes[0:2], numberBytes...) + + hook := append(disableMouseLeaveRequest, injectBytes...) + + return windows.WriteProcessMemory(i.handle, i.trackMouseEventAddr, &hook[0], uintptr(len(hook)), nil) +} diff --git a/internal/game/memory_reader.go b/internal/game/memory_reader.go new file mode 100644 index 000000000..6afadbc87 --- /dev/null +++ b/internal/game/memory_reader.go @@ -0,0 +1,109 @@ +package game + +import ( + "fmt" + "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/d2go/pkg/memory" + "github.com/hectorgimenez/d2go/pkg/utils" + "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/game/map_client" + "github.com/lxn/win" + "strconv" +) + +type MemoryReader struct { + *memory.GameReader + cachedMapSeed uint + HWND win.HWND + WindowLeftX int + WindowTopY int + GameAreaSizeX int + GameAreaSizeY int + supervisorName string + CachedMapData map_client.MapData +} + +func NewGameReader(supervisorName string, pid uint32, window win.HWND) (*MemoryReader, error) { + process, err := memory.NewProcessForPID(pid) + if err != nil { + return nil, err + } + + gr := &MemoryReader{ + GameReader: memory.NewGameReader(process), + HWND: window, + supervisorName: supervisorName, + } + + gr.updateWindowPositionData() + + return gr, nil +} + +func (gd *MemoryReader) updateWindowPositionData() { + pos := win.WINDOWPLACEMENT{} + point := win.POINT{} + win.ClientToScreen(gd.HWND, &point) + win.GetWindowPlacement(gd.HWND, &pos) + + gd.WindowLeftX = int(point.X) + gd.WindowTopY = int(point.Y) + gd.GameAreaSizeX = int(pos.RcNormalPosition.Right) - gd.WindowLeftX - 9 + gd.GameAreaSizeY = int(pos.RcNormalPosition.Bottom) - gd.WindowTopY - 9 +} + +func (gd *MemoryReader) GetData(isNewGame bool) data.Data { + d := gd.GameReader.GetData() + + if isNewGame { + playerUnitPtr, _ := gd.GetPlayerUnitPtr(d.Roster) + gd.cachedMapSeed, _ = gd.getMapSeed(playerUnitPtr) + gd.CachedMapData = map_client.GetMapData(strconv.Itoa(int(gd.cachedMapSeed)), config.Characters[gd.supervisorName].Game.Difficulty) + } + + origin := gd.CachedMapData.Origin(d.PlayerUnit.Area) + npcs, exits, objects, rooms := gd.CachedMapData.NPCsExitsAndObjects(origin, d.PlayerUnit.Area) + // This hacky thing is because sometimes if the objects are far away we can not fetch them, basically WP. + memObjects := gd.Objects(d.PlayerUnit.Position, d.HoverData) + for _, clientObject := range objects { + found := false + for _, obj := range memObjects { + if obj.Name == clientObject.Name { + found = true + } + } + if !found { + memObjects = append(memObjects, clientObject) + } + } + + d.AreaOrigin = origin + d.NPCs = npcs + d.AdjacentLevels = exits + d.Rooms = rooms + d.Objects = memObjects + d.CollisionGrid = gd.CachedMapData.CollisionGrid(d.PlayerUnit.Area) + + return d +} + +func (gd *MemoryReader) getMapSeed(playerUnit uintptr) (uint, error) { + actPtr := uintptr(gd.Process.ReadUInt(playerUnit+0x20, memory.Uint64)) + actMiscPtr := uintptr(gd.Process.ReadUInt(actPtr+0x78, memory.Uint64)) + + dwInitSeedHash1 := uintptr(gd.Process.ReadUInt(actMiscPtr+0x840, memory.Uint32)) + //dwInitSeedHash2 := uintptr(gd.Process.ReadUInt(actMiscPtr+0x844, memory.Uint32)) + dwEndSeedHash1 := uintptr(gd.Process.ReadUInt(actMiscPtr+0x868, memory.Uint32)) + + mapSeed, found := utils.GetMapSeed(uint(dwInitSeedHash1), uint(dwEndSeedHash1)) + if !found { + return 0, fmt.Errorf("error calculating map seed") + } + + return mapSeed, nil +} + +func (gd *MemoryReader) WindowScale() float64 { + dpi := win.GetDpiForWindow(gd.HWND) + return float64(dpi) / 96.0 +} diff --git a/internal/hid/mouse.go b/internal/game/mouse.go similarity index 52% rename from internal/hid/mouse.go rename to internal/game/mouse.go index 5c8ae23d0..ed2c5022f 100644 --- a/internal/hid/mouse.go +++ b/internal/game/mouse.go @@ -1,21 +1,11 @@ -package hid +package game import ( - "github.com/hectorgimenez/koolo/internal/memory" - "github.com/hectorgimenez/koolo/internal/ui" "github.com/lxn/win" - "image/color" "math/rand" "time" ) -var ( - WindowLeftX = 0 - WindowTopY = 0 - GameAreaSizeX = 0 - GameAreaSizeY = 0 -) - const ( RightButton MouseButton = win.MK_RBUTTON LeftButton MouseButton = win.MK_LBUTTON @@ -29,32 +19,29 @@ type ModifierKey uint // MovePointer moves the mouse to the requested position, x and y should be the final position based on // pixels shown in the screen. Top-left corner is 0,0 -func MovePointer(x, y int) { - x = WindowLeftX + x - y = WindowTopY + y +func (hid *HID) MovePointer(x, y int) { + hid.gr.updateWindowPositionData() + x = hid.gr.WindowLeftX + x + y = hid.gr.WindowTopY + y - scale := ui.GameWindowScale() + scale := hid.gr.WindowScale() x = int(float64(x) * scale) y = int(float64(y) * scale) - memory.InjectCursorPos(x, y) + hid.gi.CursorPos(x, y) lParam := calculateLparam(x, y) - win.SendMessage(memory.HWND, win.WM_NCHITTEST, 0, lParam) - win.SendMessage(memory.HWND, win.WM_SETCURSOR, 0x000105A8, 0x2010001) - win.PostMessage(memory.HWND, win.WM_MOUSEMOVE, 0, lParam) -} - -type Changeable interface { - Set(x, y int, c color.Color) + win.SendMessage(hid.gr.HWND, win.WM_NCHITTEST, 0, lParam) + win.SendMessage(hid.gr.HWND, win.WM_SETCURSOR, 0x000105A8, 0x2010001) + win.PostMessage(hid.gr.HWND, win.WM_MOUSEMOVE, 0, lParam) } // Click just does a single mouse click at current pointer position -func Click(btn MouseButton, x, y int) { - MovePointer(x, y) - x = WindowLeftX + x - y = WindowTopY + y +func (hid *HID) Click(btn MouseButton, x, y int) { + hid.MovePointer(x, y) + x = hid.gr.WindowLeftX + x + y = hid.gr.WindowTopY + y - scale := ui.GameWindowScale() + scale := hid.gr.WindowScale() x = int(float64(x) * scale) y = int(float64(y) * scale) @@ -66,16 +53,16 @@ func Click(btn MouseButton, x, y int) { buttonUp = win.WM_RBUTTONUP } - win.SendMessage(memory.HWND, buttonDown, 1, lParam) + win.SendMessage(hid.gr.HWND, buttonDown, 1, lParam) sleepTime := rand.Intn(keyPressMaxTime-keyPressMinTime) + keyPressMinTime time.Sleep(time.Duration(sleepTime) * time.Millisecond) - win.SendMessage(memory.HWND, buttonUp, 1, lParam) + win.SendMessage(hid.gr.HWND, buttonUp, 1, lParam) } -func ClickWithModifier(btn MouseButton, x, y int, modifier ModifierKey) { - memory.OverrideGetKeyState(int(modifier)) - Click(btn, x, y) - memory.RestoreGetKeyState() +func (hid *HID) ClickWithModifier(btn MouseButton, x, y int, modifier ModifierKey) { + hid.gi.OverrideGetKeyState(int(modifier)) + hid.Click(btn, x, y) + hid.gi.RestoreGetKeyState() } func calculateLparam(x, y int) uintptr { diff --git a/internal/helper/screenshot.go b/internal/game/screenshot.go similarity index 72% rename from internal/helper/screenshot.go rename to internal/game/screenshot.go index 3567d0083..b3e297938 100644 --- a/internal/helper/screenshot.go +++ b/internal/game/screenshot.go @@ -1,28 +1,23 @@ -package helper +package game import ( "github.com/hectorgimenez/koolo/internal/helper/winproc" - "github.com/hectorgimenez/koolo/internal/hid" - "github.com/hectorgimenez/koolo/internal/memory" - "github.com/hectorgimenez/koolo/internal/ui" "image" - "image/jpeg" - "os" "unsafe" ) -func Screenshot() image.Image { - sizeX := int(float64(hid.GameAreaSizeX) * ui.GameWindowScale()) - sizeY := int(float64(hid.GameAreaSizeY) * ui.GameWindowScale()) +func (gd *MemoryReader) Screenshot() image.Image { + sizeX := int(float64(gd.GameAreaSizeX) * gd.WindowScale()) + sizeY := int(float64(gd.GameAreaSizeY) * gd.WindowScale()) // Create a device context compatible with the window - hdcWindow, _, _ := winproc.GetWindowDC.Call(uintptr(memory.HWND)) + hdcWindow, _, _ := winproc.GetWindowDC.Call(uintptr(gd.HWND)) hdcMem, _, _ := winproc.CreateCompatibleDC.Call(hdcWindow) hbmMem, _, _ := winproc.CreateCompatibleBitmap.Call(hdcWindow, uintptr(sizeX), uintptr(sizeY)) _, _, _ = winproc.SelectObject.Call(hdcMem, hbmMem) // Use PrintWindow to copy the window into the bitmap - winproc.PrintWindow.Call(uintptr(memory.HWND), hdcMem, 3) // use 3 to get window content only + winproc.PrintWindow.Call(uintptr(gd.HWND), hdcMem, 3) // use 3 to get window content only // map the bitmap structure bmpInfo := struct { @@ -77,13 +72,3 @@ func Screenshot() image.Image { return img } - -func SaveImageJPEG(img image.Image, path string) error { - f, err := os.Create(path) - if err != nil { - return err - } - defer f.Close() - - return jpeg.Encode(f, img, &jpeg.Options{Quality: 80}) -} diff --git a/internal/health/belt_manager.go b/internal/health/belt_manager.go index 21ad655aa..fa6db7915 100644 --- a/internal/health/belt_manager.go +++ b/internal/health/belt_manager.go @@ -2,40 +2,46 @@ package health import ( "fmt" + "github.com/hectorgimenez/koolo/internal/event" + "github.com/hectorgimenez/koolo/internal/game" "log/slog" "strings" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/koolo/internal/config" - "github.com/hectorgimenez/koolo/internal/event/stat" - "github.com/hectorgimenez/koolo/internal/hid" ) type BeltManager struct { - logger *slog.Logger + logger *slog.Logger + hid *game.HID + eventChan chan<- event.Event + cfg *config.CharacterCfg } -func NewBeltManager(logger *slog.Logger) BeltManager { +func NewBeltManager(logger *slog.Logger, hid *game.HID, eventChan chan<- event.Event, cfg *config.CharacterCfg) BeltManager { return BeltManager{ - logger: logger, + logger: logger, + hid: hid, + eventChan: eventChan, + cfg: cfg, } } -func (pm BeltManager) DrinkPotion(d data.Data, potionType data.PotionType, merc bool) bool { +func (bm BeltManager) DrinkPotion(d data.Data, potionType data.PotionType, merc bool) bool { p, found := d.Items.Belt.GetFirstPotion(potionType) if found { - binding := pm.getBindingBasedOnColumn(p) + binding := bm.getBindingBasedOnColumn(p) if merc { - hid.KeyDown("shift") - hid.PressKey(binding) - hid.KeyUp("shift") - pm.logger.Debug(fmt.Sprintf("Using %s potion on Mercenary [Column: %d]. HP: %d", potionType, p.X+1, d.MercHPPercent())) - stat.UsedPotion(potionType, true) + bm.hid.KeyDown("shift") + bm.hid.PressKey(binding) + bm.hid.KeyUp("shift") + bm.logger.Debug(fmt.Sprintf("Using %s potion on Mercenary [Column: %d]. HP: %d", potionType, p.X+1, d.MercHPPercent())) + bm.eventChan <- event.UsedPotion(event.Text(""), potionType, true) return true } - hid.PressKey(binding) - pm.logger.Debug(fmt.Sprintf("Using %s potion [Column: %d]. HP: %d MP: %d", potionType, p.X+1, d.PlayerUnit.HPPercent(), d.PlayerUnit.MPPercent())) - stat.UsedPotion(potionType, false) + bm.hid.PressKey(binding) + bm.logger.Debug(fmt.Sprintf("Using %s potion [Column: %d]. HP: %d MP: %d", potionType, p.X+1, d.PlayerUnit.HPPercent(), d.PlayerUnit.MPPercent())) + bm.eventChan <- event.UsedPotion(event.Text(""), potionType, false) return true } @@ -43,15 +49,15 @@ func (pm BeltManager) DrinkPotion(d data.Data, potionType data.PotionType, merc } // ShouldBuyPotions will return true if more than 25% of belt is empty (ignoring rejuv) -func (pm BeltManager) ShouldBuyPotions(d data.Data) bool { - targetHealingAmount := config.Config.Inventory.BeltColumns.Healing * d.Items.Belt.Rows() - targetManaAmount := config.Config.Inventory.BeltColumns.Mana * d.Items.Belt.Rows() - targetRejuvAmount := config.Config.Inventory.BeltColumns.Rejuvenation * d.Items.Belt.Rows() +func (bm BeltManager) ShouldBuyPotions(d data.Data) bool { + targetHealingAmount := bm.cfg.Inventory.BeltColumns.Healing * d.Items.Belt.Rows() + targetManaAmount := bm.cfg.Inventory.BeltColumns.Mana * d.Items.Belt.Rows() + targetRejuvAmount := bm.cfg.Inventory.BeltColumns.Rejuvenation * d.Items.Belt.Rows() - currentHealing, currentMana, currentRejuv := pm.getCurrentPotions(d) + currentHealing, currentMana, currentRejuv := bm.getCurrentPotions(d) - pm.logger.Debug(fmt.Sprintf( - "Belt Status Health: %d/%d healing, %d/%d mana, %d/%d rejuv.", + bm.logger.Debug(fmt.Sprintf( + "Belt Stats Health: %d/%d healing, %d/%d mana, %d/%d rejuv.", currentHealing, targetHealingAmount, currentMana, @@ -61,14 +67,14 @@ func (pm BeltManager) ShouldBuyPotions(d data.Data) bool { )) if currentHealing < int(float32(targetHealingAmount)*0.75) || currentMana < int(float32(targetManaAmount)*0.75) { - pm.logger.Debug("Need more pots, let's buy them.") + bm.logger.Debug("Need more pots, let's buy them.") return true } return false } -func (pm BeltManager) getCurrentPotions(d data.Data) (int, int, int) { +func (bm BeltManager) getCurrentPotions(d data.Data) (int, int, int) { currentHealing := 0 currentMana := 0 currentRejuv := 0 @@ -89,26 +95,26 @@ func (pm BeltManager) getCurrentPotions(d data.Data) (int, int, int) { return currentHealing, currentMana, currentRejuv } -func (pm BeltManager) GetMissingCount(d data.Data, potionType data.PotionType) int { - currentHealing, currentMana, currentRejuv := pm.getCurrentPotions(d) +func (bm BeltManager) GetMissingCount(d data.Data, potionType data.PotionType) int { + currentHealing, currentMana, currentRejuv := bm.getCurrentPotions(d) switch potionType { case data.HealingPotion: - targetAmount := config.Config.Inventory.BeltColumns.Healing * d.Items.Belt.Rows() + targetAmount := bm.cfg.Inventory.BeltColumns.Healing * d.Items.Belt.Rows() missingPots := targetAmount - currentHealing if missingPots < 0 { return 0 } return missingPots case data.ManaPotion: - targetAmount := config.Config.Inventory.BeltColumns.Mana * d.Items.Belt.Rows() + targetAmount := bm.cfg.Inventory.BeltColumns.Mana * d.Items.Belt.Rows() missingPots := targetAmount - currentMana if missingPots < 0 { return 0 } return missingPots case data.RejuvenationPotion: - targetAmount := config.Config.Inventory.BeltColumns.Rejuvenation * d.Items.Belt.Rows() + targetAmount := bm.cfg.Inventory.BeltColumns.Rejuvenation * d.Items.Belt.Rows() missingPots := targetAmount - currentRejuv if missingPots < 0 { return 0 @@ -119,16 +125,16 @@ func (pm BeltManager) GetMissingCount(d data.Data, potionType data.PotionType) i return 0 } -func (pm BeltManager) getBindingBasedOnColumn(position data.Position) string { +func (bm BeltManager) getBindingBasedOnColumn(position data.Position) string { switch position.X { case 0: - return config.Config.Bindings.Potion1 + return bm.cfg.Bindings.Potion1 case 1: - return config.Config.Bindings.Potion2 + return bm.cfg.Bindings.Potion2 case 2: - return config.Config.Bindings.Potion3 + return bm.cfg.Bindings.Potion3 case 3: - return config.Config.Bindings.Potion4 + return bm.cfg.Bindings.Potion4 } return "" diff --git a/internal/health/health_manager.go b/internal/health/health_manager.go index b40aef69b..7d8376889 100644 --- a/internal/health/health_manager.go +++ b/internal/health/health_manager.go @@ -3,14 +3,12 @@ package health import ( "errors" "fmt" + "github.com/hectorgimenez/koolo/internal/game" "log/slog" "time" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/koolo/internal/config" - "github.com/hectorgimenez/koolo/internal/event" - "github.com/hectorgimenez/koolo/internal/event/stat" - "github.com/hectorgimenez/koolo/internal/helper" ) var ErrDied = errors.New("you died :(") @@ -28,7 +26,8 @@ const ( type Manager struct { logger *slog.Logger beltManager BeltManager - gameManager *helper.GameManager + gameManager *game.Manager + cfg *config.CharacterCfg lastRejuv time.Time lastRejuvMerc time.Time lastHeal time.Time @@ -36,24 +35,23 @@ type Manager struct { lastMercHeal time.Time } -func NewHealthManager(logger *slog.Logger, beltManager BeltManager, gm *helper.GameManager) Manager { +func NewHealthManager(logger *slog.Logger, beltManager BeltManager, gm *game.Manager, cfg *config.CharacterCfg) Manager { return Manager{ logger: logger, beltManager: beltManager, gameManager: gm, + cfg: cfg, } } func (hm *Manager) HandleHealthAndMana(d data.Data) error { - hpConfig := config.Config.Health + hpConfig := hm.cfg.Health // Safe area, skipping if d.PlayerUnit.Area.IsTown() { return nil } if d.PlayerUnit.HPPercent() <= 0 { - stat.FinishCurrentRun(event.Death) - return ErrDied } @@ -67,7 +65,6 @@ func (hm *Manager) HandleHealthAndMana(d data.Data) error { if !usedRejuv { if d.PlayerUnit.HPPercent() <= hpConfig.ChickenAt { - stat.FinishCurrentRun(event.Chicken) return fmt.Errorf("%w: Current Health: %d percent", ErrChicken, d.PlayerUnit.HPPercent()) } @@ -94,7 +91,6 @@ func (hm *Manager) HandleHealthAndMana(d data.Data) error { if !usedMercRejuv { if d.MercHPPercent() <= hpConfig.MercChickenAt { - stat.FinishCurrentRun(event.MercChicken) return fmt.Errorf("%w: Current Merc Health: %d percent", ErrMercChicken, d.MercHPPercent()) } diff --git a/internal/helper/game_manager.go b/internal/helper/game_manager.go deleted file mode 100644 index b70f93af0..000000000 --- a/internal/helper/game_manager.go +++ /dev/null @@ -1,175 +0,0 @@ -package helper - -import ( - "errors" - "fmt" - "github.com/hectorgimenez/d2go/pkg/data/difficulty" - "github.com/hectorgimenez/koolo/internal/config" - "github.com/hectorgimenez/koolo/internal/hid" - "github.com/hectorgimenez/koolo/internal/reader" -) - -type GameManager struct { - gr *reader.GameReader -} - -func NewGameManager(gr *reader.GameReader) *GameManager { - return &GameManager{gr: gr} -} - -func (gm *GameManager) ExitGame() error { - // First try to exit game as fast as possible, without any check, useful when chickening - hid.PressKey("esc") - hid.Click(hid.LeftButton, hid.GameAreaSizeX/2, int(float64(hid.GameAreaSizeY)/2.2)) - - for range 5 { - if !gm.gr.InGame() { - return nil - } - Sleep(1000) - } - - // If we are still in game, probably character is dead, so let's do it nicely. - // Probably closing the socket is more reliable, but was not working properly for me on singleplayer. - for range 10 { - if gm.gr.GetData(false).OpenMenus.QuitMenu { - hid.Click(hid.LeftButton, hid.GameAreaSizeX/2, int(float64(hid.GameAreaSizeY)/2.2)) - - for range 5 { - if !gm.gr.InGame() { - return nil - } - Sleep(1000) - } - } - hid.PressKey("esc") - Sleep(1000) - } - - return errors.New("error exiting game! Timeout") -} - -func (gm *GameManager) NewGame() error { - if gm.gr.InGame() { - return errors.New("character still in a game") - } - - for range 30 { - gm.gr.InGame() - if gm.gr.InCharacterSelectionScreen() { - Sleep(2000) // Wait for character selection screen to load - break - } - Sleep(500) - } - - difficultyPosition := map[difficulty.Difficulty]struct { - X, Y int - }{ - difficulty.Normal: {X: 640, Y: 311}, - difficulty.Nightmare: {X: 640, Y: 355}, - difficulty.Hell: {X: 640, Y: 403}, - } - - createX := difficultyPosition[config.Config.Game.Difficulty].X - createY := difficultyPosition[config.Config.Game.Difficulty].Y - hid.Click(hid.LeftButton, 600, 650) - Sleep(250) - hid.Click(hid.LeftButton, createX, createY) - - for range 30 { - if gm.gr.InGame() { - return nil - } - Sleep(1000) - } - - return errors.New("error creating game! Timeout") -} - -func (gm *GameManager) clearGameNameOrPasswordField() { - for range 16 { - hid.PressKey("backspace") - } -} - -func (gm *GameManager) CreateOnlineGame(gameCounter int) (string, error) { - // Enter bnet lobby - hid.Click(hid.LeftButton, 744, 650) - Sleep(1200) - - // Click "Create game" tab - hid.Click(hid.LeftButton, 845, 54) - Sleep(200) - - // Click the game name textbox, delete text and type new game name - hid.Click(hid.LeftButton, 1000, 116) - gm.clearGameNameOrPasswordField() - gameName := config.Config.Companion.GameNameTemplate + fmt.Sprintf("%d", gameCounter) - for _, ch := range gameName { - hid.PressKey(fmt.Sprintf("%c", ch)) - } - - // Same for password - hid.Click(hid.LeftButton, 1000, 161) - Sleep(200) - gamePassword := config.Config.Companion.GamePassword - if gamePassword != "" { - gm.clearGameNameOrPasswordField() - for _, ch := range gamePassword { - hid.PressKey(fmt.Sprintf("%c", ch)) - } - } - hid.PressKey("enter") - - for range 30 { - if gm.gr.InGame() { - return gameName, nil - } - Sleep(1000) - } - - return gameName, errors.New("error creating game! Timeout") -} - -func (gm *GameManager) JoinOnlineGame(gameName, password string) error { - // Enter bnet lobby - hid.Click(hid.LeftButton, 744, 650) - Sleep(1200) - - // Click "Join game" tab - hid.Click(hid.LeftButton, 977, 54) - Sleep(200) - - // Click the game name textbox, delete text and type new game name - hid.Click(hid.LeftButton, 950, 100) - Sleep(200) - gm.clearGameNameOrPasswordField() - Sleep(200) - for _, ch := range gameName { - hid.PressKey(fmt.Sprintf("%c", ch)) - } - - // Same for password - hid.Click(hid.LeftButton, 1130, 100) - Sleep(200) - gm.clearGameNameOrPasswordField() - Sleep(200) - for _, ch := range password { - hid.PressKey(fmt.Sprintf("%c", ch)) - } - hid.PressKey("enter") - - for range 30 { - if gm.gr.InGame() { - return nil - } - Sleep(1000) - } - - return errors.New("error joining game! Timeout") -} - -func (gm *GameManager) InGame() bool { - return gm.gr.InGame() -} diff --git a/internal/helper/image.go b/internal/helper/image.go new file mode 100644 index 000000000..528dc7453 --- /dev/null +++ b/internal/helper/image.go @@ -0,0 +1,17 @@ +package helper + +import ( + "image" + "image/jpeg" + "os" +) + +func SaveImageJPEG(img image.Image, path string) error { + f, err := os.Create(path) + if err != nil { + return err + } + defer f.Close() + + return jpeg.Encode(f, img, &jpeg.Options{Quality: 80}) +} diff --git a/internal/helper/ingame.go b/internal/helper/ingame.go index e1dbcebe9..aff375663 100644 --- a/internal/helper/ingame.go +++ b/internal/helper/ingame.go @@ -4,7 +4,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/skill" - "github.com/hectorgimenez/koolo/internal/config" ) func CanTeleport(d data.Data) bool { @@ -15,5 +14,7 @@ func CanTeleport(d data.Data) bool { return false } - return found && config.Config.Bindings.Teleport != "" && !d.PlayerUnit.Area.IsTown() + // TODO: Recheck for binding + //return found && config.Config.Bindings.Teleport != "" && !d.PlayerUnit.Area.IsTown() + return found && !d.PlayerUnit.Area.IsTown() } diff --git a/internal/helper/windows.go b/internal/helper/windows.go new file mode 100644 index 000000000..d3774295a --- /dev/null +++ b/internal/helper/windows.go @@ -0,0 +1,9 @@ +package helper + +import "os" + +func HasAdminPermission() bool { + _, err := os.Open("\\\\.\\PHYSICALDRIVE0") + + return err == nil +} diff --git a/internal/manager.go b/internal/manager.go new file mode 100644 index 000000000..e5d1dd36b --- /dev/null +++ b/internal/manager.go @@ -0,0 +1,145 @@ +package koolo + +import ( + "fmt" + "github.com/hectorgimenez/koolo/internal/action" + "github.com/hectorgimenez/koolo/internal/character" + "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/container" + "github.com/hectorgimenez/koolo/internal/event" + "github.com/hectorgimenez/koolo/internal/game" + "github.com/hectorgimenez/koolo/internal/health" + "github.com/hectorgimenez/koolo/internal/pather" + "github.com/hectorgimenez/koolo/internal/run" + "github.com/hectorgimenez/koolo/internal/town" + "log/slog" +) + +type SupervisorManager struct { + logger *slog.Logger + supervisors map[string]Supervisor + eventHandlers []event.Handler +} + +func NewSupervisorManager(logger *slog.Logger, additionalEventHandlers []event.Handler) *SupervisorManager { + return &SupervisorManager{ + logger: logger, + supervisors: make(map[string]Supervisor), + eventHandlers: additionalEventHandlers, + } +} + +func (mng *SupervisorManager) AvailableSupervisors() []string { + availableSupervisors := make([]string, 0) + for name, _ := range config.Characters { + if name != "template" { + availableSupervisors = append(availableSupervisors, name) + } + } + + return availableSupervisors +} + +func (mng *SupervisorManager) Start(characterName string) error { + // Reload config to get the latest local changes before starting the supervisor + err := config.Load() + if err != nil { + return fmt.Errorf("error loading config: %w", err) + } + + supervisor, err := mng.buildSupervisor(characterName, mng.logger) + if err != nil { + return err + } + mng.supervisors[supervisor.Name()] = supervisor + + return supervisor.Start() +} + +func (mng *SupervisorManager) Stop(characterName string) { + s, found := mng.supervisors[characterName] + if found { + s.Stop() + delete(mng.supervisors, characterName) + } +} + +func (mng *SupervisorManager) TogglePause(characterName string) { + s, found := mng.supervisors[characterName] + if found { + s.TogglePause() + } +} + +func (mng *SupervisorManager) Status(characterName string) Stats { + for name, supervisor := range mng.supervisors { + if name == characterName { + return supervisor.Stats() + } + } + + return Stats{} +} + +func (mng *SupervisorManager) buildSupervisor(supervisorName string, logger *slog.Logger) (Supervisor, error) { + cfg, found := config.Characters[supervisorName] + if !found { + return nil, fmt.Errorf("character %s not found", supervisorName) + } + + pid, hwnd, err := game.StartGame(cfg.Username, cfg.Password, cfg.Realm) + if err != nil { + return nil, fmt.Errorf("error starting game: %w", err) + } + + gr, err := game.NewGameReader(supervisorName, pid, hwnd) + if err != nil { + return nil, fmt.Errorf("error creating game reader: %w", err) + } + + gi, err := game.InjectorInit(gr.GetPID()) + if err != nil { + return nil, fmt.Errorf("error creating game injector: %w", err) + } + + eventChannel := make(chan event.Event) + eventListener := event.NewListener(logger, supervisorName, eventChannel) + for _, handler := range mng.eventHandlers { + eventListener.Register(handler) + } + + hidM := game.NewHID(gr, gi) + bm := health.NewBeltManager(logger, hidM, eventChannel, cfg) + gm := game.NewGameManager(gr, hidM, supervisorName) + hm := health.NewHealthManager(logger, bm, gm, cfg) + pf := pather.NewPathFinder(gr, hidM, cfg) + c := container.Container{ + Logger: logger, + Reader: gr, + HID: hidM, + Injector: gi, + Manager: gm, + PathFinder: pf, + CharacterCfg: cfg, + EventChan: eventChannel, + } + sm := town.NewShopManager(logger, bm, c) + + char, err := character.BuildCharacter(logger, c) + if err != nil { + return nil, fmt.Errorf("error creating character: %w", err) + } + + ab := action.NewBuilder(c, sm, bm, char) + bot := NewBot(logger, hm, ab, c, supervisorName, eventChannel) + runFactory := run.NewFactory(logger, ab, char, bm, c) + + statsHandler := NewStatsHandler(supervisorName, logger) + eventListener.Register(statsHandler.Handle) + + if config.Characters[supervisorName].Companion.Enabled { + return NewCompanionSupervisor(supervisorName, bot, runFactory, statsHandler, eventListener, c) + } + + return NewSinglePlayerSupervisor(supervisorName, bot, runFactory, statsHandler, eventListener, c) +} diff --git a/internal/memory/injection.go b/internal/memory/injection.go deleted file mode 100644 index a04558238..000000000 --- a/internal/memory/injection.go +++ /dev/null @@ -1,150 +0,0 @@ -package memory - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "github.com/hectorgimenez/d2go/pkg/memory" - "github.com/lxn/win" - "golang.org/x/sys/windows" - "strings" - "syscall" -) - -const fullAccess = windows.PROCESS_VM_OPERATION | windows.PROCESS_VM_WRITE | windows.PROCESS_VM_READ - -var handle windows.Handle -var HWND win.HWND -var getCursorPosAddr uintptr -var getCursorPosOrigBytes [32]byte -var trackMouseEventAddr uintptr -var trackMouseEventBytes [32]byte -var getKeyStateAddr uintptr -var getKeyStateOrigBytes [18]byte - -func InjectorInit(pid uint32) error { - pHandle, err := windows.OpenProcess(fullAccess, false, pid) - if err != nil { - return fmt.Errorf("error opening process: %w", err) - } - handle = pHandle - - modules, err := memory.GetProcessModules(pid) - if err != nil { - return fmt.Errorf("error getting process modules: %w", err) - } - - syscall.MustLoadDLL("USER32.dll") - - for _, module := range modules { - // GetCursorPos - if strings.Contains(strings.ToLower(module.ModuleName), "user32.dll") { - getCursorPosAddr, err = syscall.GetProcAddress(module.ModuleHandle, "GetCursorPos") - getKeyStateAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "GetKeyState") - trackMouseEventAddr, _ = syscall.GetProcAddress(module.ModuleHandle, "TrackMouseEvent") - - err = windows.ReadProcessMemory(handle, getCursorPosAddr, &getCursorPosOrigBytes[0], uintptr(len(getCursorPosOrigBytes)), nil) - if err != nil { - return fmt.Errorf("error reading memory: %w", err) - } - - err = stopTrackingMouseLeaveEvents() - if err != nil { - return err - } - - err = windows.ReadProcessMemory(handle, getKeyStateAddr, &getKeyStateOrigBytes[0], uintptr(len(getKeyStateOrigBytes)), nil) - if err != nil { - return fmt.Errorf("error reading memory: %w", err) - } - } - } - if getCursorPosAddr == 0 || getKeyStateAddr == 0 { - return errors.New("could not find GetCursorPos address") - } - - return nil -} - -func InjectorUnload() error { - err := RestoreGetCursorPosAddr() - if err != nil { - return fmt.Errorf("error writing to memory: %w", err) - } - - err = RestoreGetKeyState() - if err != nil { - return err - } - - return windows.CloseHandle(handle) -} - -func InjectCursorPos(x, y int) error { - /* - push rax - mov rax, rcx - mov dword ptr [rax], 1 // X - mov dword ptr [rax+4], 2 // Y - pop rax - mov al, 1 - ret - */ - bytes := []byte{0x50, 0x48, 0x89, 0xC8, 0xC7, 0x00, 0x01, 0x00, 0x00, 0x00, 0xC7, 0x40, 0x04, 0x02, 0x00, 0x00, 0x00, 0x58, 0xB0, 0x01, 0xC3} - - buff := make([]byte, 4) - binary.LittleEndian.PutUint32(buff, uint32(x)) - copy(bytes[6:], buff) - - binary.LittleEndian.PutUint32(buff, uint32(y)) - copy(bytes[13:], buff) - - return windows.WriteProcessMemory(handle, getCursorPosAddr, &bytes[0], uintptr(len(bytes)), nil) -} - -func OverrideGetKeyState(key int) error { - /* - cmp rcx, 0x12 - mov rax, 0x8000 - ret - */ - bytes := []byte{0x48, 0x81, 0xF9, byte(key), 0x00, 0x00, 0x00, 0x48, 0xB8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3} - return windows.WriteProcessMemory(handle, getKeyStateAddr, &bytes[0], uintptr(len(bytes)), nil) -} - -func RestoreGetKeyState() error { - return windows.WriteProcessMemory(handle, getKeyStateAddr, &getKeyStateOrigBytes[0], uintptr(len(getKeyStateOrigBytes)), nil) -} - -func RestoreGetCursorPosAddr() error { - return windows.WriteProcessMemory(handle, getCursorPosAddr, &getCursorPosOrigBytes[0], uintptr(len(getCursorPosOrigBytes)), nil) -} - -// This is needed in order to let the game keep processing mouse events even if the mouse is not over the window -func stopTrackingMouseLeaveEvents() error { - err := windows.ReadProcessMemory(handle, trackMouseEventAddr, &trackMouseEventBytes[0], uintptr(len(trackMouseEventBytes)), nil) - if err != nil { - return err - } - - // and dword ptr [rcx+4], 0xFFFFFFFD - // Modify TRACKMOUSEEVENT struct to disable mouse leave events, since we are injecting our events even if the mouse is not over the window - disableMouseLeaveRequest := []byte{0x81, 0x61, 0x04, 0xFD, 0xFF, 0xFF, 0xFF} - - // Already hooked - if bytes.Contains(trackMouseEventBytes[:], disableMouseLeaveRequest) { - return nil - } - - // We need to move back the pointer 7 bytes to get the correct position, since we are injecting 7 bytes in front of it - num := int32(binary.LittleEndian.Uint32(trackMouseEventBytes[2:6])) - num -= 7 - numberBytes := make([]byte, 4) - binary.LittleEndian.PutUint32(numberBytes, uint32(num)) - injectBytes := append(trackMouseEventBytes[0:2], numberBytes...) - - hook := append(disableMouseLeaveRequest, injectBytes...) - - return windows.WriteProcessMemory(handle, trackMouseEventAddr, &hook[0], uintptr(len(hook)), nil) -} diff --git a/internal/pather/data.bin b/internal/pather/data.bin deleted file mode 100644 index c27588b1e2f525bd752f18775454bc1f88675b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1010104 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 diff --git a/internal/pather/path_finder.go b/internal/pather/path_finder.go index 92be7c673..1eb034b30 100644 --- a/internal/pather/path_finder.go +++ b/internal/pather/path_finder.go @@ -5,14 +5,23 @@ import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/game" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" - "github.com/hectorgimenez/koolo/internal/reader" "math" "math/rand" ) -func GetPath(d data.Data, to data.Position, blacklistedCoords ...[2]int) (path *Pather, distance int, found bool) { +type PathFinder struct { + gr *game.MemoryReader + hid *game.HID + cfg *config.CharacterCfg +} + +func NewPathFinder(gr *game.MemoryReader, hid *game.HID, cfg *config.CharacterCfg) PathFinder { + return PathFinder{gr: gr, hid: hid, cfg: cfg} +} + +func (pf PathFinder) GetPath(d data.Data, to data.Position, blacklistedCoords ...[2]int) (path *Pather, distance int, found bool) { outsideCurrentLevel := outsideBoundary(d, to) collisionGrid := d.CollisionGrid @@ -22,7 +31,7 @@ func GetPath(d data.Data, to data.Position, blacklistedCoords ...[2]int) (path * } if outsideCurrentLevel { - lvl, lvlFound := reader.CachedMapData.LevelDataForCoords(to, d.PlayerUnit.Area.Act()) + lvl, lvlFound := pf.gr.CachedMapData.LevelDataForCoords(to, d.PlayerUnit.Area.Act()) if !lvlFound { panic("Error occurred calculating path, destination point outside current level and matching level not found") } @@ -128,7 +137,7 @@ func GetPath(d data.Data, to data.Position, blacklistedCoords ...[2]int) (path * distance = int(distFloat) // Debug only, this will render a png file with map and origin/destination points - if config.Config.Debug.RenderMap { + if config.Koolo.Debug.RenderMap { w.renderPathImg(d, p, collisionGridOffset) } @@ -150,7 +159,7 @@ func ensureValueInCG(val, cgSize int) int { return val } -func GetClosestWalkablePath(d data.Data, dest data.Position, blacklistedCoords ...[2]int) (path *Pather, distance int, found bool) { +func (pf PathFinder) GetClosestWalkablePath(d data.Data, dest data.Position, blacklistedCoords ...[2]int) (path *Pather, distance int, found bool) { maxRange := 20 step := 4 dst := 1 @@ -162,7 +171,7 @@ func GetClosestWalkablePath(d data.Data, dest data.Position, blacklistedCoords . cgY := dest.Y - d.AreaOrigin.Y + j cgX := dest.X - d.AreaOrigin.X + i if cgX > 0 && cgY > 0 && len(d.CollisionGrid) > cgY && len(d.CollisionGrid[cgY]) > cgX && d.CollisionGrid[cgY][cgX] { - return GetPath(d, data.Position{ + return pf.GetPath(d, data.Position{ X: dest.X + i, Y: dest.Y + j, }, blacklistedCoords...) @@ -176,7 +185,7 @@ func GetClosestWalkablePath(d data.Data, dest data.Position, blacklistedCoords . return nil, 0, false } -func MoveThroughPath(p *Pather, distance int, teleport bool) { +func (pf PathFinder) MoveThroughPath(p *Pather, distance int, teleport bool) { //if len(p.AstarPather) == 0 { // if teleport { // hid.Click(hid.RightButton) @@ -191,57 +200,46 @@ func MoveThroughPath(p *Pather, distance int, teleport bool) { moveTo = p.AstarPather[len(p.AstarPather)-distance].(*Tile) } - screenX, screenY := GameCoordsToScreenCords(p.AstarPather[len(p.AstarPather)-1].(*Tile).X, p.AstarPather[len(p.AstarPather)-1].(*Tile).Y, moveTo.X, moveTo.Y) + screenX, screenY := pf.GameCoordsToScreenCords(p.AstarPather[len(p.AstarPather)-1].(*Tile).X, p.AstarPather[len(p.AstarPather)-1].(*Tile).Y, moveTo.X, moveTo.Y) // Prevent mouse overlap the HUD - if screenY > int(float32(hid.GameAreaSizeY)/1.21) { - screenY = int(float32(hid.GameAreaSizeY) / 1.21) + if screenY > int(float32(pf.gr.GameAreaSizeY)/1.21) { + screenY = int(float32(pf.gr.GameAreaSizeY) / 1.21) } if distance > 0 { - moveCharacter(teleport, screenX, screenY) + pf.moveCharacter(teleport, screenX, screenY) } } -func moveCharacter(teleport bool, x, y int) { +func (pf PathFinder) moveCharacter(teleport bool, x, y int) { if teleport { - hid.Click(hid.RightButton, x, y) + pf.hid.Click(game.RightButton, x, y) } else { - hid.MovePointer(x, y) - hid.PressKey(config.Config.Bindings.ForceMove) + pf.hid.MovePointer(x, y) + pf.hid.PressKey(pf.cfg.Bindings.ForceMove) helper.Sleep(50) } } -func GameCoordsToScreenCords(playerX, playerY, destinationX, destinationY int) (int, int) { +func (pf PathFinder) GameCoordsToScreenCords(playerX, playerY, destinationX, destinationY int) (int, int) { // Calculate diff between current player position and destination diffX := destinationX - playerX diffY := destinationY - playerY - // Transform cartesian movement (world) to isometric (screen)e + // Transform cartesian movement (world) to isometric (screen) // Helpful documentation: https://clintbellanger.net/articles/isometric_math/ - screenX := int((float32(diffX-diffY) * 19.8) + float32(hid.GameAreaSizeX/2)) - screenY := int((float32(diffX+diffY) * 9.9) + float32(hid.GameAreaSizeY/2)) + screenX := int((float32(diffX-diffY) * 19.8) + float32(pf.gr.GameAreaSizeX/2)) + screenY := int((float32(diffX+diffY) * 9.9) + float32(pf.gr.GameAreaSizeY/2)) return screenX, screenY } -func DistanceFromMe(d data.Data, p data.Position) int { - return DistanceFromPoint(d.PlayerUnit.Position, p) -} - -func DistanceFromPoint(from data.Position, to data.Position) int { - first := math.Pow(float64(to.X-from.X), 2) - second := math.Pow(float64(to.Y-from.Y), 2) - - return int(math.Sqrt(first + second)) -} - -func RandomMovement() { - midGameX := hid.GameAreaSizeX / 2 - midGameY := hid.GameAreaSizeY / 2 +func (pf PathFinder) RandomMovement() { + midGameX := pf.gr.GameAreaSizeX / 2 + midGameY := pf.gr.GameAreaSizeY / 2 x := midGameX + rand.Intn(midGameX) - (midGameX / 2) y := midGameY + rand.Intn(midGameY) - (midGameY / 2) - hid.Click(hid.LeftButton, x, y) + pf.hid.Click(game.LeftButton, x, y) } func relativePosition(d data.Data, p data.Position, cgOffset data.Position) (int, int) { diff --git a/internal/pather/path_finding_tools.go b/internal/pather/path_finding_tools.go index 20ff4321f..b5f626af5 100644 --- a/internal/pather/path_finding_tools.go +++ b/internal/pather/path_finding_tools.go @@ -6,6 +6,7 @@ import ( "image/color" "image/draw" "image/png" + "math" "os" "github.com/beefsack/go-astar" @@ -180,3 +181,14 @@ func IsNarrowMap(a area.Area) bool { return false } + +func DistanceFromMe(d data.Data, p data.Position) int { + return DistanceFromPoint(d.PlayerUnit.Position, p) +} + +func DistanceFromPoint(from data.Position, to data.Position) int { + first := math.Pow(float64(to.X-from.X), 2) + second := math.Pow(float64(to.Y-from.Y), 2) + + return int(math.Sqrt(first + second)) +} diff --git a/internal/reader/reader.go b/internal/reader/reader.go deleted file mode 100644 index a38e9155a..000000000 --- a/internal/reader/reader.go +++ /dev/null @@ -1,69 +0,0 @@ -package reader - -import ( - "fmt" - "github.com/hectorgimenez/d2go/pkg/data" - "github.com/hectorgimenez/d2go/pkg/memory" - "github.com/hectorgimenez/d2go/pkg/utils" - "github.com/hectorgimenez/koolo/internal/config" - "github.com/hectorgimenez/koolo/internal/reader/map_client" - "strconv" -) - -var CachedMapData map_client.MapData - -type GameReader struct { - *memory.GameReader - cachedMapSeed uint -} - -func (gd *GameReader) GetData(isNewGame bool) data.Data { - d := gd.GameReader.GetData() - - if isNewGame { - playerUnitPtr, _ := gd.GameReader.GetPlayerUnitPtr(d.Roster) - gd.cachedMapSeed, _ = gd.getMapSeed(playerUnitPtr) - CachedMapData = map_client.GetMapData(strconv.Itoa(int(gd.cachedMapSeed)), config.Config.Game.Difficulty) - } - - origin := CachedMapData.Origin(d.PlayerUnit.Area) - npcs, exits, objects, rooms := CachedMapData.NPCsExitsAndObjects(origin, d.PlayerUnit.Area) - // This hacky thing is because sometimes if the objects are far away we can not fetch them, basically WP. - memObjects := gd.Objects(d.PlayerUnit.Position, d.HoverData) - for _, clientObject := range objects { - found := false - for _, obj := range memObjects { - if obj.Name == clientObject.Name { - found = true - } - } - if !found { - memObjects = append(memObjects, clientObject) - } - } - - d.AreaOrigin = origin - d.NPCs = npcs - d.AdjacentLevels = exits - d.Rooms = rooms - d.Objects = memObjects - d.CollisionGrid = CachedMapData.CollisionGrid(d.PlayerUnit.Area) - - return d -} - -func (gd *GameReader) getMapSeed(playerUnit uintptr) (uint, error) { - actPtr := uintptr(gd.Process.ReadUInt(playerUnit+0x20, memory.Uint64)) - actMiscPtr := uintptr(gd.Process.ReadUInt(actPtr+0x78, memory.Uint64)) - - dwInitSeedHash1 := uintptr(gd.Process.ReadUInt(actMiscPtr+0x840, memory.Uint32)) - //dwInitSeedHash2 := uintptr(gd.Process.ReadUInt(actMiscPtr+0x844, memory.Uint32)) - dwEndSeedHash1 := uintptr(gd.Process.ReadUInt(actMiscPtr+0x868, memory.Uint32)) - - mapSeed, found := utils.GetMapSeed(uint(dwInitSeedHash1), uint(dwEndSeedHash1)) - if !found { - return 0, fmt.Errorf("error calculating map seed") - } - - return mapSeed, nil -} diff --git a/internal/remote/discord/discord_bot.go b/internal/remote/discord/discord_bot.go index 4ce52b699..da4a2b688 100644 --- a/internal/remote/discord/discord_bot.go +++ b/internal/remote/discord/discord_bot.go @@ -3,22 +3,16 @@ package discord import ( "context" "fmt" - "strings" - - koolo "github.com/hectorgimenez/koolo/internal" - "github.com/bwmarrin/discordgo" - "github.com/hectorgimenez/koolo/internal/event/stat" + "strings" ) type Bot struct { discordSession *discordgo.Session channelID string - supervisor koolo.Supervisor - companion koolo.Companion } -func NewBot(token, channelID string, supervisor koolo.Supervisor, companion koolo.Companion) (*Bot, error) { +func NewBot(token, channelID string) (*Bot, error) { dg, err := discordgo.New("Bot " + token) if err != nil { return nil, fmt.Errorf("error creating Discord session: %w", err) @@ -27,8 +21,6 @@ func NewBot(token, channelID string, supervisor koolo.Supervisor, companion kool return &Bot{ discordSession: dg, channelID: channelID, - supervisor: supervisor, - companion: companion, }, nil } @@ -45,12 +37,13 @@ func (b *Bot) Start(ctx context.Context) error { return b.discordSession.Close() } + func (b *Bot) onMessageCreated(s *discordgo.Session, m *discordgo.MessageCreate) { if strings.Contains(m.Content, "New game created.") { gameData := strings.SplitAfter(m.Content, "GameName: ") gameData = strings.Split(gameData[1], "|||") - b.companion.JoinGame(gameData[0], gameData[1]) + //b.companion.JoinGame(gameData[0], gameData[1]) } if m.Author.ID == s.State.User.ID { @@ -63,28 +56,28 @@ func (b *Bot) onMessageCreated(s *discordgo.Session, m *discordgo.MessageCreate) case "start": // TODO: Implement case "stop": - b.supervisor.Stop() + //b.supervisor.Stop() } } func (b *Bot) publishStats() { - msg := "Run | Items | Deaths | Chickens | Merc Chickens | Errors | Healing Pots | Mana Pots | Reju Pots | Merc Pots \n" - for run, st := range stat.Status.RunStats { - msg += fmt.Sprintf( - "%s | %d | %d | %d | %d | %d | %d | %d| %d | %d | %d \n", - run, - len(st.ItemsFound), - st.Kills, - st.Deaths, - st.Chickens, - st.MerChicken, - st.Errors, - st.HealingPotionsUsed, - st.ManaPotionsUsed, - st.RejuvPotionsUsed, - st.MercHealingPotionsUsed, - ) - } - - b.discordSession.ChannelMessageSend(b.channelID, msg) + //msg := "Run | Items | Deaths | Chickens | Merc Chickens | Errors | Healing Pots | Mana Pots | Reju Pots | Merc Pots \n" + //for run, st := range stat.Status.RunStats { + // msg += fmt.Sprintf( + // "%s | %d | %d | %d | %d | %d | %d | %d| %d | %d | %d \n", + // run, + // len(st.ItemsFound), + // st.Kills, + // st.Deaths, + // st.Chickens, + // st.MerChicken, + // st.Errors, + // st.HealingPotionsUsed, + // st.ManaPotionsUsed, + // st.RejuvPotionsUsed, + // st.MercHealingPotionsUsed, + // ) + //} + // + //b.discordSession.ChannelMessageSend(b.channelID, msg) } diff --git a/internal/remote/discord/discord_event_handler.go b/internal/remote/discord/discord_event_handler.go index 91c39df64..ccfd4174c 100644 --- a/internal/remote/discord/discord_event_handler.go +++ b/internal/remote/discord/discord_event_handler.go @@ -8,23 +8,23 @@ import ( "image/jpeg" ) -func (b *Bot) Handle(_ context.Context, m event.Message) error { - if m.Image != nil { +func (b *Bot) Handle(_ context.Context, e event.Event) error { + if e.Image() != nil { buf := new(bytes.Buffer) - err := jpeg.Encode(buf, m.Image, &jpeg.Options{Quality: 80}) + err := jpeg.Encode(buf, e.Image(), &jpeg.Options{Quality: 80}) if err != nil { return err } _, err = b.discordSession.ChannelMessageSendComplex(b.channelID, &discordgo.MessageSend{ File: &discordgo.File{Name: "Screenshot.jpeg", ContentType: "image/jpeg", Reader: buf}, - Content: m.Message, + Content: e.Message(), }) return err } - _, err := b.discordSession.ChannelMessageSend(b.channelID, m.Message) + _, err := b.discordSession.ChannelMessageSend(b.channelID, e.Message()) return err } diff --git a/internal/remote/telegram/telegram_bot.go b/internal/remote/telegram/telegram_bot.go index 2caad8bc0..188b1e48f 100644 --- a/internal/remote/telegram/telegram_bot.go +++ b/internal/remote/telegram/telegram_bot.go @@ -2,33 +2,28 @@ package telegram import ( "context" - "fmt" "log/slog" "strings" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" - koolo "github.com/hectorgimenez/koolo/internal" - "github.com/hectorgimenez/koolo/internal/event/stat" ) type Bot struct { - bot *tgbotapi.BotAPI - chatID int64 - logger *slog.Logger - sueprvisor koolo.Supervisor + bot *tgbotapi.BotAPI + chatID int64 + logger *slog.Logger } -func NewBot(token string, chatID int64, logger *slog.Logger, supervisor koolo.Supervisor) (*Bot, error) { +func NewBot(token string, chatID int64, logger *slog.Logger) (*Bot, error) { bot, err := tgbotapi.NewBotAPI(token) if err != nil { return nil, err } return &Bot{ - bot: bot, - chatID: chatID, - logger: logger, - sueprvisor: supervisor, + bot: bot, + chatID: chatID, + logger: logger, }, nil } @@ -51,7 +46,7 @@ func (b *Bot) Start(_ context.Context) error { case "start": // TODO: Implement case "stop": - b.sueprvisor.Stop() + //b.sueprvisor.Stop() } } } @@ -75,25 +70,26 @@ func (b *Bot) getLatestOffset() (int, error) { } func (b *Bot) publishStats() error { - msg := "Run | Items | Deaths | Chickens | Merc Chickens | Errors | Healing Pots | Mana Pots | Reju Pots | Merc Pots \n" - for run, st := range stat.Status.RunStats { - msg += fmt.Sprintf( - "%s | %d | %d | %d | %d | %d | %d | %d| %d | %d | %d \n", - run, - len(st.ItemsFound), - st.Kills, - st.Deaths, - st.Chickens, - st.MerChicken, - st.Errors, - st.HealingPotionsUsed, - st.ManaPotionsUsed, - st.RejuvPotionsUsed, - st.MercHealingPotionsUsed, - ) - } - - _, err := b.bot.Send(tgbotapi.NewMessage(b.chatID, msg)) - - return err + return nil + //msg := "Run | Items | Deaths | Chickens | Merc Chickens | Errors | Healing Pots | Mana Pots | Reju Pots | Merc Pots \n" + //for run, st := range stat.Status.RunStats { + // msg += fmt.Sprintf( + // "%s | %d | %d | %d | %d | %d | %d | %d| %d | %d | %d \n", + // run, + // len(st.ItemsFound), + // st.Kills, + // st.Deaths, + // st.Chickens, + // st.MerChicken, + // st.Errors, + // st.HealingPotionsUsed, + // st.ManaPotionsUsed, + // st.RejuvPotionsUsed, + // st.MercHealingPotionsUsed, + // ) + //} + // + //_, err := b.bot.Send(tgbotapi.NewMessage(b.chatID, msg)) + // + //return err } diff --git a/internal/remote/telegram/telegram_event_handler.go b/internal/remote/telegram/telegram_event_handler.go index fe7d9e7b5..4582c4f0b 100644 --- a/internal/remote/telegram/telegram_event_handler.go +++ b/internal/remote/telegram/telegram_event_handler.go @@ -9,26 +9,26 @@ import ( "github.com/hectorgimenez/koolo/internal/event" ) -func (b *Bot) Handle(_ context.Context, m event.Message) error { - if m.Image != nil { +func (b *Bot) Handle(_ context.Context, e event.Event) error { + if e.Image() != nil { buf := new(bytes.Buffer) - err := jpeg.Encode(buf, m.Image, nil) + err := jpeg.Encode(buf, e.Image(), nil) if err != nil { return err } photo := tgbotapi.NewPhoto(b.chatID, tgbotapi.FileBytes{ - Name: m.Message, + Name: e.Message(), Bytes: buf.Bytes(), }) - photo.Caption = m.Message + photo.Caption = e.Message() _, err = b.bot.Send(photo) return err } - _, err := b.bot.Send(tgbotapi.NewMessage(b.chatID, m.Message)) + _, err := b.bot.Send(tgbotapi.NewMessage(b.chatID, e.Message())) return err } diff --git a/internal/run/ancient_tunnels.go b/internal/run/ancient_tunnels.go index 19a49ded1..00358f714 100644 --- a/internal/run/ancient_tunnels.go +++ b/internal/run/ancient_tunnels.go @@ -5,7 +5,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" ) type AncientTunnels struct { @@ -22,9 +21,9 @@ func (a AncientTunnels) BuildActions() []action.Action { a.builder.MoveToArea(area.AncientTunnels), // Travel to ancient tunnels } - if config.Config.Companion.Enabled && config.Config.Companion.Leader { + if a.CharacterCfg.Companion.Enabled && a.CharacterCfg.Companion.Leader { actions = append(actions, action.NewStepChain(func(_ data.Data) []step.Step { - return []step.Step{step.OpenPortal()} + return []step.Step{step.OpenPortal(a.CharacterCfg.Bindings.TP)} })) } diff --git a/internal/run/arachnid_lair.go b/internal/run/arachnid_lair.go index 5d5157416..186777fbc 100644 --- a/internal/run/arachnid_lair.go +++ b/internal/run/arachnid_lair.go @@ -5,7 +5,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" ) type ArachnidLair struct { @@ -22,9 +21,9 @@ func (a ArachnidLair) BuildActions() []action.Action { a.builder.MoveToArea(area.SpiderCave), // Travel to ArachnidLair } - if config.Config.Companion.Enabled && config.Config.Companion.Leader { + if a.CharacterCfg.Companion.Enabled && a.CharacterCfg.Companion.Leader { actions = append(actions, action.NewStepChain(func(_ data.Data) []step.Step { - return []step.Step{step.OpenPortal()} + return []step.Step{step.OpenPortal(a.CharacterCfg.Bindings.TP)} })) } diff --git a/internal/run/baal.go b/internal/run/baal.go index c10dc95fd..e2278c75e 100644 --- a/internal/run/baal.go +++ b/internal/run/baal.go @@ -8,7 +8,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/npc" "github.com/hectorgimenez/d2go/pkg/data/object" "github.com/hectorgimenez/koolo/internal/action" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -39,7 +38,7 @@ func (s Baal) BuildActions() (actions []action.Action) { ) // Let's move to a safe area and open the portal in companion mode - if config.Config.Companion.Enabled && config.Config.Companion.Leader { + if s.CharacterCfg.Companion.Enabled && s.CharacterCfg.Companion.Leader { actions = append(actions, s.builder.MoveToCoords(data.Position{ X: 15116, @@ -81,7 +80,7 @@ func (s Baal) BuildActions() (actions []action.Action) { actions = append(actions, s.builder.ItemPickup(false, 30)) _, isLevelingChar := s.char.(action.LevelingCharacter) - if config.Config.Game.Baal.KillBaal || isLevelingChar { + if s.CharacterCfg.Game.Baal.KillBaal || isLevelingChar { actions = append(actions, s.builder.Wait(time.Second*10), s.builder.Buff(), diff --git a/internal/run/companion.go b/internal/run/companion.go index f44ffd807..2cf2cdd35 100644 --- a/internal/run/companion.go +++ b/internal/run/companion.go @@ -7,7 +7,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/pather" "github.com/hectorgimenez/koolo/internal/town" "time" @@ -26,9 +25,9 @@ func (s Companion) Name() string { func (s Companion) BuildActions() []action.Action { return []action.Action{ action.NewChain(func(d data.Data) []action.Action { - leaderRosterMember, leaderFound := d.Roster.FindByName(config.Config.Companion.LeaderName) + leaderRosterMember, leaderFound := d.Roster.FindByName(s.CharacterCfg.Companion.LeaderName) if !leaderFound { - s.logger.Warn(fmt.Sprintf("Leader not found: %s", config.Config.Companion.LeaderName)) + s.logger.Warn(fmt.Sprintf("Leader not found: %s", s.CharacterCfg.Companion.LeaderName)) return []action.Action{} } @@ -121,7 +120,7 @@ func (s Companion) BuildActions() []action.Action { return []action.Action{ action.NewStepChain(func(d data.Data) []step.Step { - return []step.Step{step.MoveTo(leaderRosterMember.Position, step.WithTimeout(time.Millisecond*500))} + return []step.Step{step.MoveTo(s.CharacterCfg, leaderRosterMember.Position, step.WithTimeout(time.Millisecond*500))} }), } }, action.RepeatUntilNoSteps()), diff --git a/internal/run/diablo.go b/internal/run/diablo.go index 47a672354..e9b0bc50b 100644 --- a/internal/run/diablo.go +++ b/internal/run/diablo.go @@ -10,7 +10,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/object" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/health" "github.com/hectorgimenez/koolo/internal/pather" ) @@ -52,7 +51,7 @@ func (a Diablo) BuildActions() (actions []action.Action) { actions = append(actions, action.NewChain(func(d data.Data) []action.Action { _, isLevelingChar := a.char.(action.LevelingCharacter) - if isLevelingChar && (a.bm.ShouldBuyPotions(d) || (config.Config.Character.UseMerc && d.MercHPPercent() <= 0)) { + if isLevelingChar && (a.bm.ShouldBuyPotions(d) || (a.CharacterCfg.Character.UseMerc && d.MercHPPercent() <= 0)) { a.logger.Debug("Let's go back town to buy more pots", slog.Int("seal", sealNumber+1)) return a.builder.InRunReturnTownRoutine() } @@ -108,7 +107,7 @@ func (a Diablo) BuildActions() (actions []action.Action) { } if time.Since(lastInteractionAt) > time.Second*3 { lastInteractionAt = time.Now() - pather.RandomMovement() + a.PathFinder.RandomMovement() time.Sleep(time.Second) } return false @@ -149,7 +148,7 @@ func (a Diablo) BuildActions() (actions []action.Action) { actions = append(actions, a.char.KillMonsterSequence(func(d data.Data) (data.UnitID, bool) { for _, m := range d.Monsters.Enemies(data.MonsterEliteFilter()) { if a.isSealElite(m) { - _, _, found := pather.GetPath(d, m.Position) + _, _, found := a.PathFinder.GetPath(d, m.Position) return m.UnitID, found } } @@ -164,7 +163,7 @@ func (a Diablo) BuildActions() (actions []action.Action) { // Go back to town to buy potions if needed actions = append(actions, action.NewChain(func(d data.Data) []action.Action { _, isLevelingChar := a.char.(action.LevelingCharacter) - if isLevelingChar && (a.bm.ShouldBuyPotions(d) || (config.Config.Character.UseMerc && d.MercHPPercent() <= 0)) { + if isLevelingChar && (a.bm.ShouldBuyPotions(d) || (a.CharacterCfg.Character.UseMerc && d.MercHPPercent() <= 0)) { return a.builder.InRunReturnTownRoutine() } diff --git a/internal/run/leveling.go b/internal/run/leveling.go index 68a3cc9ae..1b36fbe93 100644 --- a/internal/run/leveling.go +++ b/internal/run/leveling.go @@ -3,14 +3,12 @@ package run import ( "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/health" - "github.com/hectorgimenez/koolo/internal/reader" ) const NameLeveling = "Leveling" type Leveling struct { baseRun - gr *reader.GameReader bm health.BeltManager } diff --git a/internal/run/leveling_act1.go b/internal/run/leveling_act1.go index acca4c32a..4530876ff 100644 --- a/internal/run/leveling_act1.go +++ b/internal/run/leveling_act1.go @@ -10,9 +10,8 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/game" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/ui" ) @@ -168,7 +167,7 @@ func (a Leveling) andariel(d data.Data) []action.Action { action.NewStepChain(func(d data.Data) []step.Step { return []step.Step{ step.SyncStep(func(d data.Data) error { - hid.PressKey(config.Config.Bindings.OpenInventory) + a.HID.PressKey(a.CharacterCfg.Bindings.OpenInventory) x := 0 for _, itm := range d.Items.ByLocation(item.LocationInventory) { if itm.Name != "AntidotePotion" { @@ -179,16 +178,16 @@ func (a Leveling) andariel(d data.Data) []action.Action { helper.Sleep(500) if x > 3 { - hid.Click(hid.LeftButton, pos.X, pos.Y) + a.HID.Click(game.LeftButton, pos.X, pos.Y) helper.Sleep(300) - hid.Click(hid.LeftButton, ui.MercAvatarPositionX, ui.MercAvatarPositionY) + a.HID.Click(game.LeftButton, ui.MercAvatarPositionX, ui.MercAvatarPositionY) } else { - hid.Click(hid.RightButton, pos.X, pos.Y) + a.HID.Click(game.RightButton, pos.X, pos.Y) } x++ } - hid.PressKey("esc") + a.HID.PressKey("esc") return nil }), } diff --git a/internal/run/leveling_act2.go b/internal/run/leveling_act2.go index 780248902..3778bed89 100644 --- a/internal/run/leveling_act2.go +++ b/internal/run/leveling_act2.go @@ -10,11 +10,9 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/game" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/pather" - "github.com/hectorgimenez/koolo/internal/reader" "github.com/hectorgimenez/koolo/internal/ui" ) @@ -177,9 +175,9 @@ func (a Leveling) prepareStaff() action.Action { step.SyncStep(func(d data.Data) error { screenPos := ui.GetScreenCoordsForItem(horadricStaff) - hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) + a.HID.ClickWithModifier(game.LeftButton, screenPos.X, screenPos.Y, game.CtrlKey) helper.Sleep(300) - hid.PressKey("esc") + a.HID.PressKey("esc") return nil }), ), @@ -213,7 +211,7 @@ func (a Leveling) duriel(staffAlreadyUsed bool, d data.Data) (actions []action.A var realTomb area.Area for _, tomb := range talRashaTombs { - _, _, objects, _ := reader.CachedMapData.NPCsExitsAndObjects(data.Position{}, tomb) + _, _, objects, _ := a.Reader.CachedMapData.NPCsExitsAndObjects(data.Position{}, tomb) for _, obj := range objects { if obj.Name == object.HoradricOrifice { realTomb = tomb @@ -255,11 +253,11 @@ func (a Leveling) duriel(staffAlreadyUsed bool, d data.Data) (actions []action.A screenPos := ui.GetScreenCoordsForItem(staff) - hid.Click(hid.LeftButton, screenPos.X, screenPos.Y) + a.HID.Click(game.LeftButton, screenPos.X, screenPos.Y) helper.Sleep(300) - hid.Click(hid.LeftButton, ui.AnvilCenterX, ui.AnvilCenterY) + a.HID.Click(game.LeftButton, ui.AnvilCenterX, ui.AnvilCenterY) helper.Sleep(500) - hid.Click(hid.LeftButton, ui.AnvilBtnX, ui.AnvilBtnY) + a.HID.Click(game.LeftButton, ui.AnvilBtnX, ui.AnvilBtnY) helper.Sleep(20000) return nil @@ -286,7 +284,7 @@ func (a Leveling) duriel(staffAlreadyUsed bool, d data.Data) (actions []action.A action.NewStepChain(func(d data.Data) []step.Step { return []step.Step{ step.SyncStep(func(d data.Data) error { - hid.PressKey(config.Config.Bindings.OpenInventory) + a.HID.PressKey(a.CharacterCfg.Bindings.OpenInventory) x := 0 for _, itm := range d.Items.ByLocation(item.LocationInventory) { if itm.Name != "ThawingPotion" { @@ -297,16 +295,16 @@ func (a Leveling) duriel(staffAlreadyUsed bool, d data.Data) (actions []action.A helper.Sleep(500) if x > 3 { - hid.Click(hid.LeftButton, pos.X, pos.Y) + a.HID.Click(game.LeftButton, pos.X, pos.Y) helper.Sleep(300) - hid.Click(hid.LeftButton, ui.MercAvatarPositionX, ui.MercAvatarPositionY) + a.HID.Click(game.LeftButton, ui.MercAvatarPositionX, ui.MercAvatarPositionY) } else { - hid.Click(hid.RightButton, pos.X, pos.Y) + a.HID.Click(game.RightButton, pos.X, pos.Y) } x++ } - hid.PressKey("esc") + a.HID.PressKey("esc") return nil }), } diff --git a/internal/run/leveling_act3.go b/internal/run/leveling_act3.go index 9a1887930..19ece56b0 100644 --- a/internal/run/leveling_act3.go +++ b/internal/run/leveling_act3.go @@ -3,6 +3,7 @@ package run import ( "github.com/hectorgimenez/d2go/pkg/data/npc" "github.com/hectorgimenez/d2go/pkg/data/quest" + "github.com/hectorgimenez/koolo/internal/game" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -11,9 +12,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/object" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/ui" ) @@ -191,13 +190,13 @@ func (a Leveling) openMephistoStairs() []action.Action { return nil } - hid.PressKey(config.Config.Bindings.SwapWeapon) + a.HID.PressKey(a.CharacterCfg.Bindings.SwapWeapon) helper.Sleep(1000) - hid.PressKey(config.Config.Bindings.OpenInventory) + a.HID.PressKey(a.CharacterCfg.Bindings.OpenInventory) screenPos := ui.GetScreenCoordsForItem(khalimsWill) - hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.ShiftKey) + a.HID.ClickWithModifier(game.LeftButton, screenPos.X, screenPos.Y, game.ShiftKey) helper.Sleep(300) - hid.PressKey("esc") + a.HID.PressKey("esc") return nil }), } @@ -210,7 +209,7 @@ func (a Leveling) openMephistoStairs() []action.Action { }, step.SyncStep(func(d data.Data) error { helper.Sleep(1000) - hid.PressKey(config.Config.Bindings.SwapWeapon) + a.HID.PressKey(a.CharacterCfg.Bindings.SwapWeapon) return nil })), a.builder.Wait(time.Second*12), diff --git a/internal/run/leveling_act5.go b/internal/run/leveling_act5.go index 6130976cf..646c152bf 100644 --- a/internal/run/leveling_act5.go +++ b/internal/run/leveling_act5.go @@ -10,9 +10,8 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/game" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/ui" "time" ) @@ -28,14 +27,14 @@ func (a Leveling) act5() action.Action { actions := Baal{baseRun: a.baseRun}.BuildActions() return append(actions, action.NewStepChain(func(d data.Data) []step.Step { if d.PlayerUnit.Area == area.TheWorldstoneChamber && len(d.Monsters.Enemies()) == 0 { - switch config.Config.Game.Difficulty { + switch a.CharacterCfg.Game.Difficulty { case difficulty.Normal: if d.PlayerUnit.Stats[stat.Level] >= 46 { - config.Config.Game.Difficulty = difficulty.Nightmare + a.CharacterCfg.Game.Difficulty = difficulty.Nightmare } case difficulty.Nightmare: if d.PlayerUnit.Stats[stat.Level] >= 65 { - config.Config.Game.Difficulty = difficulty.Hell + a.CharacterCfg.Game.Difficulty = difficulty.Hell } } } @@ -85,13 +84,13 @@ func (a Leveling) anya() []action.Action { a.builder.Wait(time.Second * 8), a.builder.InteractNPC(npc.Malah, step.SyncStep(func(d data.Data) error { - hid.PressKey("esc") - hid.PressKey(config.Config.Bindings.OpenInventory) + a.HID.PressKey("esc") + a.HID.PressKey(a.CharacterCfg.Bindings.OpenInventory) itm, _ := d.Items.Find("ScrollOfResistance") screenPos := ui.GetScreenCoordsForItem(itm) helper.Sleep(200) - hid.Click(hid.RightButton, screenPos.X, screenPos.Y) - hid.PressKey("esc") + a.HID.Click(game.RightButton, screenPos.X, screenPos.Y) + a.HID.PressKey("esc") return nil }), @@ -117,7 +116,7 @@ func (a Leveling) ancients() []action.Action { if len(d.Monsters.Enemies()) > 0 { return true } - hid.Click(hid.LeftButton, 300, 300) + a.HID.Click(game.LeftButton, 300, 300) helper.Sleep(1000) return false }), diff --git a/internal/run/mephisto.go b/internal/run/mephisto.go index 02f5c437a..52c912ae5 100644 --- a/internal/run/mephisto.go +++ b/internal/run/mephisto.go @@ -5,7 +5,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/npc" "github.com/hectorgimenez/koolo/internal/action" - "github.com/hectorgimenez/koolo/internal/config" ) var mephistoSafePosition = data.Position{ @@ -29,13 +28,13 @@ func (m Mephisto) BuildActions() []action.Action { m.char.KillMephisto(), // Kill Mephisto } - if config.Config.Game.Mephisto.KillCouncilMembers || config.Config.Game.Mephisto.OpenChests { + if m.CharacterCfg.Game.Mephisto.KillCouncilMembers || m.CharacterCfg.Game.Mephisto.OpenChests { actions = append(actions, m.builder.ItemPickup(true, 40), - m.builder.ClearArea(config.Config.Game.Mephisto.OpenChests, func(monsters data.Monsters) []data.Monster { + m.builder.ClearArea(m.CharacterCfg.Game.Mephisto.OpenChests, func(monsters data.Monsters) []data.Monster { councilMembers := make([]data.Monster, 0) // Let's skip all the monsters in case we don't want to kill them but open chests - if !config.Config.Game.Mephisto.KillCouncilMembers { + if !m.CharacterCfg.Game.Mephisto.KillCouncilMembers { return councilMembers } diff --git a/internal/run/nihlathak.go b/internal/run/nihlathak.go index c479d56b3..4f36d7455 100644 --- a/internal/run/nihlathak.go +++ b/internal/run/nihlathak.go @@ -6,7 +6,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/object" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/pather" "log/slog" ) @@ -32,7 +31,7 @@ func (a Nihlathak) BuildActions() (actions []action.Action) { for _, o := range d.Objects { if o.Name == object.NihlathakWildernessStartPositionName { nilaO = o - return []step.Step{step.MoveTo(o.Position, step.StopAtDistance(40))} + return []step.Step{step.MoveTo(a.CharacterCfg, o.Position, step.StopAtDistance(40))} } } @@ -75,14 +74,14 @@ func (a Nihlathak) BuildActions() (actions []action.Action) { } a.logger.Debug("Moving to corner", slog.Int("corner", bestCorner), slog.Int("averageDistance", bestCornerDistance)) - return []step.Step{step.MoveTo(corners[bestCorner])} + return []step.Step{step.MoveTo(a.CharacterCfg, corners[bestCorner])} })) // Kill Nihlathak actions = append(actions, a.char.KillNihlathak()) // Clear monsters around the area, sometimes it makes difficult to pickup items if there are many monsters around the area - if config.Config.Game.Nihlathak.ClearArea { + if a.CharacterCfg.Game.Nihlathak.ClearArea { actions = append(actions, a.char.KillMonsterSequence(func(d data.Data) (data.UnitID, bool) { for _, m := range d.Monsters.Enemies() { if d := pather.DistanceFromPoint(nilaO.Position, m.Position); d < 15 { diff --git a/internal/run/pit.go b/internal/run/pit.go index e64b537ab..40feaa22a 100644 --- a/internal/run/pit.go +++ b/internal/run/pit.go @@ -5,7 +5,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" ) type Pit struct { @@ -26,9 +25,9 @@ func (a Pit) BuildActions() (actions []action.Action) { a.logger.Info("Travel to pit level 1") actions = append(actions, a.builder.MoveToArea(area.PitLevel1)) - if config.Config.Companion.Enabled && config.Config.Companion.Leader { + if a.CharacterCfg.Companion.Enabled && a.CharacterCfg.Companion.Leader { actions = append(actions, action.NewStepChain(func(_ data.Data) []step.Step { - return []step.Step{step.OpenPortal()} + return []step.Step{step.OpenPortal(a.CharacterCfg.Bindings.TP)} })) } diff --git a/internal/run/run.go b/internal/run/run.go index 52dd55418..fe9969c6f 100644 --- a/internal/run/run.go +++ b/internal/run/run.go @@ -1,14 +1,13 @@ package run import ( + "github.com/hectorgimenez/koolo/internal/container" "log/slog" "strings" "time" "github.com/hectorgimenez/koolo/internal/action" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/health" - "github.com/hectorgimenez/koolo/internal/reader" ) type Run interface { @@ -20,43 +19,45 @@ type baseRun struct { builder *action.Builder char action.Character logger *slog.Logger + container.Container } type Factory struct { - logger *slog.Logger - builder *action.Builder - char action.Character - gr *reader.GameReader - bm health.BeltManager + logger *slog.Logger + builder *action.Builder + char action.Character + container container.Container + bm health.BeltManager } -func NewFactory(logger *slog.Logger, builder *action.Builder, char action.Character, gr *reader.GameReader, bm health.BeltManager) *Factory { +func NewFactory(logger *slog.Logger, builder *action.Builder, char action.Character, bm health.BeltManager, container container.Container) *Factory { return &Factory{ - logger: logger, - builder: builder, - char: char, - gr: gr, - bm: bm, + logger: logger, + builder: builder, + char: char, + bm: bm, + container: container, } } func (f *Factory) BuildRuns() (runs []Run) { t := time.Now() f.logger.Debug("Fetching map data...") - d := f.gr.GetData(true) + d := f.container.Reader.GetData(true) f.logger.Debug("Fetch completed", slog.Int64("ms", time.Since(t).Milliseconds())) baseRun := baseRun{ - builder: f.builder, - char: f.char, - logger: f.logger, + builder: f.builder, + char: f.char, + logger: f.logger, + Container: f.container, } - if config.Config.Companion.Enabled && !config.Config.Companion.Leader { + if f.container.CharacterCfg.Companion.Enabled && !f.container.CharacterCfg.Companion.Leader { return []Run{Companion{baseRun: baseRun}} } - for _, run := range config.Config.Game.Runs { + for _, run := range f.container.CharacterCfg.Game.Runs { // Prepend terror zone runs, we want to run it always first if run == "terror_zone" { tz := TerrorZone{baseRun: baseRun} @@ -64,14 +65,14 @@ func (f *Factory) BuildRuns() (runs []Run) { if len(tz.AvailableTZs(d)) > 0 { runs = append(runs, tz) // If we are skipping other runs, we can return here - if config.Config.Game.TerrorZone.SkipOtherRuns { + if f.container.CharacterCfg.Game.TerrorZone.SkipOtherRuns { return runs } } } } - for _, run := range config.Config.Game.Runs { + for _, run := range f.container.CharacterCfg.Game.Runs { run = strings.ToLower(run) switch run { case "countess": @@ -95,7 +96,7 @@ func (f *Factory) BuildRuns() (runs []Run) { }) case "pindleskin": runs = append(runs, Pindleskin{ - SkipOnImmunities: config.Config.Game.Pindleskin.SkipOnImmunities, + SkipOnImmunities: f.container.CharacterCfg.Game.Pindleskin.SkipOnImmunities, baseRun: baseRun, }) case "nihlathak": @@ -117,7 +118,7 @@ func (f *Factory) BuildRuns() (runs []Run) { case "tal_rasha_tombs": runs = append(runs, TalRashaTombs{baseRun}) case "leveling": - runs = append(runs, Leveling{baseRun, f.gr, f.bm}) + runs = append(runs, Leveling{baseRun: baseRun, bm: f.bm}) case "cows": runs = append(runs, Cows{baseRun}) } diff --git a/internal/run/stony_tomb.go b/internal/run/stony_tomb.go index 7fcd8f0a5..29bf0b709 100644 --- a/internal/run/stony_tomb.go +++ b/internal/run/stony_tomb.go @@ -5,7 +5,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" ) type StonyTomb struct { @@ -23,9 +22,9 @@ func (a StonyTomb) BuildActions() (actions []action.Action) { a.builder.MoveToArea(area.StonyTombLevel1), ) - if config.Config.Companion.Enabled && config.Config.Companion.Leader { + if a.CharacterCfg.Companion.Enabled && a.CharacterCfg.Companion.Leader { actions = append(actions, action.NewStepChain(func(_ data.Data) []step.Step { - return []step.Step{step.OpenPortal()} + return []step.Step{step.OpenPortal(a.CharacterCfg.Bindings.TP)} })) } diff --git a/internal/run/terror_zone.go b/internal/run/terror_zone.go index f7f48c34c..5c6d2d650 100644 --- a/internal/run/terror_zone.go +++ b/internal/run/terror_zone.go @@ -5,7 +5,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/action" - "github.com/hectorgimenez/koolo/internal/config" "log/slog" ) @@ -70,7 +69,7 @@ func (a TerrorZone) BuildActions() (actions []action.Action) { func (a TerrorZone) AvailableTZs(d data.Data) []area.Area { var availableTZs []area.Area for _, tz := range d.TerrorZones { - for _, tzArea := range config.Config.Game.TerrorZone.Areas { + for _, tzArea := range a.CharacterCfg.Game.TerrorZone.Areas { if tz == tzArea { availableTZs = append(availableTZs, tz) } @@ -95,7 +94,7 @@ func (a TerrorZone) buildTZAction(dstArea area.Area) action.Action { for _, terrorizedArea := range d.TerrorZones { if terrorizedArea == dstArea { // Skip areas that are not selected in the configuration - for _, tz := range config.Config.Game.TerrorZone.Areas { + for _, tz := range a.CharacterCfg.Game.TerrorZone.Areas { if tz == dstArea { clearArea = true } @@ -105,7 +104,7 @@ func (a TerrorZone) buildTZAction(dstArea area.Area) action.Action { if clearArea { a.logger.Debug("Clearing TZ area", slog.Any("area", dstArea)) - actions = append(actions, a.builder.ClearArea(true, customTZEnemyFilter(config.Config.Game.TerrorZone.SkipOnImmunities...))) + actions = append(actions, a.builder.ClearArea(true, a.customTZEnemyFilter(a.CharacterCfg.Game.TerrorZone.SkipOnImmunities...))) } else { a.logger.Debug("TZ area skipped", slog.Any("area", dstArea)) } @@ -176,11 +175,11 @@ func (a TerrorZone) tzAreaChain(firstTZ area.Area) [][]area.Area { return [][]area.Area{} } -func customTZEnemyFilter(resists ...stat.Resist) data.MonsterFilter { +func (a TerrorZone) customTZEnemyFilter(resists ...stat.Resist) data.MonsterFilter { return func(m data.Monsters) []data.Monster { var filteredMonsters []data.Monster monsterFilter := data.MonsterAnyFilter() - if config.Config.Game.TerrorZone.FocusOnElitePacks { + if a.CharacterCfg.Game.TerrorZone.FocusOnElitePacks { monsterFilter = data.MonsterEliteFilter() } diff --git a/internal/run/tristram.go b/internal/run/tristram.go index 91d201bc9..835806d0a 100644 --- a/internal/run/tristram.go +++ b/internal/run/tristram.go @@ -8,7 +8,6 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/object" "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/helper" ) @@ -35,7 +34,7 @@ func (a Tristram) BuildActions() []action.Action { } // Clear monsters around the portal - if config.Config.Game.Tristram.ClearPortal { + if a.CharacterCfg.Game.Tristram.ClearPortal { actions = append(actions, a.builder.ClearAreaAroundPlayer(10)) } @@ -46,9 +45,9 @@ func (a Tristram) BuildActions() []action.Action { return d.PlayerUnit.Area == area.Tristram }, step.Wait(time.Second))) - if config.Config.Companion.Enabled && config.Config.Companion.Leader { + if a.CharacterCfg.Companion.Enabled && a.CharacterCfg.Companion.Leader { actions = append(actions, action.NewStepChain(func(d data.Data) []step.Step { - return []step.Step{step.OpenPortal()} + return []step.Step{step.OpenPortal(a.CharacterCfg.Bindings.TP)} })) } @@ -62,7 +61,7 @@ func (a Tristram) BuildActions() []action.Action { })} } else { filter := data.MonsterAnyFilter() - if config.Config.Game.Tristram.FocusOnElitePacks { + if a.CharacterCfg.Game.Tristram.FocusOnElitePacks { filter = data.MonsterEliteFilter() } return []action.Action{a.builder.ClearArea(false, filter)} diff --git a/internal/server/assets/css/custom.css b/internal/server/assets/css/custom.css new file mode 100644 index 000000000..7781ecc61 --- /dev/null +++ b/internal/server/assets/css/custom.css @@ -0,0 +1,8 @@ +.error-message { + background-color: #f8d7da; + border: 1px solid #f5c6cb; + color: #721c24; + padding: 10px 15px; + border-radius: 5px; + margin-bottom: 20px; +} \ No newline at end of file diff --git a/internal/server/assets/css/pico.min.css b/internal/server/assets/css/pico.min.css new file mode 100644 index 000000000..5928ed788 --- /dev/null +++ b/internal/server/assets/css/pico.min.css @@ -0,0 +1,4 @@ +@charset "UTF-8";/*! + * Pico CSS ✨ v2.0.6 (https://picocss.com) + * Copyright 2019-2024 - Licensed under MIT + */:root{--pico-font-family-emoji:"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--pico-font-family-sans-serif:system-ui,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,Helvetica,Arial,"Helvetica Neue",sans-serif,var(--pico-font-family-emoji);--pico-font-family-monospace:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace,var(--pico-font-family-emoji);--pico-font-family:var(--pico-font-family-sans-serif);--pico-line-height:1.5;--pico-font-weight:400;--pico-font-size:100%;--pico-text-underline-offset:0.1rem;--pico-border-radius:0.25rem;--pico-border-width:0.0625rem;--pico-outline-width:0.125rem;--pico-transition:0.2s ease-in-out;--pico-spacing:1rem;--pico-typography-spacing-vertical:1rem;--pico-block-spacing-vertical:var(--pico-spacing);--pico-block-spacing-horizontal:var(--pico-spacing);--pico-grid-column-gap:var(--pico-spacing);--pico-grid-row-gap:var(--pico-spacing);--pico-form-element-spacing-vertical:0.75rem;--pico-form-element-spacing-horizontal:1rem;--pico-group-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-primary-focus);--pico-group-box-shadow-focus-with-input:0 0 0 0.0625rem var(--pico-form-element-border-color);--pico-modal-overlay-backdrop-filter:blur(0.375rem);--pico-nav-element-spacing-vertical:1rem;--pico-nav-element-spacing-horizontal:0.5rem;--pico-nav-link-spacing-vertical:0.5rem;--pico-nav-link-spacing-horizontal:0.5rem;--pico-nav-breadcrumb-divider:">";--pico-icon-checkbox:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-minus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");--pico-icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-date:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");--pico-icon-time:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");--pico-icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");--pico-icon-loading:url("data:image/svg+xml,%3Csvg fill='none' height='24' width='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3E%3Cstyle%3E g %7B animation: rotate 2s linear infinite; transform-origin: center center; %7D circle %7B stroke-dasharray: 75,100; stroke-dashoffset: -5; animation: dash 1.5s ease-in-out infinite; stroke-linecap: round; %7D @keyframes rotate %7B 0%25 %7B transform: rotate(0deg); %7D 100%25 %7B transform: rotate(360deg); %7D %7D @keyframes dash %7B 0%25 %7B stroke-dasharray: 1,100; stroke-dashoffset: 0; %7D 50%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -17.5; %7D 100%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -62; %7D %7D %3C/style%3E%3Cg%3E%3Ccircle cx='12' cy='12' r='10' fill='none' stroke='rgb(136, 145, 164)' stroke-width='4' /%3E%3C/g%3E%3C/svg%3E")}@media (min-width:576px){:root{--pico-font-size:106.25%}}@media (min-width:768px){:root{--pico-font-size:112.5%}}@media (min-width:1024px){:root{--pico-font-size:118.75%}}@media (min-width:1280px){:root{--pico-font-size:125%}}@media (min-width:1536px){:root{--pico-font-size:131.25%}}a{--pico-text-decoration:underline}a.contrast,a.secondary{--pico-text-decoration:underline}small{--pico-font-size:0.875em}h1,h2,h3,h4,h5,h6{--pico-font-weight:700}h1{--pico-font-size:2rem;--pico-line-height:1.125;--pico-typography-spacing-top:3rem}h2{--pico-font-size:1.75rem;--pico-line-height:1.15;--pico-typography-spacing-top:2.625rem}h3{--pico-font-size:1.5rem;--pico-line-height:1.175;--pico-typography-spacing-top:2.25rem}h4{--pico-font-size:1.25rem;--pico-line-height:1.2;--pico-typography-spacing-top:1.874rem}h5{--pico-font-size:1.125rem;--pico-line-height:1.225;--pico-typography-spacing-top:1.6875rem}h6{--pico-font-size:1rem;--pico-line-height:1.25;--pico-typography-spacing-top:1.5rem}tfoot td,tfoot th,thead td,thead th{--pico-font-weight:600;--pico-border-width:0.1875rem}code,kbd,pre,samp{--pico-font-family:var(--pico-font-family-monospace)}kbd{--pico-font-weight:bolder}:where(select,textarea),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-outline-width:0.0625rem}[type=search]{--pico-border-radius:5rem}[type=checkbox],[type=radio]{--pico-border-width:0.125rem}[type=checkbox][role=switch]{--pico-border-width:0.1875rem}details.dropdown summary:not([role=button]){--pico-outline-width:0.0625rem}nav details.dropdown summary:focus-visible{--pico-outline-width:0.125rem}[role=search]{--pico-border-radius:5rem}[role=group]:has(button.secondary:focus,[type=submit].secondary:focus,[type=button].secondary:focus,[role=button].secondary:focus),[role=search]:has(button.secondary:focus,[type=submit].secondary:focus,[type=button].secondary:focus,[role=button].secondary:focus){--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}[role=group]:has(button.contrast:focus,[type=submit].contrast:focus,[type=button].contrast:focus,[role=button].contrast:focus),[role=search]:has(button.contrast:focus,[type=submit].contrast:focus,[type=button].contrast:focus,[role=button].contrast:focus){--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-contrast-focus)}[role=group] [role=button],[role=group] [type=button],[role=group] [type=submit],[role=group] button,[role=search] [role=button],[role=search] [type=button],[role=search] [type=submit],[role=search] button{--pico-form-element-spacing-horizontal:2rem}details summary[role=button]:not(.outline)::after{filter:brightness(0) invert(1)}[aria-busy=true]:not(input,select,textarea):is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0) invert(1)}:root:not([data-theme=dark]),[data-theme=light]{--pico-background-color:#fff;--pico-color:#373c44;--pico-text-selection-color:rgba(2, 154, 232, 0.25);--pico-muted-color:#646b79;--pico-muted-border-color:#e7eaf0;--pico-primary:#0172ad;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 114, 173, 0.5);--pico-primary-hover:#015887;--pico-primary-hover-background:#02659a;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(2, 154, 232, 0.5);--pico-primary-inverse:#fff;--pico-secondary:#5d6b89;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(93, 107, 137, 0.5);--pico-secondary-hover:#48536b;--pico-secondary-hover-background:#48536b;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(93, 107, 137, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#181c25;--pico-contrast-background:#181c25;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(24, 28, 37, 0.5);--pico-contrast-hover:#000;--pico-contrast-hover-background:#000;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-secondary-hover);--pico-contrast-focus:rgba(93, 107, 137, 0.25);--pico-contrast-inverse:#fff;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(129, 145, 181, 0.01698),0.0335rem 0.067rem 0.402rem rgba(129, 145, 181, 0.024),0.0625rem 0.125rem 0.75rem rgba(129, 145, 181, 0.03),0.1125rem 0.225rem 1.35rem rgba(129, 145, 181, 0.036),0.2085rem 0.417rem 2.502rem rgba(129, 145, 181, 0.04302),0.5rem 1rem 6rem rgba(129, 145, 181, 0.06),0 0 0 0.0625rem rgba(129, 145, 181, 0.015);--pico-h1-color:#2d3138;--pico-h2-color:#373c44;--pico-h3-color:#424751;--pico-h4-color:#4d535e;--pico-h5-color:#5c6370;--pico-h6-color:#646b79;--pico-mark-background-color:#fde7c0;--pico-mark-color:#0f1114;--pico-ins-color:#1d6a54;--pico-del-color:#883935;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#f3f5f7;--pico-code-color:#646b79;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#fbfcfc;--pico-form-element-selected-background-color:#dfe3eb;--pico-form-element-border-color:#cfd5e2;--pico-form-element-color:#23262c;--pico-form-element-placeholder-color:var(--pico-muted-color);--pico-form-element-active-background-color:#fff;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#b86a6b;--pico-form-element-invalid-active-border-color:#c84f48;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#4c9b8a;--pico-form-element-valid-active-border-color:#279977;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#bfc7d9;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#dfe3eb;--pico-range-active-border-color:#bfc7d9;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:var(--pico-background-color);--pico-card-border-color:var(--pico-muted-border-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#fbfcfc;--pico-dropdown-background-color:#fff;--pico-dropdown-border-color:#eff1f4;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#eff1f4;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(232, 234, 237, 0.75);--pico-progress-background-color:#dfe3eb;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(76, 155, 138)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(200, 79, 72)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:light}:root:not([data-theme=dark]) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]),[data-theme=light] input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}@media only screen and (prefers-color-scheme:dark){:root:not([data-theme]){--pico-background-color:#13171f;--pico-color:#c2c7d0;--pico-text-selection-color:rgba(1, 170, 255, 0.1875);--pico-muted-color:#7b8495;--pico-muted-border-color:#202632;--pico-primary:#01aaff;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 170, 255, 0.5);--pico-primary-hover:#79c0ff;--pico-primary-hover-background:#017fc0;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(1, 170, 255, 0.375);--pico-primary-inverse:#fff;--pico-secondary:#969eaf;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(150, 158, 175, 0.5);--pico-secondary-hover:#b3b9c5;--pico-secondary-hover-background:#5d6b89;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(144, 158, 190, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#dfe3eb;--pico-contrast-background:#eff1f4;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(223, 227, 235, 0.5);--pico-contrast-hover:#fff;--pico-contrast-hover-background:#fff;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-contrast-hover);--pico-contrast-focus:rgba(207, 213, 226, 0.25);--pico-contrast-inverse:#000;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(7, 9, 12, 0.01698),0.0335rem 0.067rem 0.402rem rgba(7, 9, 12, 0.024),0.0625rem 0.125rem 0.75rem rgba(7, 9, 12, 0.03),0.1125rem 0.225rem 1.35rem rgba(7, 9, 12, 0.036),0.2085rem 0.417rem 2.502rem rgba(7, 9, 12, 0.04302),0.5rem 1rem 6rem rgba(7, 9, 12, 0.06),0 0 0 0.0625rem rgba(7, 9, 12, 0.015);--pico-h1-color:#f0f1f3;--pico-h2-color:#e0e3e7;--pico-h3-color:#c2c7d0;--pico-h4-color:#b3b9c5;--pico-h5-color:#a4acba;--pico-h6-color:#8891a4;--pico-mark-background-color:#014063;--pico-mark-color:#fff;--pico-ins-color:#62af9a;--pico-del-color:#ce7e7b;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#1a1f28;--pico-code-color:#8891a4;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#1c212c;--pico-form-element-selected-background-color:#2a3140;--pico-form-element-border-color:#2a3140;--pico-form-element-color:#e0e3e7;--pico-form-element-placeholder-color:#8891a4;--pico-form-element-active-background-color:#1a1f28;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#964a50;--pico-form-element-invalid-active-border-color:#b7403b;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#2a7b6f;--pico-form-element-valid-active-border-color:#16896a;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#333c4e;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#202632;--pico-range-active-border-color:#2a3140;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:#181c25;--pico-card-border-color:var(--pico-card-background-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#1a1f28;--pico-dropdown-background-color:#181c25;--pico-dropdown-border-color:#202632;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#202632;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(8, 9, 10, 0.75);--pico-progress-background-color:#202632;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(150, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:dark}:root:not([data-theme]) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}:root:not([data-theme]) details summary[role=button].contrast:not(.outline)::after{filter:brightness(0)}:root:not([data-theme]) [aria-busy=true]:not(input,select,textarea).contrast:is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0)}}[data-theme=dark]{--pico-background-color:#13171f;--pico-color:#c2c7d0;--pico-text-selection-color:rgba(1, 170, 255, 0.1875);--pico-muted-color:#7b8495;--pico-muted-border-color:#202632;--pico-primary:#01aaff;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 170, 255, 0.5);--pico-primary-hover:#79c0ff;--pico-primary-hover-background:#017fc0;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(1, 170, 255, 0.375);--pico-primary-inverse:#fff;--pico-secondary:#969eaf;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(150, 158, 175, 0.5);--pico-secondary-hover:#b3b9c5;--pico-secondary-hover-background:#5d6b89;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(144, 158, 190, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#dfe3eb;--pico-contrast-background:#eff1f4;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(223, 227, 235, 0.5);--pico-contrast-hover:#fff;--pico-contrast-hover-background:#fff;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-contrast-hover);--pico-contrast-focus:rgba(207, 213, 226, 0.25);--pico-contrast-inverse:#000;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(7, 9, 12, 0.01698),0.0335rem 0.067rem 0.402rem rgba(7, 9, 12, 0.024),0.0625rem 0.125rem 0.75rem rgba(7, 9, 12, 0.03),0.1125rem 0.225rem 1.35rem rgba(7, 9, 12, 0.036),0.2085rem 0.417rem 2.502rem rgba(7, 9, 12, 0.04302),0.5rem 1rem 6rem rgba(7, 9, 12, 0.06),0 0 0 0.0625rem rgba(7, 9, 12, 0.015);--pico-h1-color:#f0f1f3;--pico-h2-color:#e0e3e7;--pico-h3-color:#c2c7d0;--pico-h4-color:#b3b9c5;--pico-h5-color:#a4acba;--pico-h6-color:#8891a4;--pico-mark-background-color:#014063;--pico-mark-color:#fff;--pico-ins-color:#62af9a;--pico-del-color:#ce7e7b;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#1a1f28;--pico-code-color:#8891a4;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#1c212c;--pico-form-element-selected-background-color:#2a3140;--pico-form-element-border-color:#2a3140;--pico-form-element-color:#e0e3e7;--pico-form-element-placeholder-color:#8891a4;--pico-form-element-active-background-color:#1a1f28;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#964a50;--pico-form-element-invalid-active-border-color:#b7403b;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#2a7b6f;--pico-form-element-valid-active-border-color:#16896a;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#333c4e;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#202632;--pico-range-active-border-color:#2a3140;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:#181c25;--pico-card-border-color:var(--pico-card-background-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#1a1f28;--pico-dropdown-background-color:#181c25;--pico-dropdown-border-color:#202632;--pico-dropdown-box-shadow:var(--pico-box-shadow);--pico-dropdown-color:var(--pico-color);--pico-dropdown-hover-background-color:#202632;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(8, 9, 10, 0.75);--pico-progress-background-color:#202632;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(150, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:dark}[data-theme=dark] input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}[data-theme=dark] details summary[role=button].contrast:not(.outline)::after{filter:brightness(0)}[data-theme=dark] [aria-busy=true]:not(input,select,textarea).contrast:is(button,[type=submit],[type=button],[type=reset],[role=button]):not(.outline)::before{filter:brightness(0)}[type=checkbox],[type=radio],[type=range],progress{accent-color:var(--pico-primary)}*,::after,::before{box-sizing:border-box;background-repeat:no-repeat}::after,::before{text-decoration:inherit;vertical-align:inherit}:where(:root){-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--pico-background-color);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:var(--pico-font-size);line-height:var(--pico-line-height);font-family:var(--pico-font-family);text-underline-offset:var(--pico-text-underline-offset);text-rendering:optimizeLegibility;overflow-wrap:break-word;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{width:100%;margin:0}main{display:block}body>footer,body>header,body>main{padding-block:var(--pico-block-spacing-vertical)}section{margin-bottom:var(--pico-block-spacing-vertical)}.container,.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:var(--pico-spacing);padding-left:var(--pico-spacing)}@media (min-width:576px){.container{max-width:510px;padding-right:0;padding-left:0}}@media (min-width:768px){.container{max-width:700px}}@media (min-width:1024px){.container{max-width:950px}}@media (min-width:1280px){.container{max-width:1200px}}@media (min-width:1536px){.container{max-width:1450px}}.grid{grid-column-gap:var(--pico-grid-column-gap);grid-row-gap:var(--pico-grid-row-gap);display:grid;grid-template-columns:1fr}@media (min-width:768px){.grid{grid-template-columns:repeat(auto-fit,minmax(0%,1fr))}}.grid>*{min-width:0}.overflow-auto{overflow:auto}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}address,blockquote,dl,ol,p,pre,table,ul{margin-top:0;margin-bottom:var(--pico-typography-spacing-vertical);color:var(--pico-color);font-style:normal;font-weight:var(--pico-font-weight)}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:var(--pico-typography-spacing-vertical);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:var(--pico-font-size);line-height:var(--pico-line-height);font-family:var(--pico-font-family)}h1{--pico-color:var(--pico-h1-color)}h2{--pico-color:var(--pico-h2-color)}h3{--pico-color:var(--pico-h3-color)}h4{--pico-color:var(--pico-h4-color)}h5{--pico-color:var(--pico-h5-color)}h6{--pico-color:var(--pico-h6-color)}:where(article,address,blockquote,dl,figure,form,ol,p,pre,table,ul)~:is(h1,h2,h3,h4,h5,h6){margin-top:var(--pico-typography-spacing-top)}p{margin-bottom:var(--pico-typography-spacing-vertical)}hgroup{margin-bottom:var(--pico-typography-spacing-vertical)}hgroup>*{margin-top:0;margin-bottom:0}hgroup>:not(:first-child):last-child{--pico-color:var(--pico-muted-color);--pico-font-weight:unset;font-size:1rem}:where(ol,ul) li{margin-bottom:calc(var(--pico-typography-spacing-vertical) * .25)}:where(dl,ol,ul) :where(dl,ol,ul){margin:0;margin-top:calc(var(--pico-typography-spacing-vertical) * .25)}ul li{list-style:square}mark{padding:.125rem .25rem;background-color:var(--pico-mark-background-color);color:var(--pico-mark-color);vertical-align:baseline}blockquote{display:block;margin:var(--pico-typography-spacing-vertical) 0;padding:var(--pico-spacing);border-right:none;border-left:.25rem solid var(--pico-blockquote-border-color);border-inline-start:0.25rem solid var(--pico-blockquote-border-color);border-inline-end:none}blockquote footer{margin-top:calc(var(--pico-typography-spacing-vertical) * .5);color:var(--pico-blockquote-footer-color)}abbr[title]{border-bottom:1px dotted;text-decoration:none;cursor:help}ins{color:var(--pico-ins-color);text-decoration:none}del{color:var(--pico-del-color)}::-moz-selection{background-color:var(--pico-text-selection-color)}::selection{background-color:var(--pico-text-selection-color)}:where(a:not([role=button])),[role=link]{--pico-color:var(--pico-primary);--pico-background-color:transparent;--pico-underline:var(--pico-primary-underline);outline:0;background-color:var(--pico-background-color);color:var(--pico-color);-webkit-text-decoration:var(--pico-text-decoration);text-decoration:var(--pico-text-decoration);text-decoration-color:var(--pico-underline);text-underline-offset:0.125em;transition:background-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition),-webkit-text-decoration var(--pico-transition);transition:background-color var(--pico-transition),color var(--pico-transition),text-decoration var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),color var(--pico-transition),text-decoration var(--pico-transition),box-shadow var(--pico-transition),-webkit-text-decoration var(--pico-transition)}:where(a:not([role=button])):is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-primary-hover);--pico-underline:var(--pico-primary-hover-underline);--pico-text-decoration:underline}:where(a:not([role=button])):focus-visible,[role=link]:focus-visible{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}:where(a:not([role=button])).secondary,[role=link].secondary{--pico-color:var(--pico-secondary);--pico-underline:var(--pico-secondary-underline)}:where(a:not([role=button])).secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link].secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-secondary-hover);--pico-underline:var(--pico-secondary-hover-underline)}:where(a:not([role=button])).contrast,[role=link].contrast{--pico-color:var(--pico-contrast);--pico-underline:var(--pico-contrast-underline)}:where(a:not([role=button])).contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link].contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-contrast-hover);--pico-underline:var(--pico-contrast-hover-underline)}a[role=button]{display:inline-block}button{margin:0;overflow:visible;font-family:inherit;text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[role=button],[type=button],[type=file]::file-selector-button,[type=reset],[type=submit],button{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);--pico-color:var(--pico-primary-inverse);--pico-box-shadow:var(--pico-button-box-shadow, 0 0 0 rgba(0, 0, 0, 0));padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal);border:var(--pico-border-width) solid var(--pico-border-color);border-radius:var(--pico-border-radius);outline:0;background-color:var(--pico-background-color);box-shadow:var(--pico-box-shadow);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:1rem;line-height:var(--pico-line-height);text-align:center;text-decoration:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}[role=button]:is(:hover,:active,:focus),[role=button]:is([aria-current]:not([aria-current=false])),[type=button]:is(:hover,:active,:focus),[type=button]:is([aria-current]:not([aria-current=false])),[type=file]::file-selector-button:is(:hover,:active,:focus),[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])),[type=reset]:is(:hover,:active,:focus),[type=reset]:is([aria-current]:not([aria-current=false])),[type=submit]:is(:hover,:active,:focus),[type=submit]:is([aria-current]:not([aria-current=false])),button:is(:hover,:active,:focus),button:is([aria-current]:not([aria-current=false])){--pico-background-color:var(--pico-primary-hover-background);--pico-border-color:var(--pico-primary-hover-border);--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0));--pico-color:var(--pico-primary-inverse)}[role=button]:focus,[role=button]:is([aria-current]:not([aria-current=false])):focus,[type=button]:focus,[type=button]:is([aria-current]:not([aria-current=false])):focus,[type=file]::file-selector-button:focus,[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])):focus,[type=reset]:focus,[type=reset]:is([aria-current]:not([aria-current=false])):focus,[type=submit]:focus,[type=submit]:is([aria-current]:not([aria-current=false])):focus,button:focus,button:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}[type=button],[type=reset],[type=submit]{margin-bottom:var(--pico-spacing)}:is(button,[type=submit],[type=button],[role=button]).secondary,[type=file]::file-selector-button,[type=reset]{--pico-background-color:var(--pico-secondary-background);--pico-border-color:var(--pico-secondary-border);--pico-color:var(--pico-secondary-inverse);cursor:pointer}:is(button,[type=submit],[type=button],[role=button]).secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=file]::file-selector-button:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:var(--pico-secondary-hover-background);--pico-border-color:var(--pico-secondary-hover-border);--pico-color:var(--pico-secondary-inverse)}:is(button,[type=submit],[type=button],[role=button]).secondary:focus,:is(button,[type=submit],[type=button],[role=button]).secondary:is([aria-current]:not([aria-current=false])):focus,[type=file]::file-selector-button:focus,[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])):focus,[type=reset]:focus,[type=reset]:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}:is(button,[type=submit],[type=button],[role=button]).contrast{--pico-background-color:var(--pico-contrast-background);--pico-border-color:var(--pico-contrast-border);--pico-color:var(--pico-contrast-inverse)}:is(button,[type=submit],[type=button],[role=button]).contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:var(--pico-contrast-hover-background);--pico-border-color:var(--pico-contrast-hover-border);--pico-color:var(--pico-contrast-inverse)}:is(button,[type=submit],[type=button],[role=button]).contrast:focus,:is(button,[type=submit],[type=button],[role=button]).contrast:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-contrast-focus)}:is(button,[type=submit],[type=button],[role=button]).outline,[type=reset].outline{--pico-background-color:transparent;--pico-color:var(--pico-primary);--pico-border-color:var(--pico-primary)}:is(button,[type=submit],[type=button],[role=button]).outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset].outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:transparent;--pico-color:var(--pico-primary-hover);--pico-border-color:var(--pico-primary-hover)}:is(button,[type=submit],[type=button],[role=button]).outline.secondary,[type=reset].outline{--pico-color:var(--pico-secondary);--pico-border-color:var(--pico-secondary)}:is(button,[type=submit],[type=button],[role=button]).outline.secondary:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset].outline:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-secondary-hover);--pico-border-color:var(--pico-secondary-hover)}:is(button,[type=submit],[type=button],[role=button]).outline.contrast{--pico-color:var(--pico-contrast);--pico-border-color:var(--pico-contrast)}:is(button,[type=submit],[type=button],[role=button]).outline.contrast:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-contrast-hover);--pico-border-color:var(--pico-contrast-hover)}:where(button,[type=submit],[type=reset],[type=button],[role=button])[disabled],:where(fieldset[disabled]) :is(button,[type=submit],[type=button],[type=reset],[role=button]){opacity:.5;pointer-events:none}:where(table){width:100%;border-collapse:collapse;border-spacing:0;text-indent:0}td,th{padding:calc(var(--pico-spacing)/ 2) var(--pico-spacing);border-bottom:var(--pico-border-width) solid var(--pico-table-border-color);background-color:var(--pico-background-color);color:var(--pico-color);font-weight:var(--pico-font-weight);text-align:left;text-align:start}tfoot td,tfoot th{border-top:var(--pico-border-width) solid var(--pico-table-border-color);border-bottom:0}table.striped tbody tr:nth-child(odd) td,table.striped tbody tr:nth-child(odd) th{background-color:var(--pico-table-row-stripped-background-color)}:where(audio,canvas,iframe,img,svg,video){vertical-align:middle}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}:where(iframe){border-style:none}img{max-width:100%;height:auto;border-style:none}:where(svg:not([fill])){fill:currentColor}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-size:.875em;font-family:var(--pico-font-family)}pre code{font-size:inherit;font-family:inherit}pre{-ms-overflow-style:scrollbar;overflow:auto}code,kbd,pre{border-radius:var(--pico-border-radius);background:var(--pico-code-background-color);color:var(--pico-code-color);font-weight:var(--pico-font-weight);line-height:initial}code,kbd{display:inline-block;padding:.375rem}pre{display:block;margin-bottom:var(--pico-spacing);overflow-x:auto}pre>code{display:block;padding:var(--pico-spacing);background:0 0;line-height:var(--pico-line-height)}kbd{background-color:var(--pico-code-kbd-background-color);color:var(--pico-code-kbd-color);vertical-align:baseline}figure{display:block;margin:0;padding:0}figure figcaption{padding:calc(var(--pico-spacing) * .5) 0;color:var(--pico-muted-color)}hr{height:0;margin:var(--pico-typography-spacing-vertical) 0;border:0;border-top:1px solid var(--pico-muted-border-color);color:inherit}[hidden],template{display:none!important}canvas{display:inline-block}input,optgroup,select,textarea{margin:0;font-size:1rem;line-height:var(--pico-line-height);font-family:inherit;letter-spacing:inherit}input{overflow:visible}select{text-transform:none}legend{max-width:100%;padding:0;color:inherit;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{padding:0}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}::-moz-focus-inner{padding:0;border-style:none}:-moz-focusring{outline:0}:-moz-ui-invalid{box-shadow:none}::-ms-expand{display:none}[type=file],[type=range]{padding:0;border-width:0}input:not([type=checkbox],[type=radio],[type=range]){height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2)}fieldset{width:100%;margin:0;margin-bottom:var(--pico-spacing);padding:0;border:0}fieldset legend,label{display:block;margin-bottom:calc(var(--pico-spacing) * .375);color:var(--pico-color);font-weight:var(--pico-form-label-font-weight,var(--pico-font-weight))}fieldset legend{margin-bottom:calc(var(--pico-spacing) * .5)}button[type=submit],input:not([type=checkbox],[type=radio]),select,textarea{width:100%}input:not([type=checkbox],[type=radio],[type=range],[type=file]),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal)}input,select,textarea{--pico-background-color:var(--pico-form-element-background-color);--pico-border-color:var(--pico-form-element-border-color);--pico-color:var(--pico-form-element-color);--pico-box-shadow:none;border:var(--pico-border-width) solid var(--pico-border-color);border-radius:var(--pico-border-radius);outline:0;background-color:var(--pico-background-color);box-shadow:var(--pico-box-shadow);color:var(--pico-color);font-weight:var(--pico-font-weight);transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}:where(select,textarea):not([readonly]):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[readonly]):is(:active,:focus){--pico-background-color:var(--pico-form-element-active-background-color)}:where(select,textarea):not([readonly]):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[role=switch],[readonly]):is(:active,:focus){--pico-border-color:var(--pico-form-element-active-border-color)}:where(select,textarea):not([readonly]):focus,input:not([type=submit],[type=button],[type=reset],[type=range],[type=file],[readonly]):focus{--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color)}:where(fieldset[disabled]) :is(input:not([type=submit],[type=button],[type=reset]),select,textarea),input:not([type=submit],[type=button],[type=reset])[disabled],label[aria-disabled=true],select[disabled],textarea[disabled]{opacity:var(--pico-form-element-disabled-opacity);pointer-events:none}label[aria-disabled=true] input[disabled]{opacity:1}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid]{padding-right:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem)!important;padding-left:var(--pico-form-element-spacing-horizontal);padding-inline-start:var(--pico-form-element-spacing-horizontal)!important;padding-inline-end:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem)!important;background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid=false]:not(select){background-image:var(--pico-icon-valid)}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid=true]:not(select){background-image:var(--pico-icon-invalid)}:where(input,select,textarea)[aria-invalid=false]{--pico-border-color:var(--pico-form-element-valid-border-color)}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus){--pico-border-color:var(--pico-form-element-valid-active-border-color)!important}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus):not([type=checkbox],[type=radio]){--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-valid-focus-color)!important}:where(input,select,textarea)[aria-invalid=true]{--pico-border-color:var(--pico-form-element-invalid-border-color)}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus){--pico-border-color:var(--pico-form-element-invalid-active-border-color)!important}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus):not([type=checkbox],[type=radio]){--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-invalid-focus-color)!important}[dir=rtl] :where(input,select,textarea):not([type=checkbox],[type=radio]):is([aria-invalid],[aria-invalid=true],[aria-invalid=false]){background-position:center left .75rem}input::-webkit-input-placeholder,input::placeholder,select:invalid,textarea::-webkit-input-placeholder,textarea::placeholder{color:var(--pico-form-element-placeholder-color);opacity:1}input:not([type=checkbox],[type=radio]),select,textarea{margin-bottom:var(--pico-spacing)}select::-ms-expand{border:0;background-color:transparent}select:not([multiple],[size]){padding-right:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem);padding-left:var(--pico-form-element-spacing-horizontal);padding-inline-start:var(--pico-form-element-spacing-horizontal);padding-inline-end:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem);background-image:var(--pico-icon-chevron);background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}select[multiple] option:checked{background:var(--pico-form-element-selected-background-color);color:var(--pico-form-element-color)}[dir=rtl] select:not([multiple],[size]){background-position:center left .75rem}textarea{display:block;resize:vertical}textarea[aria-invalid]{--pico-icon-height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2);background-position:top right .75rem!important;background-size:1rem var(--pico-icon-height)!important}:where(input,select,textarea,fieldset,.grid)+small{display:block;width:100%;margin-top:calc(var(--pico-spacing) * -.75);margin-bottom:var(--pico-spacing);color:var(--pico-muted-color)}:where(input,select,textarea,fieldset,.grid)[aria-invalid=false]+small{color:var(--pico-ins-color)}:where(input,select,textarea,fieldset,.grid)[aria-invalid=true]+small{color:var(--pico-del-color)}label>:where(input,select,textarea){margin-top:calc(var(--pico-spacing) * .25)}label:has([type=checkbox],[type=radio]){width:-moz-fit-content;width:fit-content;cursor:pointer}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:1.25em;height:1.25em;margin-top:-.125em;margin-inline-end:.5em;border-width:var(--pico-border-width);vertical-align:middle;cursor:pointer}[type=checkbox]::-ms-check,[type=radio]::-ms-check{display:none}[type=checkbox]:checked,[type=checkbox]:checked:active,[type=checkbox]:checked:focus,[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);background-image:var(--pico-icon-checkbox);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=checkbox]~label,[type=radio]~label{display:inline-block;margin-bottom:0;cursor:pointer}[type=checkbox]~label:not(:last-of-type),[type=radio]~label:not(:last-of-type){margin-inline-end:1em}[type=checkbox]:indeterminate{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);background-image:var(--pico-icon-minus);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=radio]{border-radius:50%}[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--pico-background-color:var(--pico-primary-inverse);border-width:.35em;background-image:none}[type=checkbox][role=switch]{--pico-background-color:var(--pico-switch-background-color);--pico-color:var(--pico-switch-color);width:2.25em;height:1.25em;border:var(--pico-border-width) solid var(--pico-border-color);border-radius:1.25em;background-color:var(--pico-background-color);line-height:1.25em}[type=checkbox][role=switch]:not([aria-invalid]){--pico-border-color:var(--pico-switch-background-color)}[type=checkbox][role=switch]:before{display:block;aspect-ratio:1;height:100%;border-radius:50%;background-color:var(--pico-color);box-shadow:var(--pico-switch-thumb-box-shadow);content:"";transition:margin .1s ease-in-out}[type=checkbox][role=switch]:focus{--pico-background-color:var(--pico-switch-background-color);--pico-border-color:var(--pico-switch-background-color)}[type=checkbox][role=switch]:checked{--pico-background-color:var(--pico-switch-checked-background-color);--pico-border-color:var(--pico-switch-checked-background-color);background-image:none}[type=checkbox][role=switch]:checked::before{margin-inline-start:calc(2.25em - 1.25em)}[type=checkbox][role=switch][disabled]{--pico-background-color:var(--pico-border-color)}[type=checkbox][aria-invalid=false]:checked,[type=checkbox][aria-invalid=false]:checked:active,[type=checkbox][aria-invalid=false]:checked:focus,[type=checkbox][role=switch][aria-invalid=false]:checked,[type=checkbox][role=switch][aria-invalid=false]:checked:active,[type=checkbox][role=switch][aria-invalid=false]:checked:focus{--pico-background-color:var(--pico-form-element-valid-border-color)}[type=checkbox]:checked:active[aria-invalid=true],[type=checkbox]:checked:focus[aria-invalid=true],[type=checkbox]:checked[aria-invalid=true],[type=checkbox][role=switch]:checked:active[aria-invalid=true],[type=checkbox][role=switch]:checked:focus[aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true]{--pico-background-color:var(--pico-form-element-invalid-border-color)}[type=checkbox][aria-invalid=false]:checked,[type=checkbox][aria-invalid=false]:checked:active,[type=checkbox][aria-invalid=false]:checked:focus,[type=checkbox][role=switch][aria-invalid=false]:checked,[type=checkbox][role=switch][aria-invalid=false]:checked:active,[type=checkbox][role=switch][aria-invalid=false]:checked:focus,[type=radio][aria-invalid=false]:checked,[type=radio][aria-invalid=false]:checked:active,[type=radio][aria-invalid=false]:checked:focus{--pico-border-color:var(--pico-form-element-valid-border-color)}[type=checkbox]:checked:active[aria-invalid=true],[type=checkbox]:checked:focus[aria-invalid=true],[type=checkbox]:checked[aria-invalid=true],[type=checkbox][role=switch]:checked:active[aria-invalid=true],[type=checkbox][role=switch]:checked:focus[aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true],[type=radio]:checked:active[aria-invalid=true],[type=radio]:checked:focus[aria-invalid=true],[type=radio]:checked[aria-invalid=true]{--pico-border-color:var(--pico-form-element-invalid-border-color)}[type=color]::-webkit-color-swatch-wrapper{padding:0}[type=color]::-moz-focus-inner{padding:0}[type=color]::-webkit-color-swatch{border:0;border-radius:calc(var(--pico-border-radius) * .5)}[type=color]::-moz-color-swatch{border:0;border-radius:calc(var(--pico-border-radius) * .5)}input:not([type=checkbox],[type=radio],[type=range],[type=file]):is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){--pico-icon-position:0.75rem;--pico-icon-width:1rem;padding-right:calc(var(--pico-icon-width) + var(--pico-icon-position));background-image:var(--pico-icon-date);background-position:center right var(--pico-icon-position);background-size:var(--pico-icon-width) auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=time]{background-image:var(--pico-icon-time)}[type=date]::-webkit-calendar-picker-indicator,[type=datetime-local]::-webkit-calendar-picker-indicator,[type=month]::-webkit-calendar-picker-indicator,[type=time]::-webkit-calendar-picker-indicator,[type=week]::-webkit-calendar-picker-indicator{width:var(--pico-icon-width);margin-right:calc(var(--pico-icon-width) * -1);margin-left:var(--pico-icon-position);opacity:0}@-moz-document url-prefix(){[type=date],[type=datetime-local],[type=month],[type=time],[type=week]{padding-right:var(--pico-form-element-spacing-horizontal)!important;background-image:none!important}}[dir=rtl] :is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){text-align:right}[type=file]{--pico-color:var(--pico-muted-color);margin-left:calc(var(--pico-outline-width) * -1);padding:calc(var(--pico-form-element-spacing-vertical) * .5) 0;padding-left:var(--pico-outline-width);border:0;border-radius:0;background:0 0}[type=file]::file-selector-button{margin-right:calc(var(--pico-spacing)/ 2);padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal)}[type=file]:is(:hover,:active,:focus)::file-selector-button{--pico-background-color:var(--pico-secondary-hover-background);--pico-border-color:var(--pico-secondary-hover-border)}[type=file]:focus::file-selector-button{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}[type=range]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:1.25rem;background:0 0}[type=range]::-webkit-slider-runnable-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-webkit-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-moz-range-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-moz-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-ms-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-ms-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-webkit-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]::-moz-range-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-moz-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]::-ms-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-ms-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]:active,[type=range]:focus-within{--pico-range-border-color:var(--pico-range-active-border-color);--pico-range-thumb-color:var(--pico-range-thumb-active-color)}[type=range]:active::-webkit-slider-thumb{transform:scale(1.25)}[type=range]:active::-moz-range-thumb{transform:scale(1.25)}[type=range]:active::-ms-thumb{transform:scale(1.25)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{padding-inline-start:calc(var(--pico-form-element-spacing-horizontal) + 1.75rem);background-image:var(--pico-icon-search);background-position:center left calc(var(--pico-form-element-spacing-horizontal) + .125rem);background-size:1rem auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{padding-inline-start:calc(var(--pico-form-element-spacing-horizontal) + 1.75rem)!important;background-position:center left 1.125rem,center right .75rem}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=false]{background-image:var(--pico-icon-search),var(--pico-icon-valid)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=true]{background-image:var(--pico-icon-search),var(--pico-icon-invalid)}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{background-position:center right 1.125rem}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{background-position:center right 1.125rem,center left .75rem}details{display:block;margin-bottom:var(--pico-spacing)}details summary{line-height:1rem;list-style-type:none;cursor:pointer;transition:color var(--pico-transition)}details summary:not([role]){color:var(--pico-accordion-close-summary-color)}details summary::-webkit-details-marker{display:none}details summary::marker{display:none}details summary::-moz-list-bullet{list-style-type:none}details summary::after{display:block;width:1rem;height:1rem;margin-inline-start:calc(var(--pico-spacing,1rem) * .5);float:right;transform:rotate(-90deg);background-image:var(--pico-icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:"";transition:transform var(--pico-transition)}details summary:focus{outline:0}details summary:focus:not([role]){color:var(--pico-accordion-active-summary-color)}details summary:focus-visible:not([role]){outline:var(--pico-outline-width) solid var(--pico-primary-focus);outline-offset:calc(var(--pico-spacing,1rem) * 0.5);color:var(--pico-primary)}details summary[role=button]{width:100%;text-align:left}details summary[role=button]::after{height:calc(1rem * var(--pico-line-height,1.5))}details[open]>summary{margin-bottom:var(--pico-spacing)}details[open]>summary:not([role]):not(:focus){color:var(--pico-accordion-open-summary-color)}details[open]>summary::after{transform:rotate(0)}[dir=rtl] details summary{text-align:right}[dir=rtl] details summary::after{float:left;background-position:left center}article{margin-bottom:var(--pico-block-spacing-vertical);padding:var(--pico-block-spacing-vertical) var(--pico-block-spacing-horizontal);border-radius:var(--pico-border-radius);background:var(--pico-card-background-color);box-shadow:var(--pico-card-box-shadow)}article>footer,article>header{margin-right:calc(var(--pico-block-spacing-horizontal) * -1);margin-left:calc(var(--pico-block-spacing-horizontal) * -1);padding:calc(var(--pico-block-spacing-vertical) * .66) var(--pico-block-spacing-horizontal);background-color:var(--pico-card-sectioning-background-color)}article>header{margin-top:calc(var(--pico-block-spacing-vertical) * -1);margin-bottom:var(--pico-block-spacing-vertical);border-bottom:var(--pico-border-width) solid var(--pico-card-border-color);border-top-right-radius:var(--pico-border-radius);border-top-left-radius:var(--pico-border-radius)}article>footer{margin-top:var(--pico-block-spacing-vertical);margin-bottom:calc(var(--pico-block-spacing-vertical) * -1);border-top:var(--pico-border-width) solid var(--pico-card-border-color);border-bottom-right-radius:var(--pico-border-radius);border-bottom-left-radius:var(--pico-border-radius)}details.dropdown{position:relative;border-bottom:none}details.dropdown summary::after,details.dropdown>a::after,details.dropdown>button::after{display:block;width:1rem;height:calc(1rem * var(--pico-line-height,1.5));margin-inline-start:.25rem;float:right;transform:rotate(0) translateX(.2rem);background-image:var(--pico-icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:""}nav details.dropdown{margin-bottom:0}details.dropdown summary:not([role]){height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2);padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal);border:var(--pico-border-width) solid var(--pico-form-element-border-color);border-radius:var(--pico-border-radius);background-color:var(--pico-form-element-background-color);color:var(--pico-form-element-placeholder-color);line-height:inherit;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}details.dropdown summary:not([role]):active,details.dropdown summary:not([role]):focus{border-color:var(--pico-form-element-active-border-color);background-color:var(--pico-form-element-active-background-color)}details.dropdown summary:not([role]):focus{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color)}details.dropdown summary:not([role]):focus-visible{outline:0}details.dropdown summary:not([role])[aria-invalid=false]{--pico-form-element-border-color:var(--pico-form-element-valid-border-color);--pico-form-element-active-border-color:var(--pico-form-element-valid-focus-color);--pico-form-element-focus-color:var(--pico-form-element-valid-focus-color)}details.dropdown summary:not([role])[aria-invalid=true]{--pico-form-element-border-color:var(--pico-form-element-invalid-border-color);--pico-form-element-active-border-color:var(--pico-form-element-invalid-focus-color);--pico-form-element-focus-color:var(--pico-form-element-invalid-focus-color)}nav details.dropdown{display:inline;margin:calc(var(--pico-nav-element-spacing-vertical) * -1) 0}nav details.dropdown summary::after{transform:rotate(0) translateX(0)}nav details.dropdown summary:not([role]){height:calc(1rem * var(--pico-line-height) + var(--pico-nav-link-spacing-vertical) * 2);padding:calc(var(--pico-nav-link-spacing-vertical) - var(--pico-border-width) * 2) var(--pico-nav-link-spacing-horizontal)}nav details.dropdown summary:not([role]):focus-visible{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}details.dropdown summary+ul{display:flex;z-index:99;position:absolute;left:0;flex-direction:column;width:100%;min-width:-moz-fit-content;min-width:fit-content;margin:0;margin-top:var(--pico-outline-width);padding:0;border:var(--pico-border-width) solid var(--pico-dropdown-border-color);border-radius:var(--pico-border-radius);background-color:var(--pico-dropdown-background-color);box-shadow:var(--pico-dropdown-box-shadow);color:var(--pico-dropdown-color);white-space:nowrap;opacity:0;transition:opacity var(--pico-transition),transform 0s ease-in-out 1s}details.dropdown summary+ul[dir=rtl]{right:0;left:auto}details.dropdown summary+ul li{width:100%;margin-bottom:0;padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal);list-style:none}details.dropdown summary+ul li:first-of-type{margin-top:calc(var(--pico-form-element-spacing-vertical) * .5)}details.dropdown summary+ul li:last-of-type{margin-bottom:calc(var(--pico-form-element-spacing-vertical) * .5)}details.dropdown summary+ul li a{display:block;margin:calc(var(--pico-form-element-spacing-vertical) * -.5) calc(var(--pico-form-element-spacing-horizontal) * -1);padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal);overflow:hidden;border-radius:0;color:var(--pico-dropdown-color);text-decoration:none;text-overflow:ellipsis}details.dropdown summary+ul li a:active,details.dropdown summary+ul li a:focus,details.dropdown summary+ul li a:focus-visible,details.dropdown summary+ul li a:hover,details.dropdown summary+ul li a[aria-current]:not([aria-current=false]){background-color:var(--pico-dropdown-hover-background-color)}details.dropdown summary+ul li label{width:100%}details.dropdown summary+ul li:has(label):hover{background-color:var(--pico-dropdown-hover-background-color)}details.dropdown[open] summary{margin-bottom:0}details.dropdown[open] summary+ul{transform:scaleY(1);opacity:1;transition:opacity var(--pico-transition),transform 0s ease-in-out 0s}details.dropdown[open] summary::before{display:block;z-index:1;position:fixed;width:100vw;height:100vh;inset:0;background:0 0;content:"";cursor:default}label>details.dropdown{margin-top:calc(var(--pico-spacing) * .25)}[role=group],[role=search]{display:inline-flex;position:relative;width:100%;margin-bottom:var(--pico-spacing);border-radius:var(--pico-border-radius);box-shadow:var(--pico-group-box-shadow,0 0 0 transparent);vertical-align:middle;transition:box-shadow var(--pico-transition)}[role=group] input:not([type=checkbox],[type=radio]),[role=group] select,[role=group]>*,[role=search] input:not([type=checkbox],[type=radio]),[role=search] select,[role=search]>*{position:relative;flex:1 1 auto;margin-bottom:0}[role=group] input:not([type=checkbox],[type=radio]):not(:first-child),[role=group] select:not(:first-child),[role=group]>:not(:first-child),[role=search] input:not([type=checkbox],[type=radio]):not(:first-child),[role=search] select:not(:first-child),[role=search]>:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}[role=group] input:not([type=checkbox],[type=radio]):not(:last-child),[role=group] select:not(:last-child),[role=group]>:not(:last-child),[role=search] input:not([type=checkbox],[type=radio]):not(:last-child),[role=search] select:not(:last-child),[role=search]>:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}[role=group] input:not([type=checkbox],[type=radio]):focus,[role=group] select:focus,[role=group]>:focus,[role=search] input:not([type=checkbox],[type=radio]):focus,[role=search] select:focus,[role=search]>:focus{z-index:2}[role=group] [role=button]:not(:first-child),[role=group] [type=button]:not(:first-child),[role=group] [type=reset]:not(:first-child),[role=group] [type=submit]:not(:first-child),[role=group] button:not(:first-child),[role=group] input:not([type=checkbox],[type=radio]):not(:first-child),[role=group] select:not(:first-child),[role=search] [role=button]:not(:first-child),[role=search] [type=button]:not(:first-child),[role=search] [type=reset]:not(:first-child),[role=search] [type=submit]:not(:first-child),[role=search] button:not(:first-child),[role=search] input:not([type=checkbox],[type=radio]):not(:first-child),[role=search] select:not(:first-child){margin-left:calc(var(--pico-border-width) * -1)}[role=group] [role=button],[role=group] [type=button],[role=group] [type=reset],[role=group] [type=submit],[role=group] button,[role=search] [role=button],[role=search] [type=button],[role=search] [type=reset],[role=search] [type=submit],[role=search] button{width:auto}@supports selector(:has(*)){[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus),[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus){--pico-group-box-shadow:var(--pico-group-box-shadow-focus-with-button)}[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) input:not([type=checkbox],[type=radio]),[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) select,[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) input:not([type=checkbox],[type=radio]),[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) select{border-color:transparent}[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus),[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus){--pico-group-box-shadow:var(--pico-group-box-shadow-focus-with-input)}[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [role=button],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=button],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=submit],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) button,[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [role=button],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=button],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=submit],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) button{--pico-button-box-shadow:0 0 0 var(--pico-border-width) var(--pico-primary-border);--pico-button-hover-box-shadow:0 0 0 var(--pico-border-width) var(--pico-primary-hover-border)}[role=group] [role=button]:focus,[role=group] [type=button]:focus,[role=group] [type=reset]:focus,[role=group] [type=submit]:focus,[role=group] button:focus,[role=search] [role=button]:focus,[role=search] [type=button]:focus,[role=search] [type=reset]:focus,[role=search] [type=submit]:focus,[role=search] button:focus{box-shadow:none}}[role=search]>:first-child{border-top-left-radius:5rem;border-bottom-left-radius:5rem}[role=search]>:last-child{border-top-right-radius:5rem;border-bottom-right-radius:5rem}[aria-busy=true]:not(input,select,textarea,html){white-space:nowrap}[aria-busy=true]:not(input,select,textarea,html)::before{display:inline-block;width:1em;height:1em;background-image:var(--pico-icon-loading);background-size:1em auto;background-repeat:no-repeat;content:"";vertical-align:-.125em}[aria-busy=true]:not(input,select,textarea,html):not(:empty)::before{margin-inline-end:calc(var(--pico-spacing) * .5)}[aria-busy=true]:not(input,select,textarea,html):empty{text-align:center}[role=button][aria-busy=true],[type=button][aria-busy=true],[type=reset][aria-busy=true],[type=submit][aria-busy=true],a[aria-busy=true],button[aria-busy=true]{pointer-events:none}:root{--pico-scrollbar-width:0px}dialog{display:flex;z-index:999;position:fixed;top:0;right:0;bottom:0;left:0;align-items:center;justify-content:center;width:inherit;min-width:100%;height:inherit;min-height:100%;padding:0;border:0;-webkit-backdrop-filter:var(--pico-modal-overlay-backdrop-filter);backdrop-filter:var(--pico-modal-overlay-backdrop-filter);background-color:var(--pico-modal-overlay-background-color);color:var(--pico-color)}dialog article{width:100%;max-height:calc(100vh - var(--pico-spacing) * 2);margin:var(--pico-spacing);overflow:auto}@media (min-width:576px){dialog article{max-width:510px}}@media (min-width:768px){dialog article{max-width:700px}}dialog article>header>*{margin-bottom:0}dialog article>header .close,dialog article>header :is(a,button)[rel=prev]{margin:0;margin-left:var(--pico-spacing);padding:0;float:right}dialog article>footer{text-align:right}dialog article>footer [role=button],dialog article>footer button{margin-bottom:0}dialog article>footer [role=button]:not(:first-of-type),dialog article>footer button:not(:first-of-type){margin-left:calc(var(--pico-spacing) * .5)}dialog article .close,dialog article :is(a,button)[rel=prev]{display:block;width:1rem;height:1rem;margin-top:calc(var(--pico-spacing) * -1);margin-bottom:var(--pico-spacing);margin-left:auto;border:none;background-image:var(--pico-icon-close);background-position:center;background-size:auto 1rem;background-repeat:no-repeat;background-color:transparent;opacity:.5;transition:opacity var(--pico-transition)}dialog article .close:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),dialog article :is(a,button)[rel=prev]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){opacity:1}dialog:not([open]),dialog[open=false]{display:none}.modal-is-open{padding-right:var(--pico-scrollbar-width,0);overflow:hidden;pointer-events:none;touch-action:none}.modal-is-open dialog{pointer-events:auto;touch-action:auto}:where(.modal-is-opening,.modal-is-closing) dialog,:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-duration:.2s;animation-timing-function:ease-in-out;animation-fill-mode:both}:where(.modal-is-opening,.modal-is-closing) dialog{animation-duration:.8s;animation-name:modal-overlay}:where(.modal-is-opening,.modal-is-closing) dialog>article{animation-delay:.2s;animation-name:modal}.modal-is-closing dialog,.modal-is-closing dialog>article{animation-delay:0s;animation-direction:reverse}@keyframes modal-overlay{from{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:transparent}}@keyframes modal{from{transform:translateY(-100%);opacity:0}}:where(nav li)::before{float:left;content:"​"}nav,nav ul{display:flex}nav{justify-content:space-between;overflow:visible}nav ol,nav ul{align-items:center;margin-bottom:0;padding:0;list-style:none}nav ol:first-of-type,nav ul:first-of-type{margin-left:calc(var(--pico-nav-element-spacing-horizontal) * -1)}nav ol:last-of-type,nav ul:last-of-type{margin-right:calc(var(--pico-nav-element-spacing-horizontal) * -1)}nav li{display:inline-block;margin:0;padding:var(--pico-nav-element-spacing-vertical) var(--pico-nav-element-spacing-horizontal)}nav li :where(a,[role=link]){display:inline-block;margin:calc(var(--pico-nav-link-spacing-vertical) * -1) calc(var(--pico-nav-link-spacing-horizontal) * -1);padding:var(--pico-nav-link-spacing-vertical) var(--pico-nav-link-spacing-horizontal);border-radius:var(--pico-border-radius)}nav li :where(a,[role=link]):not(:hover){text-decoration:none}nav li [role=button],nav li [type=button],nav li button,nav li input:not([type=checkbox],[type=radio],[type=range],[type=file]),nav li select{height:auto;margin-right:inherit;margin-bottom:0;margin-left:inherit;padding:calc(var(--pico-nav-link-spacing-vertical) - var(--pico-border-width) * 2) var(--pico-nav-link-spacing-horizontal)}nav[aria-label=breadcrumb]{align-items:center;justify-content:start}nav[aria-label=breadcrumb] ul li:not(:first-child){margin-inline-start:var(--pico-nav-link-spacing-horizontal)}nav[aria-label=breadcrumb] ul li a{margin:calc(var(--pico-nav-link-spacing-vertical) * -1) 0;margin-inline-start:calc(var(--pico-nav-link-spacing-horizontal) * -1)}nav[aria-label=breadcrumb] ul li:not(:last-child)::after{display:inline-block;position:absolute;width:calc(var(--pico-nav-link-spacing-horizontal) * 4);margin:0 calc(var(--pico-nav-link-spacing-horizontal) * -1);content:var(--pico-nav-breadcrumb-divider);color:var(--pico-muted-color);text-align:center;text-decoration:none;white-space:nowrap}nav[aria-label=breadcrumb] a[aria-current]:not([aria-current=false]){background-color:transparent;color:inherit;text-decoration:none;pointer-events:none}aside li,aside nav,aside ol,aside ul{display:block}aside li{padding:calc(var(--pico-nav-element-spacing-vertical) * .5) var(--pico-nav-element-spacing-horizontal)}aside li a{display:block}aside li [role=button]{margin:inherit}[dir=rtl] nav[aria-label=breadcrumb] ul li:not(:last-child) ::after{content:"\\"}progress{display:inline-block;vertical-align:baseline}progress{-webkit-appearance:none;-moz-appearance:none;display:inline-block;appearance:none;width:100%;height:.5rem;margin-bottom:calc(var(--pico-spacing) * .5);overflow:hidden;border:0;border-radius:var(--pico-border-radius);background-color:var(--pico-progress-background-color);color:var(--pico-progress-color)}progress::-webkit-progress-bar{border-radius:var(--pico-border-radius);background:0 0}progress[value]::-webkit-progress-value{background-color:var(--pico-progress-color);-webkit-transition:inline-size var(--pico-transition);transition:inline-size var(--pico-transition)}progress::-moz-progress-bar{background-color:var(--pico-progress-color)}@media (prefers-reduced-motion:no-preference){progress:indeterminate{background:var(--pico-progress-background-color) linear-gradient(to right,var(--pico-progress-color) 30%,var(--pico-progress-background-color) 30%) top left/150% 150% no-repeat;animation:progress-indeterminate 1s linear infinite}progress:indeterminate[value]::-webkit-progress-value{background-color:transparent}progress:indeterminate::-moz-progress-bar{background-color:transparent}}@media (prefers-reduced-motion:no-preference){[dir=rtl] progress:indeterminate{animation-direction:reverse}}@keyframes progress-indeterminate{0%{background-position:200% 0}100%{background-position:-200% 0}}[data-tooltip]{position:relative}[data-tooltip]:not(a,button,input){border-bottom:1px dotted;text-decoration:none;cursor:help}[data-tooltip]::after,[data-tooltip]::before,[data-tooltip][data-placement=top]::after,[data-tooltip][data-placement=top]::before{display:block;z-index:99;position:absolute;bottom:100%;left:50%;padding:.25rem .5rem;overflow:hidden;transform:translate(-50%,-.25rem);border-radius:var(--pico-border-radius);background:var(--pico-tooltip-background-color);content:attr(data-tooltip);color:var(--pico-tooltip-color);font-style:normal;font-weight:var(--pico-font-weight);font-size:.875rem;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;opacity:0;pointer-events:none}[data-tooltip]::after,[data-tooltip][data-placement=top]::after{padding:0;transform:translate(-50%,0);border-top:.3rem solid;border-right:.3rem solid transparent;border-left:.3rem solid transparent;border-radius:0;background-color:transparent;content:"";color:var(--pico-tooltip-background-color)}[data-tooltip][data-placement=bottom]::after,[data-tooltip][data-placement=bottom]::before{top:100%;bottom:auto;transform:translate(-50%,.25rem)}[data-tooltip][data-placement=bottom]:after{transform:translate(-50%,-.3rem);border:.3rem solid transparent;border-bottom:.3rem solid}[data-tooltip][data-placement=left]::after,[data-tooltip][data-placement=left]::before{top:50%;right:100%;bottom:auto;left:auto;transform:translate(-.25rem,-50%)}[data-tooltip][data-placement=left]:after{transform:translate(.3rem,-50%);border:.3rem solid transparent;border-left:.3rem solid}[data-tooltip][data-placement=right]::after,[data-tooltip][data-placement=right]::before{top:50%;right:auto;bottom:auto;left:100%;transform:translate(.25rem,-50%)}[data-tooltip][data-placement=right]:after{transform:translate(-.3rem,-50%);border:.3rem solid transparent;border-right:.3rem solid}[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{opacity:1}@media (hover:hover) and (pointer:fine){[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{--pico-tooltip-slide-to:translate(-50%, -0.25rem);transform:translate(-50%,.75rem);animation-duration:.2s;animation-fill-mode:forwards;animation-name:tooltip-slide;opacity:0}[data-tooltip]:focus::after,[data-tooltip]:hover::after{--pico-tooltip-caret-slide-to:translate(-50%, 0rem);transform:translate(-50%,-.25rem);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:focus::before,[data-tooltip][data-placement=bottom]:hover::after,[data-tooltip][data-placement=bottom]:hover::before{--pico-tooltip-slide-to:translate(-50%, 0.25rem);transform:translate(-50%,-.75rem);animation-name:tooltip-slide}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:hover::after{--pico-tooltip-caret-slide-to:translate(-50%, -0.3rem);transform:translate(-50%,-.5rem);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:focus::before,[data-tooltip][data-placement=left]:hover::after,[data-tooltip][data-placement=left]:hover::before{--pico-tooltip-slide-to:translate(-0.25rem, -50%);transform:translate(.75rem,-50%);animation-name:tooltip-slide}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:hover::after{--pico-tooltip-caret-slide-to:translate(0.3rem, -50%);transform:translate(.05rem,-50%);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:focus::before,[data-tooltip][data-placement=right]:hover::after,[data-tooltip][data-placement=right]:hover::before{--pico-tooltip-slide-to:translate(0.25rem, -50%);transform:translate(-.75rem,-50%);animation-name:tooltip-slide}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:hover::after{--pico-tooltip-caret-slide-to:translate(-0.3rem, -50%);transform:translate(-.05rem,-50%);animation-name:tooltip-caret-slide}}@keyframes tooltip-slide{to{transform:var(--pico-tooltip-slide-to);opacity:1}}@keyframes tooltip-caret-slide{50%{opacity:0}to{transform:var(--pico-tooltip-caret-slide-to);opacity:1}}[aria-controls]{cursor:pointer}[aria-disabled=true],[disabled]{cursor:not-allowed}[aria-hidden=false][hidden]{display:initial}[aria-hidden=false][hidden]:not(:focus){clip:rect(0,0,0,0);position:absolute}[tabindex],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation}[dir=rtl]{direction:rtl}@media (prefers-reduced-motion:reduce){:not([aria-busy=true]),:not([aria-busy=true])::after,:not([aria-busy=true])::before{background-attachment:initial!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important}} \ No newline at end of file diff --git a/internal/server/http_server.go b/internal/server/http_server.go new file mode 100644 index 000000000..96f6efa02 --- /dev/null +++ b/internal/server/http_server.go @@ -0,0 +1,158 @@ +package server + +import ( + "embed" + "fmt" + koolo "github.com/hectorgimenez/koolo/internal" + "github.com/hectorgimenez/koolo/internal/config" + "github.com/hectorgimenez/koolo/internal/helper" + "html/template" + "io/fs" + "log/slog" + "net/http" +) + +type HttpServer struct { + logger *slog.Logger + manager *koolo.SupervisorManager +} + +var ( + //go:embed all:assets + assets embed.FS + //go:embed all:templates + templates embed.FS + + configTpl = template.Must(template.ParseFS(templates, "templates/config.html")) + indexTpl = template.Must(template.ParseFS(templates, "templates/index.html")) + charSettingsTpl = template.Must(template.ParseFS(templates, "templates/character_settings.html")) +) + +func New(logger *slog.Logger, manager *koolo.SupervisorManager) *HttpServer { + return &HttpServer{ + logger: logger, + manager: manager, + } +} + +func (s *HttpServer) Listen(port int) error { + http.HandleFunc("/", s.getRoot) + http.HandleFunc("/config", s.config) + http.HandleFunc("/addCharacter", s.add) + http.HandleFunc("/editCharacter", s.edit) + http.HandleFunc("/start", s.startSupervisor) + http.HandleFunc("/stop", s.stopSupervisor) + http.HandleFunc("/togglePause", s.togglePause) + + assets, _ := fs.Sub(assets, "assets") + http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.FS(assets)))) + + return http.ListenAndServe(fmt.Sprintf(":%d", port), nil) +} + +func (s *HttpServer) getRoot(w http.ResponseWriter, r *http.Request) { + if !helper.HasAdminPermission() { + tmpl := template.Must(template.ParseFS(templates, "templates/admin_required.html")) + tmpl.Execute(w, nil) + return + } + + if config.Koolo.FirstRun { + http.Redirect(w, r, "/config", http.StatusSeeOther) + return + } + + s.index(w) +} + +func (s *HttpServer) startSupervisor(w http.ResponseWriter, r *http.Request) { + s.manager.Start(r.URL.Query().Get("characterName")) + http.Redirect(w, r, "/", http.StatusSeeOther) +} + +func (s *HttpServer) stopSupervisor(w http.ResponseWriter, r *http.Request) { + s.manager.Stop(r.URL.Query().Get("characterName")) + http.Redirect(w, r, "/", http.StatusSeeOther) +} + +func (s *HttpServer) togglePause(w http.ResponseWriter, r *http.Request) { + s.manager.TogglePause(r.URL.Query().Get("characterName")) + http.Redirect(w, r, "/", http.StatusSeeOther) +} + +func (s *HttpServer) index(w http.ResponseWriter) { + status := make(map[string]koolo.Stats) + for _, supervisorName := range s.manager.AvailableSupervisors() { + status[supervisorName] = koolo.Stats{ + SupervisorStatus: koolo.NotStarted, + } + + status[supervisorName] = s.manager.Status(supervisorName) + } + + indexTpl.Execute(w, IndexData{Status: status}) +} + +func (s *HttpServer) config(w http.ResponseWriter, r *http.Request) { + if r.Method == "POST" { + err := r.ParseForm() + if err != nil { + configTpl.Execute(w, ConfigData{KooloCfg: config.Koolo, ErrorMessage: "Error parsing form"}) + return + } + + newConfig := *config.Koolo + newConfig.D2RPath = r.Form.Get("d2rpath") + newConfig.D2LoDPath = r.Form.Get("d2lodpath") + newConfig.FirstRun = false + + err = config.ValidateAndSaveConfig(newConfig) + if err == nil { + http.Redirect(w, r, "/", http.StatusSeeOther) + return + } + configTpl.Execute(w, ConfigData{KooloCfg: config.Koolo, ErrorMessage: err.Error()}) + return + } + + configTpl.Execute(w, ConfigData{KooloCfg: config.Koolo, ErrorMessage: ""}) +} + +func (s *HttpServer) add(w http.ResponseWriter, r *http.Request) { + var err error + if r.Method == "POST" { + err = r.ParseForm() + if err != nil { + + } + + supervisorName := r.Form.Get("name") + err = config.CreateFromTemplate(supervisorName) + if err != nil { + charSettingsTpl.Execute(w, CharacterSettings{ + ErrorMessage: err.Error(), + Supervisor: supervisorName, + }) + + return + } + + http.Redirect(w, r, "/", http.StatusSeeOther) + return + } + + supervisor := r.URL.Query().Get("supervisor") + cfg := config.Characters["template"] + if supervisor != "" { + cfg = config.Characters[supervisor] + } + + charSettingsTpl.Execute(w, CharacterSettings{ + Supervisor: supervisor, + CharacterCfg: cfg, + }) +} + +func (s *HttpServer) edit(w http.ResponseWriter, r *http.Request) { + +} diff --git a/internal/server/template_parameters.go b/internal/server/template_parameters.go new file mode 100644 index 000000000..bc0f90c86 --- /dev/null +++ b/internal/server/template_parameters.go @@ -0,0 +1,22 @@ +package server + +import ( + koolo "github.com/hectorgimenez/koolo/internal" + "github.com/hectorgimenez/koolo/internal/config" +) + +type IndexData struct { + ErrorMessage string + Status map[string]koolo.Stats +} + +type CharacterSettings struct { + ErrorMessage string + Supervisor string + *config.CharacterCfg +} + +type ConfigData struct { + ErrorMessage string + *config.KooloCfg +} diff --git a/internal/server/templates/admin_required.html b/internal/server/templates/admin_required.html new file mode 100644 index 000000000..dc354784e --- /dev/null +++ b/internal/server/templates/admin_required.html @@ -0,0 +1,18 @@ + + + + + + + + + Koolo Dashboard + + +
    +
    +

    Windows administrator permissions are required to run Koolo, please execute koolo.exe as administrator.

    +
    +
    + + \ No newline at end of file diff --git a/internal/server/templates/character_settings.html b/internal/server/templates/character_settings.html new file mode 100644 index 000000000..4db27461d --- /dev/null +++ b/internal/server/templates/character_settings.html @@ -0,0 +1,40 @@ + + + + + + + + + Koolo Settings + + +
    + + \ No newline at end of file diff --git a/internal/server/templates/config.html b/internal/server/templates/config.html new file mode 100644 index 000000000..19ef8d2ac --- /dev/null +++ b/internal/server/templates/config.html @@ -0,0 +1,53 @@ + + + + + + + + + Koolo Settings + + +
    + {{ if ne .ErrorMessage "" }} +
    +
    +
    +
    + {{ .ErrorMessage }} +
    +
    +
    +
    + {{ end }} +
    +

    Settings

    +
    +
    + + +
    + +
    +
    +
    + + \ No newline at end of file diff --git a/internal/server/templates/index.html b/internal/server/templates/index.html new file mode 100644 index 000000000..e588d74f0 --- /dev/null +++ b/internal/server/templates/index.html @@ -0,0 +1,71 @@ + + + + + + + + + + Koolo Dashboard + + +
    + + {{ if not .Status }} +
    +

    No characters found, start adding a new character.

    +
    + {{ else }} + + + + + + + + + + + + + {{ range $key, $value := .Status }} + + + + + + + + + + {{ end }} +
    CharacterStatusRunsChickensDeathsErrorsControl
    {{$key}}{{.SupervisorStatus}}{{.TotalGames}}{{.TotalChickens}}{{.TotalErrors}}{{.TotalDeaths}} + {{ if eq .SupervisorStatus "Paused" }} + + + + {{ else if or (eq .SupervisorStatus "In game") (eq .SupervisorStatus "Starting") }} + + + + {{ else }} + + + + {{ end }} + + + +
    + {{ end }} +
    + + \ No newline at end of file diff --git a/internal/single_supervisor.go b/internal/single_supervisor.go index a2742de55..aa150c514 100644 --- a/internal/single_supervisor.go +++ b/internal/single_supervisor.go @@ -4,79 +4,93 @@ import ( "context" "errors" "fmt" + "github.com/hectorgimenez/koolo/internal/container" + "github.com/hectorgimenez/koolo/internal/health" + "github.com/hectorgimenez/koolo/internal/run" "log/slog" "math/rand" "time" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/event" - "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/reader" - "github.com/hectorgimenez/koolo/internal/run" ) -type Supervisor interface { - Start(ctx context.Context, factory *run.Factory) error - Stop() - TogglePause() -} - type SinglePlayerSupervisor struct { - baseSupervisor + *baseSupervisor } -func NewSinglePlayerSupervisor(logger *slog.Logger, bot *Bot, gr *reader.GameReader, gm *helper.GameManager) *SinglePlayerSupervisor { - return &SinglePlayerSupervisor{ - baseSupervisor: baseSupervisor{ - logger: logger, - bot: bot, - gr: gr, - gm: gm, - }, +func NewSinglePlayerSupervisor(name string, bot *Bot, runFactory *run.Factory, statsHandler *StatsHandler, listener *event.Listener, c container.Container) (*SinglePlayerSupervisor, error) { + bs, err := newBaseSupervisor(bot, runFactory, name, statsHandler, listener, c) + if err != nil { + return nil, err } + + return &SinglePlayerSupervisor{ + baseSupervisor: bs, + }, nil } -// Start will stay running during the application lifecycle, it will orchestrate all the required bot pieces -func (s *SinglePlayerSupervisor) Start(ctx context.Context, factory *run.Factory) error { - err := s.ensureProcessIsRunningAndPrepare() +// Start will return error if it can not be started, otherwise will always return nil +func (s *SinglePlayerSupervisor) Start() error { + ctx, cancel := context.WithCancel(context.Background()) + s.cancelFn = cancel + + err := s.ensureProcessIsRunningAndPrepare(ctx) if err != nil { return fmt.Errorf("error preparing game: %w", err) } firstRun := true - for { - select { - case <-ctx.Done(): - return nil - default: - if !s.gm.InGame() { - if err = s.gm.NewGame(); err != nil { - s.logger.Error(fmt.Sprintf("Error creating new game: %s", err.Error())) - continue + go func() { + for { + select { + case <-ctx.Done(): + return + default: + if !s.c.Manager.InGame() { + if err = s.c.Manager.NewGame(); err != nil { + s.c.Logger.Error(fmt.Sprintf("Error creating new game: %s", err.Error())) + continue + } } - } - runs := factory.BuildRuns() - gameStart := time.Now() - if config.Config.Game.RandomizeRuns { - rand.Shuffle(len(runs), func(i, j int) { runs[i], runs[j] = runs[j], runs[i] }) - } - s.logGameStart(runs) - err = s.bot.Run(ctx, firstRun, runs) - if err != nil { - if errors.Is(context.Canceled, ctx.Err()) { - return nil + runs := s.runFactory.BuildRuns() + gameStart := time.Now() + if config.Characters[s.name].Game.RandomizeRuns { + rand.Shuffle(len(runs), func(i, j int) { runs[i], runs[j] = runs[j], runs[i] }) } - errorMsg := fmt.Sprintf("Game finished with errors, reason: %s. Game total time: %0.2fs", err.Error(), time.Since(gameStart).Seconds()) - event.Events <- event.WithScreenshot(errorMsg) - s.logger.Warn(errorMsg) - } - if exitErr := s.gm.ExitGame(); exitErr != nil { - return fmt.Errorf("error exiting game: %s", exitErr) - } - firstRun = false + s.logGameStart(runs) + err = s.bot.Run(ctx, firstRun, runs) + if err != nil { + if errors.Is(context.Canceled, ctx.Err()) { + continue + } - s.updateGameStats() + switch { + case errors.Is(err, health.ErrChicken): + s.c.EventChan <- event.GameFinished(event.WithScreenshot(err.Error(), s.c.Reader.Screenshot()), event.FinishedChicken) + s.c.Logger.Warn(err.Error(), slog.Float64("gameLength", time.Since(gameStart).Seconds())) + case errors.Is(err, health.ErrMercChicken): + s.c.EventChan <- event.GameFinished(event.WithScreenshot(err.Error(), s.c.Reader.Screenshot()), event.FinishedMercChicken) + s.c.Logger.Warn(err.Error(), slog.Float64("gameLength", time.Since(gameStart).Seconds())) + case errors.Is(err, health.ErrDied): + s.c.EventChan <- event.GameFinished(event.WithScreenshot(err.Error(), s.c.Reader.Screenshot()), event.FinishedDied) + s.c.Logger.Warn(err.Error(), slog.Float64("gameLength", time.Since(gameStart).Seconds())) + default: + s.c.EventChan <- event.GameFinished(event.WithScreenshot(err.Error(), s.c.Reader.Screenshot()), event.FinishedError) + s.c.Logger.Warn(fmt.Sprintf("Game finished with errors, reason: %s. Game total time: %0.2fs", err.Error(), time.Since(gameStart).Seconds())) + } + } + if exitErr := s.c.Manager.ExitGame(); exitErr != nil { + errMsg := fmt.Sprintf("Error exiting game %s", err.Error()) + s.c.EventChan <- event.GameFinished(event.WithScreenshot(errMsg, s.c.Reader.Screenshot()), event.FinishedError) + s.c.Logger.Warn(errMsg) + return + } + firstRun = false + } } - } + }() + + return nil } diff --git a/internal/stats.go b/internal/stats.go new file mode 100644 index 000000000..0941b3ebe --- /dev/null +++ b/internal/stats.go @@ -0,0 +1,195 @@ +package koolo + +import ( + "bufio" + "context" + "fmt" + "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/koolo/internal/event" + "log/slog" + "os" + "time" +) + +const ( + NotStarted SupervisorStatus = "Not Started" + Starting SupervisorStatus = "Starting" + InGame SupervisorStatus = "In game" + Paused SupervisorStatus = "Paused" + Crashed SupervisorStatus = "Crashed" +) + +type SupervisorStatus string + +type StatsHandler struct { + stats *Stats + name string + logger *slog.Logger +} + +func NewStatsHandler(name string, logger *slog.Logger) *StatsHandler { + return &StatsHandler{ + name: name, + logger: logger, + stats: &Stats{ + SupervisorStatus: Starting, + StartedAt: time.Now(), + }, + } +} + +func (h *StatsHandler) Handle(_ context.Context, e event.Event) error { + switch evt := e.(type) { + case event.GameCreatedEvent: + h.stats.Games = append(h.stats.Games, GameStats{ + StartedAt: evt.OccurredAt(), + }) + h.stats.SupervisorStatus = InGame + case event.GameFinishedEvent: + h.stats.Games[len(h.stats.Games)-1].FinishedAt = evt.OccurredAt() + h.stats.Games[len(h.stats.Games)-1].Reason = evt.Reason + h.stats.Games[len(h.stats.Games)-1].Runs[len(h.stats.Games[len(h.stats.Games)-1].Runs)-1].FinishedAt = evt.OccurredAt() + h.stats.Games[len(h.stats.Games)-1].Runs[len(h.stats.Games[len(h.stats.Games)-1].Runs)-1].Reason = evt.Reason + case event.RunStartedEvent: + if len(h.stats.Games) == 0 { + h.stats.Games = append(h.stats.Games, GameStats{ + StartedAt: evt.OccurredAt(), + }) + h.stats.SupervisorStatus = InGame + } + h.stats.Games[len(h.stats.Games)-1].Runs = append(h.stats.Games[len(h.stats.Games)-1].Runs, RunStats{ + Name: evt.RunName, + StartedAt: evt.OccurredAt(), + }) + case event.RunFinishedEvent: + h.stats.Games[len(h.stats.Games)-1].Runs[len(h.stats.Games[len(h.stats.Games)-1].Runs)-1].FinishedAt = evt.OccurredAt() + h.stats.Games[len(h.stats.Games)-1].Runs[len(h.stats.Games[len(h.stats.Games)-1].Runs)-1].Reason = evt.Reason + case event.ItemStashedEvent: + h.stats.Games[len(h.stats.Games)-1].Runs[len(h.stats.Games[len(h.stats.Games)-1].Runs)-1].Items = append(h.stats.Games[len(h.stats.Games)-1].Runs[len(h.stats.Games[len(h.stats.Games)-1].Runs)-1].Items, evt.Item) + case event.UsedPotionEvent: + h.stats.Games[len(h.stats.Games)-1].Runs[len(h.stats.Games[len(h.stats.Games)-1].Runs)-1].UsedPotions = append(h.stats.Games[len(h.stats.Games)-1].Runs[len(h.stats.Games[len(h.stats.Games)-1].Runs)-1].UsedPotions, evt) + } + + return nil +} + +func (h *StatsHandler) SetStatus(status SupervisorStatus) { + h.stats.SupervisorStatus = status +} + +func (h *StatsHandler) updateGameStatsFile() { + if _, err := os.Stat("stats"); os.IsNotExist(err) { + err = os.MkdirAll("stats", os.ModePerm) + if err != nil { + h.logger.Error("Error creating stats directory", slog.Any("error", err)) + return + } + } + + fileName := fmt.Sprintf("stats/stats_%s_%s.txt", h.name, h.stats.StartedAt.Format("2006-02-01-15_04_05")) + f, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + h.logger.Error("Error writing game stats", slog.Any("error", err)) + return + } + w := bufio.NewWriter(f) + + //for _, game := range h.stats.Games { + // var items = "" + // for _, item := range rs.ItemsFound { + // items += fmt.Sprintf("%s [%d]\n", item.Name, item.Quality) + // } + // avgRunTime := rs.RunningTime.Seconds() / float64(rs.Errors+rs.Kills+rs.Deaths+rs.Chickens+rs.MerChicken) + // statsRun := fmt.Sprintf("Stats for: %s\n"+ + // " Run time: %0.2fs (Total) %0.2fs (Average)\n"+ + // " Kills: %d\n"+ + // " Deaths: %d\n"+ + // " Chickens: %d\n"+ + // " Merc Chickens: %d\n"+ + // " Errors: %d\n"+ + // " Used HP Potions: %d\n"+ + // " Used MP Potions: %d\n"+ + // " Used Rejuv Potions: %d\n"+ + // " Used Merc HP Potions: %d\n"+ + // " Used Merc Rejuv Potions: %d\n"+ + // " Items: \n"+ + // " %s", + // runName, + // rs.RunningTime.Seconds(), avgRunTime, + // rs.Kills, + // rs.Deaths, + // rs.Chickens, + // rs.MerChicken, + // rs.Errors, + // rs.HealingPotionsUsed, + // rs.ManaPotionsUsed, + // rs.RejuvPotionsUsed, + // rs.MercHealingPotionsUsed, + // rs.MercRejuvPotionsUsed, + // items, + // ) + // _, err = w.WriteString(statsRun + "\n") + // if err != nil { + // s.logger.Error("Error writing stats file", slog.Any("error", err)) + // } + //} + + w.Flush() + f.Close() +} + +func (h *StatsHandler) Stats() Stats { + return *h.stats +} + +type Stats struct { + StartedAt time.Time + SupervisorStatus SupervisorStatus + Details string + Games []GameStats +} + +type GameStats struct { + StartedAt time.Time + FinishedAt time.Time + Reason event.FinishReason + Runs []RunStats +} + +type RunStats struct { + Name string + Reason event.FinishReason + StartedAt time.Time + Items []data.Item + FinishedAt time.Time + UsedPotions []event.UsedPotionEvent +} + +func (s Stats) TotalGames() int { + return len(s.Games) +} + +func (s Stats) TotalDeaths() int { + return s.totalRunsByReason(event.FinishedDied) +} + +func (s Stats) TotalChickens() int { + return s.totalRunsByReason(event.FinishedChicken) + s.totalRunsByReason(event.FinishedMercChicken) +} + +func (s Stats) TotalErrors() int { + return s.totalRunsByReason(event.FinishedError) +} + +func (s Stats) totalRunsByReason(reason event.FinishReason) int { + total := 0 + for _, g := range s.Games { + for _, r := range g.Runs { + if r.Reason == reason { + total++ + } + } + } + + return total +} diff --git a/internal/supervisor.go b/internal/supervisor.go index 282ec1394..91bf09049 100644 --- a/internal/supervisor.go +++ b/internal/supervisor.go @@ -1,131 +1,102 @@ package koolo import ( - "bufio" - "errors" + "context" "fmt" - "github.com/hectorgimenez/koolo/internal/memory" + "github.com/hectorgimenez/koolo/internal/container" + "github.com/hectorgimenez/koolo/internal/event" + "github.com/hectorgimenez/koolo/internal/game" + "github.com/hectorgimenez/koolo/internal/helper/winproc" + "github.com/hectorgimenez/koolo/internal/run" "log/slog" - "os" - "syscall" "time" - - "github.com/hectorgimenez/koolo/internal/event/stat" - "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" - "github.com/hectorgimenez/koolo/internal/reader" - "github.com/hectorgimenez/koolo/internal/run" - "github.com/lxn/win" ) +type Supervisor interface { + Start() error + Name() string + Stop() + TogglePause() + Stats() Stats +} + type baseSupervisor struct { - logger *slog.Logger - bot *Bot - gr *reader.GameReader - gm *helper.GameManager + bot *Bot + runFactory *run.Factory + name string + statsHandler *StatsHandler + listener *event.Listener + cancelFn context.CancelFunc + c container.Container } -func (s *baseSupervisor) TogglePause() { - s.bot.TogglePause() +func newBaseSupervisor( + bot *Bot, + runFactory *run.Factory, + name string, + statsHandler *StatsHandler, + listener *event.Listener, + c container.Container, +) (*baseSupervisor, error) { + return &baseSupervisor{ + bot: bot, + runFactory: runFactory, + name: name, + statsHandler: statsHandler, + listener: listener, + c: c, + }, nil } -func (s *baseSupervisor) Stop() { - s.logger.Info("Shutting down NOW") - os.Exit(0) +func (s *baseSupervisor) Name() string { + return s.name } -func (s *baseSupervisor) updateGameStats() { - if _, err := os.Stat("stats"); os.IsNotExist(err) { - err = os.MkdirAll("stats", os.ModePerm) - if err != nil { - s.logger.Error("Error creating stats directory", slog.Any("error", err)) - return - } - } +func (s *baseSupervisor) Stats() Stats { + return s.statsHandler.Stats() +} - fileName := fmt.Sprintf("stats/stats_%s.txt", stat.Status.ApplicationStartedAt.Format("2006-02-01-15_04_05")) - f, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - s.logger.Error("Error writing game stats", slog.Any("error", err)) - return +func (s *baseSupervisor) TogglePause() { + s.bot.TogglePause() + if s.bot.paused { + s.statsHandler.SetStatus(Paused) + s.c.Injector.RestoreMemory() + } else { + s.statsHandler.SetStatus(InGame) + s.c.Injector.Load() } - w := bufio.NewWriter(f) - - for runName, rs := range stat.Status.RunStats { - var items = "" - for _, item := range rs.ItemsFound { - items += fmt.Sprintf("%s [%d]\n", item.Name, item.Quality) - } - avgRunTime := rs.TotalRunsTime.Seconds() / float64(rs.Errors+rs.Kills+rs.Deaths+rs.Chickens+rs.MerChicken) - statsRun := fmt.Sprintf("Stats for: %s\n"+ - " Run time: %0.2fs (Total) %0.2fs (Average)\n"+ - " Kills: %d\n"+ - " Deaths: %d\n"+ - " Chickens: %d\n"+ - " Merc Chickens: %d\n"+ - " Errors: %d\n"+ - " Used HP Potions: %d\n"+ - " Used MP Potions: %d\n"+ - " Used Rejuv Potions: %d\n"+ - " Used Merc HP Potions: %d\n"+ - " Used Merc Rejuv Potions: %d\n"+ - " Items: \n"+ - " %s", - runName, - rs.TotalRunsTime.Seconds(), avgRunTime, - rs.Kills, - rs.Deaths, - rs.Chickens, - rs.MerChicken, - rs.Errors, - rs.HealingPotionsUsed, - rs.ManaPotionsUsed, - rs.RejuvPotionsUsed, - rs.MercHealingPotionsUsed, - rs.MercRejuvPotionsUsed, - items, - ) - _, err = w.WriteString(statsRun + "\n") - if err != nil { - s.logger.Error("Error writing stats file", slog.Any("error", err)) - } +} + +func (s *baseSupervisor) Stop() { + s.c.Logger.Info("Stopping...", slog.String("configuration", s.name)) + if s.cancelFn != nil { + s.cancelFn() } - w.Flush() - f.Close() + s.c.Injector.Unload() + s.c.Logger.Info("Finished stopping", slog.String("configuration", s.name)) } -func (s *baseSupervisor) ensureProcessIsRunningAndPrepare() error { - ptr, err := syscall.UTF16PtrFromString("Diablo II: Resurrected") +func (s *baseSupervisor) ensureProcessIsRunningAndPrepare(ctx context.Context) error { + // Prevent screen from turning off + winproc.SetThreadExecutionState.Call(winproc.EXECUTION_STATE_ES_DISPLAY_REQUIRED | winproc.EXECUTION_STATE_ES_CONTINUOUS) + + // TODO: refactor this + go s.listener.Listen(ctx) + + err := s.c.Injector.Load() if err != nil { return err } - window := win.FindWindow(nil, ptr) - if window == win.HWND_TOP { - return errors.New("diablo II: Resurrected window can not be found! Ensure game is open") + + s.c.Logger.Info("Waiting for character selection screen...") + for range 25 { + s.c.HID.Click(game.LeftButton, 100, 100) + time.Sleep(time.Second) } - memory.HWND = window - - pos := win.WINDOWPLACEMENT{} - point := win.POINT{} - win.ClientToScreen(window, &point) - win.GetWindowPlacement(window, &pos) - - hid.WindowLeftX = int(point.X) - hid.WindowTopY = int(point.Y) - hid.GameAreaSizeX = int(pos.RcNormalPosition.Right) - hid.WindowLeftX - 9 - hid.GameAreaSizeY = int(pos.RcNormalPosition.Bottom) - hid.WindowTopY - 9 - helper.Sleep(1000) - - s.logger.Info(fmt.Sprintf( - "Diablo II: Resurrected window detected, offsetX: %d offsetY: %d. Game Area Size X: %d Y: %d", - hid.WindowLeftX, - hid.WindowTopY, - hid.GameAreaSizeX, - hid.GameAreaSizeY, - )) - - stat.Status.ApplicationStartedAt = time.Now() + + s.c.Logger.Info("Trying to start game...") + return nil } @@ -134,6 +105,5 @@ func (s *baseSupervisor) logGameStart(runs []run.Run) { for _, r := range runs { runNames += r.Name() + ", " } - stat.Status.TotalGames++ - s.logger.Info(fmt.Sprintf("Starting Game #%d. Run list: %s", stat.Status.TotalGames, runNames[:len(runNames)-2])) + s.c.Logger.Info(fmt.Sprintf("Starting Game #%d. Run list: %s", s.statsHandler.Stats().TotalGames(), runNames[:len(runNames)-2])) } diff --git a/internal/town/shop_manager.go b/internal/town/shop_manager.go index 851d2850e..3a5e925a6 100644 --- a/internal/town/shop_manager.go +++ b/internal/town/shop_manager.go @@ -2,28 +2,30 @@ package town import ( "fmt" + "github.com/hectorgimenez/koolo/internal/container" + "github.com/hectorgimenez/koolo/internal/game" "log/slog" "math/rand" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/item" "github.com/hectorgimenez/d2go/pkg/data/stat" - "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/health" "github.com/hectorgimenez/koolo/internal/helper" - "github.com/hectorgimenez/koolo/internal/hid" "github.com/hectorgimenez/koolo/internal/ui" ) type ShopManager struct { - logger *slog.Logger - bm health.BeltManager + logger *slog.Logger + bm health.BeltManager + container container.Container } -func NewShopManager(logger *slog.Logger, bm health.BeltManager) ShopManager { +func NewShopManager(logger *slog.Logger, bm health.BeltManager, container container.Container) ShopManager { return ShopManager{ - logger: logger, - bm: bm, + logger: logger, + bm: bm, + container: container, } } @@ -42,7 +44,7 @@ func (sm ShopManager) BuyConsumables(d data.Data, forceRefill bool) { pot, found = sm.findFirstMatch(d, "supermanapotion", "greatermanapotion", "manapotion", "lightmanapotion", "minormanapotion") // In Normal greater potions are expensive as we are low level, let's keep with cheap ones - if config.Config.Game.Difficulty == "normal" { + if sm.container.CharacterCfg.Game.Difficulty == "normal" { pot, found = sm.findFirstMatch(d, "manapotion", "lightmanapotion", "minormanapotion") } if found && missingManaPots > 0 { @@ -131,8 +133,8 @@ func (sm ShopManager) ShouldBuyKeys(d data.Data) bool { } func (sm ShopManager) SellJunk(d data.Data) { - for _, i := range ItemsToBeSold(d) { - if config.Config.Inventory.InventoryLock[i.Position.Y][i.Position.X] == 1 { + for _, i := range ItemsToBeSold(sm.container.CharacterCfg.Inventory.InventoryLock, d) { + if sm.container.CharacterCfg.Inventory.InventoryLock[i.Position.Y][i.Position.X] == 1 { sm.SellItem(i) } } @@ -141,7 +143,7 @@ func (sm ShopManager) SellJunk(d data.Data) { func (sm ShopManager) SellItem(i data.Item) { screenPos := ui.GetScreenCoordsForItem(i) helper.Sleep(500) - hid.ClickWithModifier(hid.LeftButton, screenPos.X, screenPos.Y, hid.CtrlKey) + sm.container.HID.ClickWithModifier(game.LeftButton, screenPos.X, screenPos.Y, game.CtrlKey) helper.Sleep(500) sm.logger.Debug(fmt.Sprintf("Item %s [%d] sold", i.Name, i.Quality)) } @@ -150,7 +152,7 @@ func (sm ShopManager) BuyItem(i data.Item, quantity int) { screenPos := ui.GetScreenCoordsForItem(i) helper.Sleep(250) for k := 0; k < quantity; k++ { - hid.Click(hid.RightButton, screenPos.X, screenPos.Y) + sm.container.HID.Click(game.RightButton, screenPos.X, screenPos.Y) helper.Sleep(900) sm.logger.Debug(fmt.Sprintf("Purchased %s [X:%d Y:%d]", i.Name, i.Position.X, i.Position.Y)) } @@ -158,17 +160,17 @@ func (sm ShopManager) BuyItem(i data.Item, quantity int) { func (sm ShopManager) buyFullStack(i data.Item) { screenPos := ui.GetScreenCoordsForItem(i) - hid.ClickWithModifier(hid.RightButton, screenPos.X, screenPos.Y, hid.ShiftKey) + sm.container.HID.ClickWithModifier(game.RightButton, screenPos.X, screenPos.Y, game.ShiftKey) helper.Sleep(500) } -func ItemsToBeSold(d data.Data) (items []data.Item) { +func ItemsToBeSold(lockPattern [][]int, d data.Data) (items []data.Item) { for _, itm := range d.Items.ByLocation(item.LocationInventory) { if itm.IsFromQuest() { continue } - if config.Config.Inventory.InventoryLock[itm.Position.Y][itm.Position.X] == 1 { + if lockPattern[itm.Position.Y][itm.Position.X] == 1 { items = append(items, itm) } } diff --git a/internal/ui/coordinates.go b/internal/ui/coordinates.go index a0dafdffc..dc392bce5 100644 --- a/internal/ui/coordinates.go +++ b/internal/ui/coordinates.go @@ -3,8 +3,6 @@ package ui import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/item" - "github.com/hectorgimenez/koolo/internal/memory" - "github.com/lxn/win" ) const ( @@ -55,8 +53,3 @@ func GetScreenCoordsForItem(itm data.Item) data.Position { return data.Position{X: x, Y: y} } - -func GameWindowScale() float64 { - dpi := win.GetDpiForWindow(memory.HWND) - return float64(dpi) / 96.0 -} diff --git a/tools/handle64.exe b/tools/handle64.exe new file mode 100644 index 0000000000000000000000000000000000000000..c822dc9bd7b7738b81f0349035b2ea7ee7ead1eb GIT binary patch literal 416144 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Ν%!faWvv_jBjM3a3`;B7t-gY#Uxc;m8)>B=c;HT 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

    3N=rQyF|_esrty zich!8v@nTJIqyE~c`lRoEW(oW0Wl=*y6@q`#ORO$tM-$=D_7N~`Dqs8W*TWE4=|OrJ-Y@3`hkYy;l~WEHdz#A7+dPTd=RZhy$_TyEL12N zi_k1-+o7{RfmGjhxE{9PKJ+-Ow=QC%)o$N2hi#EOQ$jIrXtsSIy@{t^a|&H+jrgSw@8Y9v1!!cPL66-8NDdNs*tY zaImLnIP2Wy4Nst$P^VKRy=B49T{i}<%nZ-kAagw9bhfMSh8b-u3LiW@7}h=RxmVWh z4DxZ#{Geu%rS{X4GCRepOj)V!ZZFOn!?F`s+}?R#&Co$! zL)29HhPy6Mtcp&J4fZa!7}E)JMoQ-wJh=L_F=6aY8zo!xfr;Mx6PIrezSJ}c+w8oj z#&4M-xgbLKY%?|-f@F0B7x5dTGMBVn?s68t@PKtaU)Ndn(&I`d*8KVg#_P8<_2z5X zhY#%DuU74OPTZa;i#}-0WO>nwxsZ#G!Tn z*5DyOYgs!DMC$I>@jYG#Ld#FTi&d}f8a;WxBvuCh@uw!`9{x0Oo*RJljvu@%&rG@)HK|17j%__7IIn@MRi9Sj z{OG;Qmg>hL*|-@uUNjt7h}FoR?{nD+sOL-HcI5b#vY%HzW*jQy6uPb0b-&`-iqc>$ zT<`$0zxLC%z?b({KMt;iF467ldG8+JQ~}j_SF4uusbO@%j-(gE@mUVKauF02On1RY zqony;25-tgfo=Xesy725X!M<^J^H%Hb@+2c%wZpy_R^aB+pA|of_~L;`l;&uzuNBg zQ_=lTnp5IVg5Zt?L&oYU8gUP^GhV21Uz^0b9^#tTWlclRZGXM$d1f-}-o50M+WZRJ zy$TBSg!1vsLmrRj_lMTRLJNI8UMb9fr?C3oGZuVPTOBE0s(r=AE4zK_cq-Vb;0Jom)O72RE0bs@3BO@qtR zxmCeg&U%Q>eg1Y$(V{ns?XhE4F#}@B#XZ?_`xd_2*qnM`={Ccv^rico%al(`+k7bU zjwQMKTk7l|+84OzF#429gH!xm(`BpFA5yY>ZenqrRKNNL5 z(#yQPPh?P+RXwL}KU6U?qGMK|dH9&;f>NU(T-Lqaixbz#mhGG_*mJ6RV1~6Jsj@93$qG~}y{RK8ZPvGfz&s)!L)ND=U|mbV=UMk=4xfeXy@ zUacZ^%vG0r^N+XdPtTb4zjbW?QIF~$Z`VKGF5z5j|9HE^|Bp>l^pCge|Gc-W4czPq z@8c2a6UFKOb$8nTV(AJ-cX0EHoK3E|CCOzvAl>S2hqV7~EnOlngTJ?QA&tT0d#2x6 zy1uMHY(ZFkXUh^n8Ujn_l%)%7Kxo>M7Fx1IrDuqO`PV+%yA*W4xVmf~3IE{V=jt-> zKAX2q|IUlnMm1y^UL|nTE1GiOio2I=mxo58ymv|1Yoa=Pu z_|_*?*D*&;9jxX)TYWN7#&t_jY9%yDSMBfT>iS7n=ldS(pLKPu817){KN;@rc+|bP z(9!Nqx!`uoT@RNsM|t>$f`@g%zwhc=n{sy^v@jVpDK6XOJc`_wU>&O(O4VCxuw410 zB#vDBcXD<87&zeS+Wrw@Vt_6~Sl@4U_pFvY~@yIx}!BF|xz}2C|H$Sw@gsv{+ zbn}Rvq z&uz_6ku@m;2LwBi$KQv%Z_azEwXC^pJj=R245Qct-CLx+#5p^&x>x7P6WiCmOP;-0 zcd$0}d}yr0>RV?YUMsgNT)6MxsmUEnpL>_>@~=ZT8llkS8O0I{>Aq$n>1Qf(HAEI4~oEnHsI zU@2k7tSUs4H7_I^lvK&jGWdwTecspgok3;o^0@}DQ?DxbTHKm;0LOSVpX~B}hl7&w zT}PV!Nv)xFOQg$f2(BQ)*LDHl8F|CSIQh9lEjrtE Date: Wed, 13 Mar 2024 22:09:36 +0900 Subject: [PATCH 018/548] updated readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index dbfb3a6a3..2a0ed8e91 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Koolo is a small bot for Diablo II: Resurrected. Koolo project was built for informational and educational purposes only, it's not intended for online usage. Feel free to contribute opening pull requests with new features or bugfixes. -Koolo reads game memory and interacts with the game injecting clicks/keystrokes to the game window. +Koolo reads game memory and interacts with the game injecting clicks/keystrokes to the game window. As good as it can. ## Disclaimer Can I get banned for using Koolo? The answer is a crystal clear yes, you can get banned although at this point I'm @@ -34,14 +34,14 @@ not aware of any ban for using it. I'm not responsible for any ban or any other - **Diablo II: LOD 1.13c** (IMPORTANT: It will **NOT** work without it, this step is not optional) ## Quick Start +- Open Diablo II: Resurrected and ensure the game resolution is set to windowed mode and 1280x720 or 1920x1080 in HiDPI mode. You can close the game after this step. - If you haven't done yet, install **Diablo II: LOD 1.13c** - [Download](https://github.com/hectorgimenez/koolo/releases) the latest Koolo release (recommended for most users), or alternatively you can [build it from source](#development-environment) - Extract the zip file in a directory of your choice. -- Open `config/config.yaml` with your favorite text editor and ensure `D2LoDPath` config is pointing to your **Diablo II: LOD 1.13c** installation directory. -- Configure custom bot settings under `config/config.yaml` and `config/pickit/*.nip` files for pickit rules. -- Open Diablo II: Resurrected and ensure the game resolution is set to windowed mode and 1280x720 or 1920x1080 in HiDPI mode. -- Enter the game with your character. - Run `koolo.exe`. +- Follow the setup wizard, it will guide you through the process of setting up the bot, you will need to setup some directories and character configuration. +- If you want to back up/restore your configuration, and for manual setup, you can find the configuration files in the `config` directory. + ## Development environment **Note:** This is only required if you want to build the project from source. If you want to run the bot, you can just download the [latest release](https://github.com/hectorgimenez/koolo/releases). From 2a7cd4774ddedc5aad1d9d473fba326af56b6319 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Wed, 13 Mar 2024 22:24:40 +0900 Subject: [PATCH 019/548] update lightning sorc attack script --- internal/character/lightning_sorceress.go | 52 ++++++++++++++++++----- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/internal/character/lightning_sorceress.go b/internal/character/lightning_sorceress.go index 61360b871..5ebe1700f 100644 --- a/internal/character/lightning_sorceress.go +++ b/internal/character/lightning_sorceress.go @@ -14,8 +14,8 @@ import ( const ( lightningSorceressMaxAttacksLoop = 10 - lightningSorceressMinDistance = 2 - lightningSorceressMaxDistance = 8 + lightningSorceressMinDistance = 8 + lightningSorceressMaxDistance = 15 ) type LightningSorceress struct { @@ -52,11 +52,13 @@ func (s LightningSorceress) KillMonsterSequence( } steps := make([]step.Step, 0) - for _, m := range d.Monsters.Enemies() { - if d := pather.DistanceFromMe(d, m.Position); d < 5 { - s.logger.Debug("Monster detected close to the player, casting Nova over it") - steps = append(steps, step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.Nova, 0, 3, opts...)) - break + if completedAttackLoops%2 == 0 { + for _, m := range d.Monsters.Enemies() { + if d := pather.DistanceFromMe(d, m.Position); d < 5 { + s.logger.Debug("Monster detected close to the player, casting Nova over it") + steps = append(steps, step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.Nova, m.UnitID, 1, opts...)) + break + } } } @@ -90,7 +92,17 @@ func (s LightningSorceress) KillCountess() action.Action { } func (s LightningSorceress) KillAndariel() action.Action { - return s.killMonsterByName(npc.Andariel, data.MonsterTypeNone, lightningSorceressMaxDistance, false, nil) + return action.NewChain(func(d data.Data) []action.Action { + return []action.Action{ + action.NewStepChain(func(d data.Data) []step.Step { + m, _ := d.Monsters.FindOne(npc.Andariel, data.MonsterTypeNone) + return []step.Step{ + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, m.UnitID, 7, step.Distance(lightningSorceressMaxDistance, 15)), + } + }), + s.killMonsterByName(npc.Andariel, data.MonsterTypeNone, lightningSorceressMaxDistance, false, nil), + } + }) } func (s LightningSorceress) KillSummoner() action.Action { @@ -98,7 +110,17 @@ func (s LightningSorceress) KillSummoner() action.Action { } func (s LightningSorceress) KillDuriel() action.Action { - return s.killMonsterByName(npc.Duriel, data.MonsterTypeNone, lightningSorceressMaxDistance, true, nil) + return action.NewChain(func(d data.Data) []action.Action { + return []action.Action{ + action.NewStepChain(func(d data.Data) []step.Step { + m, _ := d.Monsters.FindOne(npc.Duriel, data.MonsterTypeNone) + return []step.Step{ + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, m.UnitID, 7, step.Distance(lightningSorceressMaxDistance, 15)), + } + }), + s.killMonsterByName(npc.Duriel, data.MonsterTypeNone, lightningSorceressMaxDistance, true, nil), + } + }) } func (s LightningSorceress) KillPindle(skipOnImmunities []stat.Resist) action.Action { @@ -106,7 +128,17 @@ func (s LightningSorceress) KillPindle(skipOnImmunities []stat.Resist) action.Ac } func (s LightningSorceress) KillMephisto() action.Action { - return s.killMonsterByName(npc.Mephisto, data.MonsterTypeNone, lightningSorceressMaxDistance, true, nil) + return action.NewChain(func(d data.Data) []action.Action { + return []action.Action{ + action.NewStepChain(func(d data.Data) []step.Step { + m, _ := d.Monsters.FindOne(npc.Mephisto, data.MonsterTypeNone) + return []step.Step{ + step.SecondaryAttack(s.container.CharacterCfg, s.container.CharacterCfg.Bindings.Sorceress.StaticField, m.UnitID, 7, step.Distance(lightningSorceressMaxDistance, 15)), + } + }), + s.killMonsterByName(npc.Mephisto, data.MonsterTypeNone, lightningSorceressMaxDistance, true, nil), + } + }) } func (s LightningSorceress) KillNihlathak() action.Action { From 763c2f5d52f86a483e3f27f682e116d8325a7cb2 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Thu, 14 Mar 2024 08:28:11 +0900 Subject: [PATCH 020/548] fixed bug causing error on creating new character --- internal/config/config.go | 2 +- internal/server/http_server.go | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/config/config.go b/internal/config/config.go index 1589d3a6d..41c099d89 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -214,7 +214,7 @@ func CreateFromTemplate(name string) error { return errors.New("name cannot be empty") } - if _, err := os.Stat("config/" + name); !os.IsExist(err) { + if _, err := os.Stat("config/" + name); !os.IsNotExist(err) { return errors.New("configuration with that name already exists") } diff --git a/internal/server/http_server.go b/internal/server/http_server.go index 96f6efa02..b5c900886 100644 --- a/internal/server/http_server.go +++ b/internal/server/http_server.go @@ -123,7 +123,11 @@ func (s *HttpServer) add(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { err = r.ParseForm() if err != nil { + charSettingsTpl.Execute(w, CharacterSettings{ + ErrorMessage: err.Error(), + }) + return } supervisorName := r.Form.Get("name") From 093f79ff6fd56735908a7013580609aad804471d Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Thu, 21 Mar 2024 22:09:41 +0900 Subject: [PATCH 021/548] add more fields to the GUI config and fixed a bug causing supervisor status not being updated until first game was created --- go.mod | 2 +- go.sum | 8 +++--- internal/companion_supervisor.go | 1 + internal/server/http_server.go | 27 ++++++++++++++----- internal/server/templates/config.html | 39 +++++++++++++++++++++++++++ internal/server/templates/index.html | 2 ++ internal/single_supervisor.go | 1 + internal/supervisor.go | 25 ++++++++--------- 8 files changed, 80 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index 77ada6f53..238d8cbf5 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/beefsack/go-astar v0.0.0-20200827232313-4ecf9e304482 github.com/bwmarrin/discordgo v0.27.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 - github.com/hectorgimenez/d2go v0.0.0-20240309143442-8f9f49addc36 + github.com/hectorgimenez/d2go v0.0.0-20240321125418-fec7da312157 github.com/inkeliz/gowebview v1.0.1 github.com/lxn/win v0.0.0-20210218163916-a377121e959e github.com/otiai10/copy v1.14.0 diff --git a/go.sum b/go.sum index 89379a141..1a6033de6 100644 --- a/go.sum +++ b/go.sum @@ -11,8 +11,8 @@ github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= -github.com/hectorgimenez/d2go v0.0.0-20240309143442-8f9f49addc36 h1:Y34F29t/4eVcoYAJiYRO1n8CC+fCz0AqwbGa8JfBkXI= -github.com/hectorgimenez/d2go v0.0.0-20240309143442-8f9f49addc36/go.mod h1:UqWDuAc3lyiNo/zhBWa9J5ZecTYhg+3ljJoJB6vDoG8= +github.com/hectorgimenez/d2go v0.0.0-20240321125418-fec7da312157 h1:FTPMTP5eNtXACscn7dmFCKK/Sv6X5QwbhEmUR4MSEG0= +github.com/hectorgimenez/d2go v0.0.0-20240321125418-fec7da312157/go.mod h1:xAkHe0m0/fwVYvvBqmg96qMJviYcm20ARQL8NptZ3k4= github.com/inkeliz/gowebview v1.0.1 h1:4gpLE2qt4kV3DB+xHkHKUeLLiGPN5Xw3or9A3hVqYyA= github.com/inkeliz/gowebview v1.0.1/go.mod h1:4SNjXp/fogE11MwvJD67kMBmSObY2BBqinEgH8+8eM8= github.com/inkeliz/w32 v1.0.2 h1:Es8Bmw9ApOY0PVRpGs7wsqIKdK5C3xBkP5TOATfVmtU= @@ -25,8 +25,8 @@ github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= diff --git a/internal/companion_supervisor.go b/internal/companion_supervisor.go index cbd7df32e..380b7cf57 100644 --- a/internal/companion_supervisor.go +++ b/internal/companion_supervisor.go @@ -56,6 +56,7 @@ func (s *CompanionSupervisor) Start() error { gameCounter := 0 firstRun := true go func() { + s.waitUntilCharacterSelectionScreen() for { select { case <-ctx.Done(): diff --git a/internal/server/http_server.go b/internal/server/http_server.go index b5c900886..19a4cd571 100644 --- a/internal/server/http_server.go +++ b/internal/server/http_server.go @@ -10,6 +10,7 @@ import ( "io/fs" "log/slog" "net/http" + "strconv" ) type HttpServer struct { @@ -94,7 +95,7 @@ func (s *HttpServer) index(w http.ResponseWriter) { } func (s *HttpServer) config(w http.ResponseWriter, r *http.Request) { - if r.Method == "POST" { + if r.Method == http.MethodPost { err := r.ParseForm() if err != nil { configTpl.Execute(w, ConfigData{KooloCfg: config.Koolo, ErrorMessage: "Error parsing form"}) @@ -102,16 +103,30 @@ func (s *HttpServer) config(w http.ResponseWriter, r *http.Request) { } newConfig := *config.Koolo + newConfig.FirstRun = false // Disable the welcome assistant newConfig.D2RPath = r.Form.Get("d2rpath") newConfig.D2LoDPath = r.Form.Get("d2lodpath") - newConfig.FirstRun = false + // Discord + newConfig.Discord.Enabled = r.Form.Get("discord_enabled") == "true" + newConfig.Discord.Token = r.Form.Get("discord_token") + newConfig.Discord.ChannelID = r.Form.Get("discord_channel_id") + // Telegram + newConfig.Telegram.Enabled = r.Form.Get("telegram_enabled") == "true" + newConfig.Telegram.Token = r.Form.Get("telegram_token") + telegramChatId, err := strconv.ParseInt(r.Form.Get("telegram_chat_id"), 10, 64) + if err != nil { + configTpl.Execute(w, ConfigData{KooloCfg: &newConfig, ErrorMessage: "Invalid Telegram Chat ID"}) + return + } + newConfig.Telegram.ChatID = telegramChatId err = config.ValidateAndSaveConfig(newConfig) - if err == nil { - http.Redirect(w, r, "/", http.StatusSeeOther) + if err != nil { + configTpl.Execute(w, ConfigData{KooloCfg: &newConfig, ErrorMessage: err.Error()}) return } - configTpl.Execute(w, ConfigData{KooloCfg: config.Koolo, ErrorMessage: err.Error()}) + + http.Redirect(w, r, "/", http.StatusSeeOther) return } @@ -120,7 +135,7 @@ func (s *HttpServer) config(w http.ResponseWriter, r *http.Request) { func (s *HttpServer) add(w http.ResponseWriter, r *http.Request) { var err error - if r.Method == "POST" { + if r.Method == http.MethodPost { err = r.ParseForm() if err != nil { charSettingsTpl.Execute(w, CharacterSettings{ diff --git a/internal/server/templates/config.html b/internal/server/templates/config.html index 19ef8d2ac..58252f9f5 100644 --- a/internal/server/templates/config.html +++ b/internal/server/templates/config.html @@ -41,6 +41,45 @@

    Settings

    value="{{.D2LoDPath}}" /> + +

    Discord integration

    + + + +

    Telegram integration

    + + + Start
    {{ end }} + {{ if ne .SupervisorStatus "" }} + {{ end }} {{ end }} diff --git a/internal/single_supervisor.go b/internal/single_supervisor.go index aa150c514..7078539a2 100644 --- a/internal/single_supervisor.go +++ b/internal/single_supervisor.go @@ -42,6 +42,7 @@ func (s *SinglePlayerSupervisor) Start() error { firstRun := true go func() { + s.waitUntilCharacterSelectionScreen() for { select { case <-ctx.Done(): diff --git a/internal/supervisor.go b/internal/supervisor.go index 91bf09049..0fa5de086 100644 --- a/internal/supervisor.go +++ b/internal/supervisor.go @@ -84,20 +84,7 @@ func (s *baseSupervisor) ensureProcessIsRunningAndPrepare(ctx context.Context) e // TODO: refactor this go s.listener.Listen(ctx) - err := s.c.Injector.Load() - if err != nil { - return err - } - - s.c.Logger.Info("Waiting for character selection screen...") - for range 25 { - s.c.HID.Click(game.LeftButton, 100, 100) - time.Sleep(time.Second) - } - - s.c.Logger.Info("Trying to start game...") - - return nil + return s.c.Injector.Load() } func (s *baseSupervisor) logGameStart(runs []run.Run) { @@ -107,3 +94,13 @@ func (s *baseSupervisor) logGameStart(runs []run.Run) { } s.c.Logger.Info(fmt.Sprintf("Starting Game #%d. Run list: %s", s.statsHandler.Stats().TotalGames(), runNames[:len(runNames)-2])) } + +func (s *baseSupervisor) waitUntilCharacterSelectionScreen() { + s.c.Logger.Info("Waiting for character selection screen...") + for range 25 { + s.c.HID.Click(game.LeftButton, 100, 100) + time.Sleep(time.Second) + } + + s.c.Logger.Info("Creating new game...") +} From da062d9c0b8ac8a052ed5235cbc14061a04b9938 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Thu, 21 Mar 2024 22:15:19 +0900 Subject: [PATCH 022/548] label restart required on telegram/discord notifications --- internal/server/templates/config.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/server/templates/config.html b/internal/server/templates/config.html index 58252f9f5..146a34099 100644 --- a/internal/server/templates/config.html +++ b/internal/server/templates/config.html @@ -44,7 +44,7 @@

    Settings

    Discord integration

    + {{ if ne .ErrorMessage "" }} +
    +
    +
    +
    + {{ .ErrorMessage }} +
    +
    +
    +
    + {{ end }} +
    +
  • "}),h.each(t.children,function(e,t){t.idx=s,o.appendChild(c.call(this,t,o)),s++},this)):(t.idx=s,c.call(this,t),s++)},this),this.config.data&&Array.isArray(this.config.data)&&(i=!(this.data=[]),o=!1,s=0,h.each(this.config.data,function(e,t){l(t,"children")?(i=h.createElement("optgroup",{label:t.text}),o=h.createElement("ul",{class:"selectr-optgroup",role:"group",html:"
  • "+t.text+"
  • "}),h.each(t.children,function(e,t){(n=new Option(t.text,t.value,!1,t.hasOwnProperty("selected")&&!0===t.selected)).disabled=l(t,"disabled"),this.options.push(n),i.appendChild(n),n.idx=s,o.appendChild(c.call(this,n,t)),this.data[s]=t,s++},this)):((n=new Option(t.text,t.value,!1,t.hasOwnProperty("selected")&&!0===t.selected)).disabled=l(t,"disabled"),this.options.push(n),n.idx=s,c.call(this,n,t),this.data[s]=t,s++)},this)),this.setSelected(!0);for(var a=this.navIndex=0;athis.tree.lastElementChild.idx){this.navIndex=this.tree.lastElementChild.idx;break}if(this.navIndexthis.optsRect.top+this.optsRect.height&&(this.tree.scrollTop=this.tree.scrollTop+(e.top+e.height-(this.optsRect.top+this.optsRect.height))),this.navIndex===this.tree.childElementCount-1&&this.requiresPagination&&r.call(this)):0===this.navIndex?this.tree.scrollTop=0:e.top-this.optsRect.top<0&&(this.tree.scrollTop=this.tree.scrollTop+(e.top-this.optsRect.top)),i&&h.removeClass(i,"active"),h.addClass(this.items[this.navIndex],"active")}else this.navigating=!1}.bind(this),this.events.reset=this.reset.bind(this),(this.config.nativeDropdown||this.mobileDevice)&&(this.container.addEventListener("touchstart",function(e){e.changedTouches[0].target===n.el&&n.toggle()}),(this.config.nativeDropdown||this.mobileDevice)&&this.container.addEventListener("click",function(e){e.preventDefault(),e.stopPropagation(),e.target===n.el&&n.toggle()}),this.el.addEventListener("change",function(e){var t;n.el.multiple?(t=n.getSelectedProperties("idx"),t=function(e,t){for(var i,n=[],r=e.slice(0),o=0;oi?(h.addClass(this.container,"inverted"),this.isInverted=!0):(h.removeClass(this.container,"inverted"),this.isInverted=!1),this.optsRect=h.rect(this.tree)},o.prototype.getOptionByIndex=function(e){return this.options[e]},o.prototype.getOptionByValue=function(e){for(var t=!1,i=0,n=this.options.length;ithis.limit&&1s.EX?((0,p.addClassName)((i=this).frame,"busy"),i.dom.busyContent.innerText=t,setTimeout(function(){e(),(0,p.removeClassName)(i.frame,"busy"),i.dom.busyContent.innerText=""},100)):e()},t.validate=i.validate,t._renderErrors=i._renderErrors;var m=[{mode:"preview",mixin:t,data:"json"}]},6210:function(e,t,i){"use strict";i.r(t),i.d(t,{showSortModal:function(){return s}});var t=i(483),n=i.n(t),r=i(7907),o=i(9791);function s(e,t,s,i){var a=Array.isArray(t)?(0,o.getChildPaths)(t):[""],l=i&&i.path&&(0,o.contains)(a,i.path)?i.path:a[0],c=i&&i.direction||"asc",i='
    '+(0,r.Iu)("sort")+"
    "+(0,r.Iu)("sortFieldLabel")+'
    '+(0,r.Iu)("sortDirectionLabel")+'
    ';n()({parent:e,content:i,overlayClass:"jsoneditor-modal-overlay",overlayStyles:{backgroundColor:"rgb(1,1,1)",opacity:.3},modalClass:"jsoneditor-modal jsoneditor-modal-sort"}).afterCreate(function(t){var e=t.modalElem().querySelector("form"),i=t.modalElem().querySelector("#ok"),n=t.modalElem().querySelector("#field"),r=t.modalElem().querySelector("#direction");function o(e){r.value=e,r.className="jsoneditor-button-group jsoneditor-button-group-value-"+r.value}a.forEach(function(e){var t,i=document.createElement("option");i.text=""===(t=e)?"@":"."===t[0]?t.slice(1):t,i.value=e,n.appendChild(i)}),n.value=l||a[0],o(c||"asc"),r.onclick=function(e){o(e.target.getAttribute("data-value"))},i.onclick=function(e){e.preventDefault(),e.stopPropagation(),t.close(),s({path:n.value,direction:r.value})},e&&(e.onsubmit=i.onclick)}).afterClose(function(e){e.destroy()}).show()}},2558:function(e,t,i){"use strict";i.r(t),i.d(t,{showTransformModal:function(){return a}});var t=i(483),n=i.n(t),t=i(3879),x=i.n(t),r=i(7907);function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function k(e,t,i,n){return"boolean"==typeof e||e instanceof Boolean||null===e||"number"==typeof e||e instanceof Number||"string"==typeof e||e instanceof String||e instanceof Date?JSON.stringify(e):Array.isArray(e)?function(e,t,i,n){for(var r=t?i+t:void 0,o=t?"[\n":"[",s=0;sn)return o+"..."}return o+=t?"\n"+i+"]":"]"}(e,t,i,n):e&&"object"===o(e)?function(e,t,i,n){var r,o=t?i+t:void 0,s=!0,a=t?"{\n":"{";if("function"==typeof e.toJSON)return k(e.toJSON(),t,i,n);for(r in e)if(function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}(e,r)){var l=e[r];if(s?s=!1:a+=t?",\n":",",a+=t?o+'"'+r+'": ':'"'+r+'":',(a+=k(l,t,o,n)).length>n)return a+"..."}return a+=t?"\n"+i+"}":"}"}(e,t,i,n):void 0}function E(e,t){for(var i="";0JMESPath query to filter, sort, or transform the JSON data.
    To learn JMESPath, go to the interactive tutorial.';function a(e){var t=e.container,A=e.json,i=e.queryDescription,i=void 0===i?s:i,b=e.createQuery,y=e.executeQuery,w=e.onTransform,S=A,i=' + Date: Thu, 5 Sep 2024 16:55:38 +0300 Subject: [PATCH 300/548] Adjust item pickup (#469) --- internal/action/item_pickup.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/action/item_pickup.go b/internal/action/item_pickup.go index 57acd7bf7..3a2bc58b8 100644 --- a/internal/action/item_pickup.go +++ b/internal/action/item_pickup.go @@ -30,7 +30,7 @@ func ItemPickup(maxDistance int) error { i := itemsToPickup[0] for _, m := range ctx.Data.Monsters.Enemies() { - if _, dist, _ := ctx.PathFinder.GetPathFrom(i.Position, m.Position); dist < 7 { + if _, dist, _ := ctx.PathFinder.GetPathFrom(i.Position, m.Position); dist <= 3 { ctx.Logger.Debug("Monsters detected close to the item being picked up, killing them...", slog.Any("monster", m)) itemBeingPickedUp = -1 _ = ctx.Char.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { From c4bf954bd745c6d87f537238e00235d8f9e1c162 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Mon, 9 Sep 2024 22:31:04 +0900 Subject: [PATCH 301/548] add missing font files? --- .../assets/css/fonts/bootstrap-icons.woff | Bin 0 -> 176032 bytes .../assets/css/fonts/bootstrap-icons.woff2 | Bin 0 -> 130396 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 internal/server/assets/css/fonts/bootstrap-icons.woff create mode 100644 internal/server/assets/css/fonts/bootstrap-icons.woff2 diff --git a/internal/server/assets/css/fonts/bootstrap-icons.woff b/internal/server/assets/css/fonts/bootstrap-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..51204d27de92c7bb0f8bed6165b9dc888f38ff38 GIT binary patch literal 176032 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 literal 0 HcmV?d00001 diff --git a/internal/server/assets/css/fonts/bootstrap-icons.woff2 b/internal/server/assets/css/fonts/bootstrap-icons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..92c4830216044ba21db9f4294b887312e80da38e GIT binary patch literal 130396 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Ã=hYmg-7dH4?&*NqqtUL18qtx> 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 z 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 Date: Mon, 9 Sep 2024 22:50:24 +0900 Subject: [PATCH 302/548] things. --- internal/bot/bot.go | 7 +++-- internal/bot/single_supervisor.go | 24 +++----------- internal/health/health_manager.go | 4 +-- internal/pather/astar/astar.go | 27 ++++++---------- internal/pather/path_finder.go | 9 ++++++ internal/pather/utils.go | 8 ++--- .../remote/discord/discord_event_handler.go | 31 +++++++++++++++++-- 7 files changed, 61 insertions(+), 49 deletions(-) diff --git a/internal/bot/bot.go b/internal/bot/bot.go index 426c2e799..b1e28c009 100644 --- a/internal/bot/bot.go +++ b/internal/bot/bot.go @@ -70,13 +70,15 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) error { if b.ctx.ExecutionPriority == botCtx.PriorityPause { continue } - err := b.ctx.HealthManager.HandleHealthAndMana() + err = b.ctx.HealthManager.HandleHealthAndMana() if err != nil { cancel() b.Stop() return err } if time.Since(gameStartedAt).Seconds() > float64(b.ctx.CharacterCfg.MaxGameLength) { + cancel() + b.Stop() return fmt.Errorf( "max game length reached, try to exit game: %0.2f", time.Since(gameStartedAt).Seconds(), @@ -113,7 +115,7 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) error { b.ctx.AttachRoutine(botCtx.PriorityNormal) for k, r := range runs { event.Send(event.RunStarted(event.Text(b.ctx.Name, "Starting run"), r.Name())) - err := action.PreRun(firstRun) + err = action.PreRun(firstRun) if err != nil { return err } @@ -123,6 +125,7 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) error { if err != nil { return err } + err = action.PostRun(k == len(runs)-1) if err != nil { return err diff --git a/internal/bot/single_supervisor.go b/internal/bot/single_supervisor.go index 61428962b..3a1fa9ffe 100644 --- a/internal/bot/single_supervisor.go +++ b/internal/bot/single_supervisor.go @@ -83,11 +83,7 @@ func (s *SinglePlayerSupervisor) Start() error { if config.Characters[s.name].Game.RandomizeRuns { rand.Shuffle(len(runs), func(i, j int) { runs[i], runs[j] = runs[j], runs[i] }) } - if config.Koolo.Discord.EnableGameCreatedMessages { - event.Send(event.GameCreated(event.Text(s.name, "New game created"), "", "")) - } else { - event.Send(event.GameCreated(event.Text(s.name, ""), "", "")) - } + event.Send(event.GameCreated(event.Text(s.name, "New game created"), "", "")) s.bot.ctx.LastBuffAt = time.Time{} s.logGameStart(runs) @@ -99,25 +95,13 @@ func (s *SinglePlayerSupervisor) Start() error { switch { case errors.Is(err, health.ErrChicken): - if config.Koolo.Discord.EnableDiscordChickenMessages { - event.Send(event.GameFinished(event.WithScreenshot(s.name, err.Error(), s.bot.ctx.GameReader.Screenshot()), event.FinishedChicken)) - } else { - event.Send(event.GameFinished(event.Text(s.name, ""), event.FinishedChicken)) - } + event.Send(event.GameFinished(event.WithScreenshot(s.name, err.Error(), s.bot.ctx.GameReader.Screenshot()), event.FinishedChicken)) s.bot.ctx.Logger.Warn(err.Error(), slog.Float64("gameLength", time.Since(gameStart).Seconds())) case errors.Is(err, health.ErrMercChicken): - if config.Koolo.Discord.EnableDiscordChickenMessages { - event.Send(event.GameFinished(event.WithScreenshot(s.name, err.Error(), s.bot.ctx.GameReader.Screenshot()), event.FinishedMercChicken)) - } else { - event.Send(event.GameFinished(event.Text(s.name, ""), event.FinishedMercChicken)) - } + event.Send(event.GameFinished(event.WithScreenshot(s.name, err.Error(), s.bot.ctx.GameReader.Screenshot()), event.FinishedMercChicken)) s.bot.ctx.Logger.Warn(err.Error(), slog.Float64("gameLength", time.Since(gameStart).Seconds())) case errors.Is(err, health.ErrDied): - if config.Koolo.Discord.EnableDiscordChickenMessages { - event.Send(event.GameFinished(event.WithScreenshot(s.name, err.Error(), s.bot.ctx.GameReader.Screenshot()), event.FinishedDied)) - } else { - event.Send(event.GameFinished(event.Text(s.name, ""), event.FinishedDied)) - } + event.Send(event.GameFinished(event.WithScreenshot(s.name, err.Error(), s.bot.ctx.GameReader.Screenshot()), event.FinishedDied)) s.bot.ctx.Logger.Warn(err.Error(), slog.Float64("gameLength", time.Since(gameStart).Seconds())) default: event.Send(event.GameFinished(event.WithScreenshot(s.name, err.Error(), s.bot.ctx.GameReader.Screenshot()), event.FinishedError)) diff --git a/internal/health/health_manager.go b/internal/health/health_manager.go index 12e1a1675..654e28475 100644 --- a/internal/health/health_manager.go +++ b/internal/health/health_manager.go @@ -27,8 +27,8 @@ type Manager struct { lastHeal time.Time lastMana time.Time lastMercHeal time.Time - beltManager *BeltManager - data *game.Data + beltManager *BeltManager + data *game.Data } func NewHealthManager(bm *BeltManager, data *game.Data) *Manager { diff --git a/internal/pather/astar/astar.go b/internal/pather/astar/astar.go index 5193573d9..11a8029f8 100644 --- a/internal/pather/astar/astar.go +++ b/internal/pather/astar/astar.go @@ -19,7 +19,7 @@ var directions = []data.Position{ {-1, -1}, // Up-Left (Northwest) } -const obstacleRadius = 5 +const obstacleRadius = 2 type Node struct { data.Position @@ -90,33 +90,26 @@ func heuristic(p1, p2 data.Position, grid [][]bool) float64 { dy := math.Abs(float64(p1.Y - p2.Y)) baseHeuristic := math.Sqrt(dx*dx + dy*dy) - // Distance penalty, this avoids getting very close to the walls - penalty := penaltyFromObstacle(grid, p1) + penalty := 0.0 + if isNextToObstacle(grid, p1, obstacleRadius) { + penalty = float64(obstacleRadius) * 5.0 + } return baseHeuristic + penalty } -func penaltyFromObstacle(grid [][]bool, point data.Position) float64 { - minDistance := float64(obstacleRadius + 1) - - for dx := -obstacleRadius; dx <= obstacleRadius; dx++ { - for dy := -obstacleRadius; dy <= obstacleRadius; dy++ { +func isNextToObstacle(grid [][]bool, point data.Position, radius int) bool { + for dx := -radius; dx <= radius; dx++ { + for dy := -radius; dy <= radius; dy++ { newX, newY := point.X+dx, point.Y+dy if newX >= 0 && newX < len(grid[0]) && newY >= 0 && newY < len(grid) { if !grid[newY][newX] { - dist := math.Sqrt(float64(dx*dx + dy*dy)) - if dist < minDistance { - minDistance = dist - } + return true } } } } - - if minDistance <= float64(obstacleRadius) { - return float64(obstacleRadius) - minDistance - } - return 0.0 + return false } func reconstructPath(node *Node) []data.Position { diff --git a/internal/pather/path_finder.go b/internal/pather/path_finder.go index 2951a6dad..54d613b88 100644 --- a/internal/pather/path_finder.go +++ b/internal/pather/path_finder.go @@ -51,6 +51,15 @@ func (pf *PathFinder) GetPathFrom(from, to data.Position) (Path, int, bool) { from = grid.RelativePosition(from) to = grid.RelativePosition(to) + // Add objects to the collision grid as obstacles + for _, o := range pf.data.AreaData.Objects { + objectPos := grid.RelativePosition(o.Position) + if objectPos.Y < 0 || objectPos.X < 0 || len(grid.CollisionGrid) <= objectPos.Y || len(grid.CollisionGrid[0]) <= objectPos.X { + continue + } + grid.CollisionGrid[objectPos.Y][objectPos.X] = false + } + path, distance, found := astar.CalculatePath(grid, from, to) if config.Koolo.Debug.RenderMap { diff --git a/internal/pather/utils.go b/internal/pather/utils.go index d3209acd1..448883dba 100644 --- a/internal/pather/utils.go +++ b/internal/pather/utils.go @@ -32,12 +32,8 @@ func (pf *PathFinder) OptimizeRoomsTraverseOrder() []data.Room { distanceMatrix[room1] = make(map[data.Room]int) for _, room2 := range pf.data.Rooms { if room1 != room2 { - _, distance, found := pf.GetClosestWalkablePathFrom(room1.GetCenter(), room2.GetCenter()) - if found { - distanceMatrix[room1][room2] = distance - } else { - distanceMatrix[room1][room2] = math.MaxInt - } + distance := DistanceFromPoint(room1.GetCenter(), room2.GetCenter()) + distanceMatrix[room1][room2] = distance } else { distanceMatrix[room1][room2] = 0 } diff --git a/internal/remote/discord/discord_event_handler.go b/internal/remote/discord/discord_event_handler.go index ccfd4174c..14fa7355b 100644 --- a/internal/remote/discord/discord_event_handler.go +++ b/internal/remote/discord/discord_event_handler.go @@ -3,13 +3,15 @@ package discord import ( "bytes" "context" + "image/jpeg" + "github.com/bwmarrin/discordgo" + "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/event" - "image/jpeg" ) func (b *Bot) Handle(_ context.Context, e event.Event) error { - if e.Image() != nil { + if b.shouldPublish(e) { buf := new(bytes.Buffer) err := jpeg.Encode(buf, e.Image(), &jpeg.Options{Quality: 80}) if err != nil { @@ -28,3 +30,28 @@ func (b *Bot) Handle(_ context.Context, e event.Event) error { return err } + +func (b *Bot) shouldPublish(e event.Event) bool { + if e.Image() == nil { + return false + } + + switch evt := e.(type) { + case event.GameFinishedEvent: + if evt.Reason == event.FinishedChicken && !config.Koolo.Discord.EnableDiscordChickenMessages { + return false + } + if evt.Reason == event.FinishedOK && !config.Koolo.Discord.EnableRunFinishMessages { + return false + } + if evt.Reason == event.FinishedError && !config.Koolo.Discord.EnableGameCreatedMessages { + return false + } + case event.GameCreatedEvent: + if !config.Koolo.Discord.EnableGameCreatedMessages { + return false + } + } + + return true +} From a7ae4fe056e96e73b17594980ec1d9951db2b893 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Wed, 11 Sep 2024 17:49:41 +0300 Subject: [PATCH 303/548] Expand Cube Recipes (#473) --- internal/action/cube_recipes.go | 321 +++++++++++++++++++++++++++- internal/action/gambling.go | 91 ++++++++ internal/action/item.go | 45 ++++ internal/action/item_pickup.go | 2 +- internal/action/stash.go | 47 +++- internal/action/step/pickup_item.go | 4 +- internal/bot/single_supervisor.go | 9 +- internal/config/recipes.go | 3 + 8 files changed, 503 insertions(+), 19 deletions(-) diff --git a/internal/action/cube_recipes.go b/internal/action/cube_recipes.go index a2a63793c..81e0342b2 100644 --- a/internal/action/cube_recipes.go +++ b/internal/action/cube_recipes.go @@ -5,16 +5,20 @@ import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/item" + "github.com/hectorgimenez/d2go/pkg/nip" "github.com/hectorgimenez/koolo/internal/context" + "github.com/hectorgimenez/koolo/internal/utils" ) type CubeRecipe struct { - Name string - Items []string + Name string + Items []string + PurchaseRequired bool + PurchaseItems []string } var ( - recipes = []CubeRecipe{ + Recipes = []CubeRecipe{ // Perfects { @@ -181,6 +185,172 @@ var ( Name: "Upgrade Cham", Items: []string{"ChamRune", "ChamRune", "FlawlessEmerald"}, }, + + // Crafting + { + Name: "Reroll GrandCharms", + Items: []string{"GrandCharm", "Perfect", "Perfect", "Perfect"}, // Special handling in hasItemsForRecipe + }, + + // Caster Amulet + { + Name: "Caster Amulet", + Items: []string{"RalRune", "PerfectAmethyst", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"Amulet"}, + }, + + // Caster Ring + { + Name: "Caster Ring", + Items: []string{"AmnRune", "PerfectAmethyst", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"Ring"}, + }, + + // Blood Gloves + { + Name: "Blood Gloves", + Items: []string{"NefRune", "PerfectRuby", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"HeavyGloves", "SharkskinGloves", "VampireboneGloves"}, + }, + + // Blood Boots + { + Name: "Blood Boots", + Items: []string{"EthRune", "PerfectRuby", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"LightPlatedBoots", "BattleBoots", "MirroredBoots"}, + }, + + // Blood Belt + { + Name: "Blood Belt", + Items: []string{"TalRune", "PerfectRuby", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"Belt", "MeshBelt", "MithrilCoil"}, + }, + + // Blood Helm + { + Name: "Blood Helm", + Items: []string{"RalRune", "PerfectRuby", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"Helm", "Casque", "Armet"}, + }, + + // Blood Armor + { + Name: "Blood Armor", + Items: []string{"ThulRune", "PerfectRuby", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"PlateMail", "TemplarPlate", "HellforgePlate"}, + }, + + // Blood Weapon + { + Name: "Blood Weapon", + Items: []string{"OrtRune", "PerfectRuby", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"Axe"}, + }, + + // Safety Shield + { + Name: "Safety Shield", + Items: []string{"EthRune", "PerfectEmerald", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"KiteShield", "DragonShield", "Monarch"}, + }, + + // Safety Armor + { + Name: "Safety Armor", + Items: []string{"NefRune", "PerfectEmerald", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"BreastPlate", "Curiass", "GreatHauberk"}, + }, + + // Safety Boots + { + Name: "Safety Boots", + Items: []string{"OrtRune", "PerfectEmerald", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"Greaves", "WarBoots", "MyrmidonBoots"}, + }, + + // Safety Gloves + { + Name: "Safety Gloves", + Items: []string{"RalRune", "PerfectEmerald", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"Gauntlets", "WarGauntlets", "OgreGauntlets"}, + }, + + // Safety Belt + { + Name: "Safety Belt", + Items: []string{"TalRune", "PerfectEmerald", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"Sash", "DemonhideSash", "SpiderwebSash"}, + }, + + // Safety Helm + { + Name: "Safety Helm", + Items: []string{"IthRune", "PerfectEmerald", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"Crown", "GrandCrown", "Corona"}, + }, + + // Hitpower Gloves + { + Name: "Hitpower Gloves", + Items: []string{"OrtRune", "PerfectSapphire", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"ChainGloves", "HeavyBracers", "Vambraces"}, + }, + + // Hitpower Boots + { + Name: "Hitpower Boots", + Items: []string{"RalRune", "PerfectSapphire", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"ChainBoots", "MeshBoots", "Boneweave"}, + }, + + // Hitpower Belt + { + Name: "Hitpower Belt", + Items: []string{"TalRune", "PerfectSapphire", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"HeavyBelt", "BattleBelt", "TrollBelt"}, + }, + + // Hitpower Helm + { + Name: "Hitpower Helm", + Items: []string{"NefRune", "PerfectSapphire", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"FullHelm", "Basinet", "GiantConch"}, + }, + + // Hitpower Armor + { + Name: "Hitpower Armor", + Items: []string{"EthRune", "PerfectSapphire", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"FieldPlate", "Sharktooth", "KrakenShell"}, + }, + + // Hitpower Shield + { + Name: "Hitpower Shield", + Items: []string{"IthRune", "PerfectSapphire", "Jewel"}, + PurchaseRequired: true, + PurchaseItems: []string{"GothicShield", "AncientShield", "Ward"}, + }, } ) @@ -190,19 +360,42 @@ func CubeRecipes() error { // If cubing is disabled from settings just return nil if !ctx.CharacterCfg.CubeRecipes.Enabled { + ctx.Logger.Debug("Cube recipes are disabled, skipping") return nil } itemsInStash := ctx.Data.Inventory.ByLocation(item.LocationStash, item.LocationSharedStash) - for _, recipe := range recipes { + for _, recipe := range Recipes { // Check if the current recipe is Enabled if !slices.Contains(ctx.CharacterCfg.CubeRecipes.EnabledRecipes, recipe.Name) { + ctx.Logger.Debug("Cube recipe is not enabled, skipping", "recipe", recipe.Name) continue } + ctx.Logger.Debug("Cube recipe is enabled, processing", "recipe", recipe.Name) + continueProcessing := true for continueProcessing { - if items, hasItems := hasItemsForRecipe(itemsInStash, recipe); hasItems { + if items, hasItems := hasItemsForRecipe(ctx, itemsInStash, recipe); hasItems { + + // TODO: Check if we have the items in our storage and if not, purchase them, else take the item from the storage + if recipe.PurchaseRequired { + err := GambleSingleItem(recipe.PurchaseItems, item.QualityMagic) + if err != nil { + ctx.Logger.Error("Error gambling item, skipping recipe", "error", err, "recipe", recipe.Name) + break + } + + purchasedItem := getPurchasedItem(ctx, recipe.PurchaseItems) + if purchasedItem.Name == "" { + ctx.Logger.Debug("Could not find purchased item. Skipping recipe", "recipe", recipe.Name) + break + } + + // Add the purchased item the list of items to cube + items = append(items, purchasedItem) + } + // Add items to the cube and perform the transmutation err := CubeAddItems(items...) if err != nil { @@ -212,8 +405,58 @@ func CubeRecipes() error { return err } - // Add items to the stash - _ = Stash(true) + // Get a list of items that are in our invetory + itemsInInv := ctx.Data.Inventory.ByLocation(item.LocationInventory) + + stashingRequired := false + stashingGrandCharm := false + + // Check if the items that are not in the protected invetory slots should be stashed + for _, item := range itemsInInv { + // If item is not in the protected slots, check if it should be stashed + if ctx.CharacterCfg.Inventory.InventoryLock[item.Position.Y][item.Position.X] == 1 { + + shouldStash, reason, _ := shouldStashIt(item, false) + + if shouldStash { + ctx.Logger.Debug("Stashing item after cube recipe.", "item", item.Name, "recipe", recipe.Name, "reason", reason) + stashingRequired = true + } else if item.Name == "GrandCharm" { + ctx.Logger.Debug("Checking if we need to stash a GrandCharm that doesn't match any NIP rules.", "recipe", recipe.Name) + // Check if we have a GrandCharm in stash that doesn't match any NIP rules + hasUnmatchedGrandCharm := false + for _, stashItem := range itemsInStash { + if stashItem.Name == "GrandCharm" { + if _, result := ctx.CharacterCfg.Runtime.Rules.EvaluateAll(stashItem); result != nip.RuleResultFullMatch { + hasUnmatchedGrandCharm = true + break + } + } + } + if !hasUnmatchedGrandCharm { + + ctx.Logger.Debug("GrandCharm doesn't match any NIP rules and we don't have any in stash to be used for this recipe. Stashing it.", "recipe", recipe.Name) + stashingRequired = true + stashingGrandCharm = true + + } else { + DropInventoryItem(item) + utils.Sleep(500) + } + } else { + DropInventoryItem(item) + utils.Sleep(500) + } + } + } + + // Add items to the stash if needed + if stashingRequired && !stashingGrandCharm { + _ = Stash(false) + } else if stashingGrandCharm { + // Force stashing of the invetory + _ = Stash(true) + } // Remove or decrement the used items from itemsInStash itemsInStash = removeUsedItems(itemsInStash, items) @@ -226,8 +469,13 @@ func CubeRecipes() error { return nil } -func hasItemsForRecipe(items []data.Item, recipe CubeRecipe) ([]data.Item, bool) { - // Create a map of the items we need for the recipe. +func hasItemsForRecipe(ctx *context.Status, items []data.Item, recipe CubeRecipe) ([]data.Item, bool) { + + // Special handling for "Reroll GrandCharms" recipe + if recipe.Name == "Reroll GrandCharms" { + return hasItemsForGrandCharmReroll(ctx, items) + } + recipeItems := make(map[string]int) for _, item := range recipe.Items { recipeItems[item]++ @@ -235,9 +483,17 @@ func hasItemsForRecipe(items []data.Item, recipe CubeRecipe) ([]data.Item, bool) itemsForRecipe := []data.Item{} - // Iterate over the items in our stash to see if we have the items for the recipe. + // Iterate over the items in our stash to see if we have the items for the recipie. for _, item := range items { if count, ok := recipeItems[string(item.Name)]; ok { + + // Let's make sure we don't use an item we don't want to. Add more if needed (depending on the recipes we have) + if item.Name == "Jewel" { + if _, result := ctx.CharacterCfg.Runtime.Rules.EvaluateAll(item); result == nip.RuleResultFullMatch { + continue + } + } + itemsForRecipe = append(itemsForRecipe, item) // Check if we now have exactly the needed count before decrementing @@ -253,10 +509,41 @@ func hasItemsForRecipe(items []data.Item, recipe CubeRecipe) ([]data.Item, bool) } } - // We don't have all the items for the recipe. + // We don't have all the items for the recipie. + return nil, false +} + +func hasItemsForGrandCharmReroll(ctx *context.Status, items []data.Item) ([]data.Item, bool) { + var grandCharm data.Item + perfectGems := make([]data.Item, 0, 3) + + for _, itm := range items { + if itm.Name == "GrandCharm" { + if _, result := ctx.CharacterCfg.Runtime.Rules.EvaluateAll(itm); result != nip.RuleResultFullMatch && itm.Quality == item.QualityMagic { + grandCharm = itm + } + } else if isPerfectGem(itm) && len(perfectGems) < 3 { + perfectGems = append(perfectGems, itm) + } + + if grandCharm.Name != "" && len(perfectGems) == 3 { + return append([]data.Item{grandCharm}, perfectGems...), true + } + } + return nil, false } +func isPerfectGem(item data.Item) bool { + perfectGems := []string{"PerfectAmethyst", "PerfectDiamond", "PerfectEmerald", "PerfectRuby", "PerfectSapphire", "PerfectTopaz", "PerfectSkull"} + for _, gemName := range perfectGems { + if string(item.Name) == gemName { + return true + } + } + return false +} + func removeUsedItems(stash []data.Item, usedItems []data.Item) []data.Item { remainingItems := make([]data.Item, 0) usedItemMap := make(map[string]int) @@ -277,3 +564,15 @@ func removeUsedItems(stash []data.Item, usedItems []data.Item) []data.Item { return remainingItems } + +func getPurchasedItem(ctx *context.Status, purchaseItems []string) data.Item { + itemsInInv := ctx.Data.Inventory.ByLocation(item.LocationInventory) + for _, citem := range itemsInInv { + for _, pi := range purchaseItems { + if string(citem.Name) == pi && citem.Quality == item.QualityMagic { + return citem + } + } + } + return data.Item{} +} diff --git a/internal/action/gambling.go b/internal/action/gambling.go index 3b975d635..f4a6a1dee 100644 --- a/internal/action/gambling.go +++ b/internal/action/gambling.go @@ -54,6 +54,97 @@ func Gamble() error { return nil } +func GambleSingleItem(items []string, desiredQuality item.Quality) error { + ctx := context.Get() + ctx.ContextDebug.LastAction = "GambleSingleItem" + + charGold := ctx.Data.PlayerUnit.TotalPlayerGold() + var itemBought data.Item + + // Check if we have enough gold to gamble + if charGold >= 150000 { + ctx.Logger.Info("Gambling for items", slog.Any("items", items)) + + vendorNPC := town.GetTownByArea(ctx.Data.PlayerUnit.Area).GamblingNPC() + + // Fix for Anya position + if vendorNPC == npc.Drehya { + _ = MoveToCoords(data.Position{ + X: 5107, + Y: 5119, + }) + } + + InteractNPC(vendorNPC) + // Jamella gamble button is the second one + if vendorNPC == npc.Jamella { + ctx.HID.KeySequence(win.VK_HOME, win.VK_DOWN, win.VK_RETURN) + } else { + ctx.HID.KeySequence(win.VK_HOME, win.VK_DOWN, win.VK_DOWN, win.VK_RETURN) + } + + if !ctx.Data.OpenMenus.NPCShop { + return errors.New("failed opening gambling window") + } + } + + for { + if itemBought.Name != "" { + for _, itm := range ctx.Data.Inventory.ByLocation(item.LocationInventory) { + if itm.UnitID == itemBought.UnitID { + itemBought = itm + ctx.Logger.Debug("Gambled for item", slog.Any("item", itemBought)) + break + } + } + + // Check if the item matches our NIP rules + if _, result := ctx.Data.CharacterCfg.Runtime.Rules.EvaluateAll(itemBought); result == nip.RuleResultFullMatch { + // Filter not pass, selling the item + ctx.Logger.Info("Found item matching nip rules, will be kept", slog.Any("item", itemBought)) + itemBought = data.Item{} + continue + } else { + // Doesn't match NIP rules but check if the item matches our desired quality + if itemBought.Quality == desiredQuality { + ctx.Logger.Info("Found item matching desired quality, will be kept", slog.Any("item", itemBought)) + return step.CloseAllMenus() + } else { + town.SellItem(itemBought) + itemBought = data.Item{} + } + } + } + + if ctx.Data.PlayerUnit.TotalPlayerGold() < 150000 { + return errors.New("gold is below 150000, stopping gamble") + } + + // Check for any of the desired items in the vendor's inventory + for _, itmName := range items { + itm, found := ctx.Data.Inventory.Find(item.Name(itmName), item.LocationVendor) + if found { + town.BuyItem(itm, 1) + itemBought = itm + break + } + } + + // If no desired item was found, refresh the gambling window + if itemBought.Name == "" { + ctx.Logger.Debug("Desired items not found in gambling window, refreshing...", slog.Any("items", items)) + + if ctx.Data.LegacyGraphics { + ctx.HID.Click(game.LeftButton, ui.GambleRefreshButtonXClassic, ui.GambleRefreshButtonYClassic) + } else { + ctx.HID.Click(game.LeftButton, ui.GambleRefreshButtonX, ui.GambleRefreshButtonY) + } + + utils.Sleep(500) + } + } +} + func gambleItems() error { ctx := context.Get() ctx.ContextDebug.LastAction = "gambleItems" diff --git a/internal/action/item.go b/internal/action/item.go index 9ccab2118..1ec49197f 100644 --- a/internal/action/item.go +++ b/internal/action/item.go @@ -8,6 +8,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/nip" "github.com/hectorgimenez/koolo/internal/context" "github.com/hectorgimenez/koolo/internal/game" + "github.com/hectorgimenez/koolo/internal/ui" "github.com/hectorgimenez/koolo/internal/utils" ) @@ -51,3 +52,47 @@ func DropMouseItem() { utils.Sleep(1000) } } + +func DropInventoryItem(i data.Item) error { + ctx := context.Get() + ctx.ContextDebug.LastStep = "DropInventoryItem" + + closeAttempts := 0 + + // Check if any other menu is open, except the inventory + for ctx.Data.OpenMenus.IsMenuOpen() { + + // Press escape to close it + ctx.HID.PressKey(0x1B) // ESC + utils.Sleep(500) + closeAttempts++ + + if closeAttempts >= 5 { + return fmt.Errorf("failed to close open menu after 5 attempts") + } + } + + if i.Location.LocationType == item.LocationInventory { + + // Check if the inventory is open, if not open it + if !ctx.Data.OpenMenus.Inventory { + ctx.HID.PressKeyBinding(ctx.Data.KeyBindings.Inventory) + } + + // Wait a second + utils.Sleep(1000) + + screenPos := ui.GetScreenCoordsForItem(i) + ctx.HID.MovePointer(screenPos.X, screenPos.Y) + utils.Sleep(250) + ctx.HID.ClickWithModifier(game.LeftButton, screenPos.X, screenPos.Y, game.CtrlKey) + utils.Sleep(500) + + // Close the inventory if its still open, which should be at this point + if ctx.Data.OpenMenus.Inventory { + ctx.HID.PressKeyBinding(ctx.Data.KeyBindings.Inventory) + } + } + + return nil +} diff --git a/internal/action/item_pickup.go b/internal/action/item_pickup.go index 3a2bc58b8..5b1f8c9df 100644 --- a/internal/action/item_pickup.go +++ b/internal/action/item_pickup.go @@ -93,7 +93,7 @@ func GetItemsToPickup(maxDistance int) []data.Item { // Skip items that are outside pickup radius, this is useful when clearing big areas to prevent // character going back to pickup potions all the time after using them itemDistance := ctx.PathFinder.DistanceFromMe(itm.Position) - if maxDistance > 0 && itemDistance > maxDistance { + if maxDistance > 0 && itemDistance > maxDistance && itm.IsPotion() { continue } diff --git a/internal/action/stash.go b/internal/action/stash.go index b8ed83544..1fb53deed 100644 --- a/internal/action/stash.go +++ b/internal/action/stash.go @@ -3,6 +3,7 @@ package action import ( "fmt" "log/slog" + "slices" "strconv" "github.com/hectorgimenez/d2go/pkg/data" @@ -159,7 +160,8 @@ func stashInventory(firstRun bool) { break } if currentTab == 5 { - // TODO: Stop the bot, stash is full + ctx.Logger.Info("Stash is full ...") + //TODO: Stash is full stop the bot } ctx.Logger.Debug(fmt.Sprintf("Tab %d is full, switching to next one", currentTab)) currentTab++ @@ -181,6 +183,11 @@ func shouldStashIt(i data.Item, firstRun bool) (bool, string, string) { return true, "runeword", "" } + // Stash items that are part of a recipe which are not covered by the NIP rules + if shouldKeepRecipeItem(i) { + return true, "Item is part of a enabled recipe", "" + } + // Don't stash the Tomes, keys and WirtsLeg if i.Name == item.TomeOfTownPortal || i.Name == item.TomeOfIdentify || i.Name == item.Key || i.Name == "WirtsLeg" { return false, "", "" @@ -207,6 +214,44 @@ func shouldStashIt(i data.Item, firstRun bool) (bool, string, string) { return true, rule.RawLine, rule.Filename + ":" + strconv.Itoa(rule.LineNumber) } +func shouldKeepRecipeItem(i data.Item) bool { + ctx := context.Get() + ctx.ContextDebug.LastStep = "shouldKeepRecipeItem" + + // No items with quality higher than magic can be part of a recipe + if i.Quality > item.QualityMagic { + return false + } + + itemInStashNotMatchingRule := false + + // Check if we already have the item in our stash and if it doesn't match any of our pickit rules + for _, it := range ctx.Data.Inventory.ByLocation(item.LocationStash, item.LocationSharedStash) { + if it.Name == i.Name { + _, res := ctx.CharacterCfg.Runtime.Rules.EvaluateAll(it) + if res != nip.RuleResultFullMatch { + itemInStashNotMatchingRule = true + } + } + } + + recipeMatch := false + + // Check if the item is part of a recipe and if that recipe is enabled + for _, recipe := range Recipes { + if slices.Contains(recipe.Items, string(i.Name)) && slices.Contains(ctx.CharacterCfg.CubeRecipes.EnabledRecipes, recipe.Name) { + recipeMatch = true + break + } + } + + if recipeMatch && !itemInStashNotMatchingRule { + return true + } + + return false +} + func stashItemAction(i data.Item, rule string, ruleFile string, firstRun bool) bool { ctx := context.Get() ctx.ContextDebug.LastAction = "stashItemAction" diff --git a/internal/action/step/pickup_item.go b/internal/action/step/pickup_item.go index 2817c68c0..12f42e1c8 100644 --- a/internal/action/step/pickup_item.go +++ b/internal/action/step/pickup_item.go @@ -54,8 +54,8 @@ func PickupItem(it data.Item) error { } lastRun = time.Now() - objectX := it.Position.X - 1 - objectY := it.Position.Y - 1 + objectX := it.Position.X + objectY := it.Position.Y mX, mY := ui.GameCoordsToScreenCords(objectX, objectY) if it.IsHovered { diff --git a/internal/bot/single_supervisor.go b/internal/bot/single_supervisor.go index 3a1fa9ffe..5624d6859 100644 --- a/internal/bot/single_supervisor.go +++ b/internal/bot/single_supervisor.go @@ -65,11 +65,12 @@ func (s *SinglePlayerSupervisor) Start() error { // By this point, we should be in the character selection screen. if !s.bot.ctx.Manager.InGame() { - // Create the game if err = s.HandleOutOfGameFlow(); err != nil { - // Ignore loading screen errors - if err.Error() == "loading screen" { + + // Ignore loading screen errors or unhandled errors (for now) and try again + if err.Error() == "loading screen" || err.Error() == "" { + utils.Sleep(100) continue } @@ -262,7 +263,7 @@ func (s *SinglePlayerSupervisor) HandleOutOfGameFlow() error { utils.Sleep(250) return fmt.Errorf("loading screen") } else { - return fmt.Errorf("unhandled menu scenario") + return fmt.Errorf("") } // TODO: Maybe expand this with functionality to create new characters if the currently configured char isn't found? :) diff --git a/internal/config/recipes.go b/internal/config/recipes.go index d710670e8..f7f1ac818 100644 --- a/internal/config/recipes.go +++ b/internal/config/recipes.go @@ -42,4 +42,7 @@ var AvailableRecipes = []string{ "Upgrade Ber", "Upgrade Jah", "Upgrade Cham", + "Reroll GrandCharms", + "Caster Amulet", + "Caster Ring", } From 5cbde98842e12c1863df7b136aef980c534c3919 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Thu, 12 Sep 2024 20:32:45 +0300 Subject: [PATCH 304/548] Cain identify - initial implementation (#476) Initial implementation to add ability to use Cain for identification. --- internal/action/identify.go | 47 +++++++++++++++++++++++++++++++++++++ internal/action/town.go | 11 +++++++++ internal/town/A1.go | 4 ++++ internal/town/A2.go | 4 ++++ internal/town/A3.go | 4 ++++ internal/town/A4.go | 4 ++++ internal/town/A5.go | 4 ++++ internal/town/town.go | 1 + 8 files changed, 79 insertions(+) diff --git a/internal/action/identify.go b/internal/action/identify.go index 6fc9d93ff..eed07aff2 100644 --- a/internal/action/identify.go +++ b/internal/action/identify.go @@ -10,8 +10,10 @@ import ( "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/context" "github.com/hectorgimenez/koolo/internal/game" + "github.com/hectorgimenez/koolo/internal/town" "github.com/hectorgimenez/koolo/internal/ui" "github.com/hectorgimenez/koolo/internal/utils" + "github.com/lxn/win" ) func IdentifyAll(skipIdentify bool) error { @@ -51,6 +53,35 @@ func IdentifyAll(skipIdentify bool) error { return nil } +func CainIdentify() error { + ctx := context.Get() + ctx.ContextDebug.LastAction = "CainIdentify" + + stayAwhileAndListen := town.GetTownByArea(ctx.Data.PlayerUnit.Area).IdentifyNPC() + + err := InteractNPC(stayAwhileAndListen) + if err != nil { + ctx.Logger.Error("Error interacting with Cain: ", "error", err.Error()) + return err + } + + // Select the identify option + ctx.HID.KeySequence(win.VK_HOME, win.VK_DOWN, win.VK_RETURN) + if len(itemsToIdentify()) > 0 { + + // Close the NPC interact menu if it's open + if ctx.Data.OpenMenus.NPCInteract { + ctx.HID.KeySequence(win.VK_ESCAPE) + } + + return fmt.Errorf("failed to identify items") + } + + utils.Sleep(500) + + return step.CloseAllMenus() +} + func itemsToIdentify() (items []data.Item) { ctx := context.Get() ctx.ContextDebug.LastAction = "itemsToIdentify" @@ -71,6 +102,22 @@ func itemsToIdentify() (items []data.Item) { return } +func HaveItemsToStashUnidentified() bool { + ctx := context.Get() + ctx.ContextDebug.LastStep = "HaveItemsToStashUnidentified" + + items := ctx.Data.Inventory.ByLocation(item.LocationInventory) + for _, i := range items { + if !i.Identified { + if _, result := ctx.CharacterCfg.Runtime.Rules.EvaluateAll(i); result == nip.RuleResultFullMatch { + return true + } + } + } + + return false +} + func identifyItem(idTome data.Item, i data.Item) { ctx := context.Get() screenPos := ui.GetScreenCoordsForItem(idTome) diff --git a/internal/action/town.go b/internal/action/town.go index 8e3496895..ff027af93 100644 --- a/internal/action/town.go +++ b/internal/action/town.go @@ -48,7 +48,18 @@ func InRunReturnTownRoutine() error { ReturnTown() step.SetSkill(skill.Vigor) RecoverCorpse() + + /* + This will be added when option for cain Identify is added + + // Let's stash items that need to be left unidentified + if HaveItemsToStashUnidentified() { + Stash(false) + } + */ + IdentifyAll(false) + VendorRefill(false, true) Stash(false) Gamble() diff --git a/internal/town/A1.go b/internal/town/A1.go index 4520b7b9b..85d9fe6eb 100644 --- a/internal/town/A1.go +++ b/internal/town/A1.go @@ -31,6 +31,10 @@ func (a A1) RepairNPC() npc.ID { return npc.Charsi } +func (a A1) IdentifyNPC() npc.ID { + return npc.DeckardCain5 +} + func (a A1) TPWaitingArea(d game.Data) data.Position { rogueBonfire, found := d.Objects.FindOne(object.RogueBonfire) if found { diff --git a/internal/town/A2.go b/internal/town/A2.go index cb6ae5654..051f270fe 100644 --- a/internal/town/A2.go +++ b/internal/town/A2.go @@ -37,6 +37,10 @@ func (a A2) TPWaitingArea(_ game.Data) data.Position { } } +func (a A2) IdentifyNPC() npc.ID { + return npc.DeckardCain2 +} + func (a A2) TownArea() area.ID { return area.LutGholein } diff --git a/internal/town/A3.go b/internal/town/A3.go index 803686909..7973560b3 100644 --- a/internal/town/A3.go +++ b/internal/town/A3.go @@ -30,6 +30,10 @@ func (a A3) RepairNPC() npc.ID { return npc.Hratli } +func (a A3) IdentifyNPC() npc.ID { + return npc.DeckardCain3 +} + func (a A3) TPWaitingArea(_ game.Data) data.Position { return data.Position{ X: 5151, diff --git a/internal/town/A4.go b/internal/town/A4.go index f8929f3de..76b409b15 100644 --- a/internal/town/A4.go +++ b/internal/town/A4.go @@ -30,6 +30,10 @@ func (a A4) RepairNPC() npc.ID { return npc.Halbu } +func (a A4) IdentifyNPC() npc.ID { + return npc.DeckardCain4 +} + func (a A4) TPWaitingArea(_ game.Data) data.Position { return data.Position{ X: 5047, diff --git a/internal/town/A5.go b/internal/town/A5.go index 36f69b5c1..c7674afed 100644 --- a/internal/town/A5.go +++ b/internal/town/A5.go @@ -30,6 +30,10 @@ func (a A5) RepairNPC() npc.ID { return npc.Larzuk } +func (a A5) IdentifyNPC() npc.ID { + return npc.DeckardCain6 +} + func (a A5) TPWaitingArea(_ game.Data) data.Position { return data.Position{ X: 5104, diff --git a/internal/town/town.go b/internal/town/town.go index be75c1a3c..31e356923 100644 --- a/internal/town/town.go +++ b/internal/town/town.go @@ -13,6 +13,7 @@ type Town interface { RepairNPC() npc.ID MercContractorNPC() npc.ID GamblingNPC() npc.ID + IdentifyNPC() npc.ID TPWaitingArea(d game.Data) data.Position TownArea() area.ID } From 2ff081e138a4789cd93d6a0e832b9ff874f3407e Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Fri, 13 Sep 2024 08:38:42 +0300 Subject: [PATCH 305/548] Fix item pickup (#474) --- internal/action/item_pickup.go | 2 +- internal/action/step/pickup_item.go | 26 ++++++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/internal/action/item_pickup.go b/internal/action/item_pickup.go index 5b1f8c9df..fd6592d79 100644 --- a/internal/action/item_pickup.go +++ b/internal/action/item_pickup.go @@ -67,7 +67,7 @@ func ItemPickup(maxDistance int) error { if err != nil { ctx.Logger.Warn( "Failed picking up item, skipping", - err, + err.Error(), slog.String("itemName", i.Desc().Name), slog.Int("unitID", int(i.UnitID)), ) diff --git a/internal/action/step/pickup_item.go b/internal/action/step/pickup_item.go index 12f42e1c8..d6af8bc3a 100644 --- a/internal/action/step/pickup_item.go +++ b/internal/action/step/pickup_item.go @@ -25,19 +25,24 @@ func PickupItem(it data.Item) error { mouseOverAttempts := 0 currentMouseCoords := data.Position{} lastRun := time.Now() + itemToPickup := it for { // Pause the execution if the priority is not the same as the execution priority ctx.PauseIfNotPriority() + ctx.RefreshGameData() - for _, i := range ctx.Data.Inventory.AllItems { - if i.UnitID == it.UnitID { + // Reset item to empty + it = data.Item{} + + for _, i := range ctx.Data.Inventory.ByLocation(item.LocationGround) { + if i.UnitID == itemToPickup.UnitID { it = i } } - if it.Location.LocationType != item.LocationGround { - ctx.Logger.Info(fmt.Sprintf("Picked up: %s [%s]", it.Desc().Name, it.Quality.ToString())) + if it.UnitID != itemToPickup.UnitID { + ctx.Logger.Info(fmt.Sprintf("Picked up: %s [%s]", itemToPickup.Desc().Name, itemToPickup.Quality.ToString())) return nil } @@ -54,10 +59,19 @@ func PickupItem(it data.Item) error { } lastRun = time.Now() - objectX := it.Position.X - objectY := it.Position.Y + objectX := it.Position.X - 1 + objectY := it.Position.Y - 1 + mX, mY := ui.GameCoordsToScreenCords(objectX, objectY) + // Move the mouse to the coords + ctx.HID.MovePointer(mX, mY) + + // Refresh game data to update the item hover status + ctx.RefreshGameData() + mouseOverAttempts++ + time.Sleep(time.Millisecond * 100) + if it.IsHovered { ctx.HID.Click(game.LeftButton, currentMouseCoords.X, currentMouseCoords.Y) if waitingForInteraction.IsZero() { From 577d6c26bf8a6e103abc175ed264e628076006f4 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Fri, 13 Sep 2024 19:54:04 +0300 Subject: [PATCH 306/548] Buy tp/ident scrolls if below 20 (#477) --- internal/town/shop_manager.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/internal/town/shop_manager.go b/internal/town/shop_manager.go index 6b80f5577..ecee435bb 100644 --- a/internal/town/shop_manager.go +++ b/internal/town/shop_manager.go @@ -2,7 +2,6 @@ package town import ( "fmt" - "math/rand" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -96,7 +95,7 @@ func ShouldBuyTPs() bool { qty, found := portalTome.FindStat(stat.Quantity, 0) - return qty.Value <= rand.Intn(5-1)+1 || !found + return qty.Value < 20 || !found } func ShouldBuyIDs() bool { @@ -107,7 +106,7 @@ func ShouldBuyIDs() bool { qty, found := idTome.FindStat(stat.Quantity, 0) - return qty.Value <= rand.Intn(7-3)+1 || !found + return qty.Value < 20 || !found } func ShouldBuyKeys() (int, bool) { From 2223bbe53d9a0dc5fd8d1296905380bf967c0424 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Fri, 13 Sep 2024 20:37:53 +0300 Subject: [PATCH 307/548] Fix character settings tempalate (#478) --- .../templates/character_settings.gohtml | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/internal/server/templates/character_settings.gohtml b/internal/server/templates/character_settings.gohtml index f62bb904b..06e5a414e 100644 --- a/internal/server/templates/character_settings.gohtml +++ b/internal/server/templates/character_settings.gohtml @@ -25,7 +25,7 @@ {{ end }}
    -

    General Settings


    +

    General Settings


    -
    From 0e80579bd79aa31daec97b3b6420949c1d7fe749 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Tue, 17 Sep 2024 08:17:55 +0300 Subject: [PATCH 323/548] Scheduler Implementation (#483) --- cmd/koolo/main.go | 4 +- internal/bot/scheduler.go | 105 ++++++++++++++++++ internal/bot/supervisor.go | 3 +- internal/config/config.go | 19 +++- internal/server/assets/css/custom.css | 99 +++++++++++++++++ .../server/assets/js/character_settings.js | 40 ++++++- internal/server/http_server.go | 82 ++++++++++++++ internal/server/template_parameters.go | 1 + .../templates/character_settings.gohtml | 38 ++++++- 9 files changed, 385 insertions(+), 6 deletions(-) create mode 100644 internal/bot/scheduler.go diff --git a/cmd/koolo/main.go b/cmd/koolo/main.go index fb1b452e4..7a8a17789 100644 --- a/cmd/koolo/main.go +++ b/cmd/koolo/main.go @@ -52,8 +52,9 @@ func main() { winproc.SetProcessDpiAware.Call() // Set DPI awareness to be able to read the correct scale and show the window correctly eventListener := event.NewListener(logger) - //manager := koolo.NewSupervisorManager(logger, eventListener) manager := bot.NewSupervisorManager(logger, eventListener) + scheduler := bot.NewScheduler(manager, logger) + go scheduler.Start() srv, err := server.New(logger, manager) if err != nil { log.Fatalf("Error starting local server: %s", err.Error()) @@ -128,6 +129,7 @@ func main() { logger.Info("Koolo shutting down...") cancel() manager.StopAll() + scheduler.Stop() err = srv.Stop() if err != nil { logger.Error("error stopping local server", slog.Any("error", err)) diff --git a/internal/bot/scheduler.go b/internal/bot/scheduler.go new file mode 100644 index 000000000..6d906d815 --- /dev/null +++ b/internal/bot/scheduler.go @@ -0,0 +1,105 @@ +package bot + +import ( + "log/slog" + "time" + + "github.com/hectorgimenez/koolo/internal/config" +) + +type Scheduler struct { + manager *SupervisorManager + logger *slog.Logger + stop chan struct{} +} + +func NewScheduler(manager *SupervisorManager, logger *slog.Logger) *Scheduler { + return &Scheduler{ + manager: manager, + logger: logger, + stop: make(chan struct{}), + } +} + +func (s *Scheduler) Start() { + s.logger.Info("Scheduler started") + ticker := time.NewTicker(30 * time.Second) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + s.checkSchedules() + case <-s.stop: + s.logger.Info("Scheduler stopped") + return + } + } +} + +func (s *Scheduler) Stop() { + close(s.stop) +} + +func (s *Scheduler) checkSchedules() { + now := time.Now() + currentDay := int(now.Weekday()) + + for supervisorName, cfg := range config.Characters { + if !cfg.Scheduler.Enabled { + continue + } + + for _, day := range cfg.Scheduler.Days { + if day.DayOfWeek != currentDay { + continue + } + + actionTaken := false + + // Check if any time range is active + for _, timeRange := range day.TimeRanges { + start := time.Date(now.Year(), now.Month(), now.Day(), timeRange.Start.Hour(), timeRange.Start.Minute(), 0, 0, now.Location()) + end := time.Date(now.Year(), now.Month(), now.Day(), timeRange.End.Hour(), timeRange.End.Minute(), 0, 0, now.Location()) + + if now.After(start) && now.Before(end) && s.supervisorNotStarted(supervisorName) { + s.logger.Info("Starting supervisor based on schedule. Time range: "+start.Format("15:04")+" - "+end.Format("15:04"), "supervisor", supervisorName) + go s.startSupervisor(supervisorName) + actionTaken = true + break + } else if now.After(end) || now == end || now.Before(start) && !s.supervisorNotStarted(supervisorName) { + s.logger.Info("Stopping supervisor based on schedule. Time range: "+start.Format("15:04")+" - "+end.Format("15:04"), "supervisor", supervisorName) + s.stopSupervisor(supervisorName) + actionTaken = true + break + } + } + + // To prevent unnecessary checks since it can be only one day. + // Also avoid starting/stoping a supervisor in the same minute ... this is rediculous + if actionTaken { + break + } + } + } +} + +func (s *Scheduler) supervisorNotStarted(name string) bool { + stats := s.manager.GetSupervisorStats(name) + return stats.SupervisorStatus == NotStarted || stats.SupervisorStatus == Crashed || stats.SupervisorStatus == "" +} + +func (s *Scheduler) startSupervisor(name string) { + if s.supervisorNotStarted(name) { + err := s.manager.Start(name, false) + if err != nil { + s.logger.Error("Failed to start supervisor", "supervisor", name, "error", err) + } + } +} + +func (s *Scheduler) stopSupervisor(name string) { + if !s.supervisorNotStarted(name) { + s.manager.Stop(name) + } +} diff --git a/internal/bot/supervisor.go b/internal/bot/supervisor.go index 91f954a85..2c0ce1a14 100644 --- a/internal/bot/supervisor.go +++ b/internal/bot/supervisor.go @@ -79,9 +79,10 @@ func (s *baseSupervisor) Stop() { s.bot.ctx.MemoryInjector.Unload() s.bot.ctx.GameReader.Close() - if s.bot.ctx.CharacterCfg.KillD2OnStop { + if s.bot.ctx.CharacterCfg.KillD2OnStop || s.bot.ctx.CharacterCfg.Scheduler.Enabled { s.KillClient() } + s.bot.ctx.Logger.Info("Finished stopping", slog.String("configuration", s.name)) } diff --git a/internal/config/config.go b/internal/config/config.go index 97802f2af..44e7ab012 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "path/filepath" + "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -56,6 +57,21 @@ type KooloCfg struct { } } +type Day struct { + DayOfWeek int `yaml:"dayOfWeek"` + TimeRanges []TimeRange `yaml:"timeRange"` +} + +type Scheduler struct { + Enabled bool `yaml:"enabled"` + Days []Day `yaml:"days"` +} + +type TimeRange struct { + Start time.Time `yaml:"start"` + End time.Time `yaml:"end"` +} + type CharacterCfg struct { MaxGameLength int `yaml:"maxGameLength"` Username string `yaml:"username"` @@ -69,7 +85,8 @@ type CharacterCfg struct { ClassicMode bool `yaml:"classicMode"` CloseMiniPanel bool `yaml:"closeMiniPanel"` - Health struct { + Scheduler Scheduler `yaml:"scheduler"` + Health struct { HealingPotionAt int `yaml:"healingPotionAt"` ManaPotionAt int `yaml:"manaPotionAt"` RejuvPotionAtLife int `yaml:"rejuvPotionAtLife"` diff --git a/internal/server/assets/css/custom.css b/internal/server/assets/css/custom.css index 4899c9a3b..226180478 100644 --- a/internal/server/assets/css/custom.css +++ b/internal/server/assets/css/custom.css @@ -37,4 +37,103 @@ list-style: none; padding-left: 0; margin-left: 0; +} + +#scheduler-settings { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 1rem; + max-width: 1200px; + margin: 0 auto; +} + +/* Add this new rule */ +#scheduler-settings[style*="display: none"] { + display: none !important; +} + +.scheduler-day { + background-color: #1c212c; + padding: 1rem; + border-radius: 8px; + border: 1px solid #2a3140; + box-shadow: 0 4px 6px rgba(0,0,0,0.1); + transition: box-shadow 0.3s ease; +} + +.scheduler-day:hover { + box-shadow: 0 6px 8px rgba(0,0,0,0.15); +} + +.scheduler-day h4 { + margin-top: 0; + margin-bottom: 0.75rem; + color: #ffffff; + font-weight: bold; +} + +.time-range { + display: flex; + align-items: center; + margin-bottom: 0.75rem; +} + +.time-range input[type="time"] { + width: 15rem; + margin-right: 0.1rem; + padding: 0.15rem; + border: 1px solid #2a3140; + border-radius: 3px; + font-size: 0.90rem; +} + +.time-range span { + margin: 0 0.5rem; + margin-bottom: 5%; + color: #ffffff; + font-weight: bold; +} + +.remove-time-range { + background-color: #dc3545; + color: white; + border: none; + border-radius: 50%; + width: 2rem; + height: 2rem; + font-size: 1rem; + cursor: pointer; + margin-left: 0.5rem; + display: flex; + align-items: center; + justify-content: center; + transition: background-color 0.2s; +} + +.remove-time-range:hover { + background-color: #c82333; +} + +.add-time-range { + margin-top: 0.75rem; + background-color: #007bff; + color: white; + border: none; + border-radius: 4px; + padding: 0.5rem 0.75rem; + font-size: 0.95rem; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + transition: background-color 0.2s; +} + +.add-time-range:hover { + background-color: #0056b3; +} + +.add-time-range i { + margin-right: 0.5rem; } \ No newline at end of file diff --git a/internal/server/assets/js/character_settings.js b/internal/server/assets/js/character_settings.js index c237458f3..bb1a86c03 100644 --- a/internal/server/assets/js/character_settings.js +++ b/internal/server/assets/js/character_settings.js @@ -77,4 +77,42 @@ function checkLevelingProfile() { selectLevelingProfile(); } } -} \ No newline at end of file +} + +document.addEventListener('DOMContentLoaded', function() { + const schedulerEnabled = document.querySelector('input[name="schedulerEnabled"]'); + const schedulerSettings = document.getElementById('scheduler-settings'); + + function toggleSchedulerVisibility() { + schedulerSettings.style.display = schedulerEnabled.checked ? 'grid' : 'none'; + } + + // Set initial state + toggleSchedulerVisibility(); + + schedulerEnabled.addEventListener('change', toggleSchedulerVisibility); + + document.querySelectorAll('.add-time-range').forEach(button => { + button.addEventListener('click', function() { + const day = this.dataset.day; + const timeRangesDiv = this.previousElementSibling; + if (timeRangesDiv) { + const newTimeRange = document.createElement('div'); + newTimeRange.className = 'time-range'; + newTimeRange.innerHTML = ` + + to + + + `; + timeRangesDiv.appendChild(newTimeRange); + } + }); + }); + + document.addEventListener('click', function(e) { + if (e.target.closest('.remove-time-range')) { + e.target.closest('.time-range').remove(); + } + }); +}); \ No newline at end of file diff --git a/internal/server/http_server.go b/internal/server/http_server.go index dc15dc282..9bf0006aa 100644 --- a/internal/server/http_server.go +++ b/internal/server/http_server.go @@ -12,6 +12,7 @@ import ( "log/slog" "net/http" "slices" + "sort" "strconv" "strings" "syscall" @@ -582,6 +583,35 @@ func (s *HttpServer) drops(w http.ResponseWriter, r *http.Request) { }) } +func validateSchedulerData(cfg *config.CharacterCfg) error { + for day := 0; day < 7; day++ { + + cfg.Scheduler.Days[day].DayOfWeek = day + + // Sort time ranges + sort.Slice(cfg.Scheduler.Days[day].TimeRanges, func(i, j int) bool { + return cfg.Scheduler.Days[day].TimeRanges[i].Start.Before(cfg.Scheduler.Days[day].TimeRanges[j].Start) + }) + + daysOfWeek := []string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"} + + // Check for overlapping time ranges + for i := 0; i < len(cfg.Scheduler.Days[day].TimeRanges); i++ { + if !cfg.Scheduler.Days[day].TimeRanges[i].End.After(cfg.Scheduler.Days[day].TimeRanges[i].Start) { + return fmt.Errorf("end time must be after start time for day %s", daysOfWeek[day]) + } + + if i > 0 { + if !cfg.Scheduler.Days[day].TimeRanges[i].Start.After(cfg.Scheduler.Days[day].TimeRanges[i-1].End) { + return fmt.Errorf("overlapping time ranges for day %s", daysOfWeek[day]) + } + } + } + } + + return nil +} + func (s *HttpServer) config(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodPost { err := r.ParseForm() @@ -681,6 +711,55 @@ func (s *HttpServer) characterSettings(w http.ResponseWriter, r *http.Request) { cfg.AuthMethod = r.Form.Get("authmethod") cfg.AuthToken = r.Form.Get("AuthToken") + // Scheduler config + cfg.Scheduler.Enabled = r.Form.Has("schedulerEnabled") + + for day := 0; day < 7; day++ { + + starts := r.Form[fmt.Sprintf("scheduler[%d][start][]", day)] + ends := r.Form[fmt.Sprintf("scheduler[%d][end][]", day)] + + cfg.Scheduler.Days[day].DayOfWeek = day + cfg.Scheduler.Days[day].TimeRanges = make([]config.TimeRange, 0) + + for i := 0; i < len(starts); i++ { + start, err := time.Parse("15:04", starts[i]) + if err != nil { + s.templates.ExecuteTemplate(w, "character_settings.gohtml", CharacterSettings{ + ErrorMessage: fmt.Sprintf("Invalid start time format for day %d: %s", day, starts[i]), + // ... (other fields) + }) + return + } + + end, err := time.Parse("15:04", ends[i]) + if err != nil { + s.templates.ExecuteTemplate(w, "character_settings.gohtml", CharacterSettings{ + ErrorMessage: fmt.Sprintf("Invalid end time format for day %d: %s", day, ends[i]), + }) + return + } + + cfg.Scheduler.Days[day].TimeRanges = append(cfg.Scheduler.Days[day].TimeRanges, struct { + Start time.Time "yaml:\"start\"" + End time.Time "yaml:\"end\"" + }{ + Start: start, + End: end, + }) + } + } + + // Validate scheduler data + err := validateSchedulerData(cfg) + if err != nil { + s.templates.ExecuteTemplate(w, "character_settings.gohtml", CharacterSettings{ + ErrorMessage: err.Error(), + // ... (other fields) + }) + return + } + // Health config cfg.Health.HealingPotionAt, _ = strconv.Atoi(r.Form.Get("healingPotionAt")) cfg.Health.ManaPotionAt, _ = strconv.Atoi(r.Form.Get("manaPotionAt")) @@ -848,9 +927,12 @@ func (s *HttpServer) characterSettings(w http.ResponseWriter, r *http.Request) { } } + dayNames := []string{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} + s.templates.ExecuteTemplate(w, "character_settings.gohtml", CharacterSettings{ Supervisor: supervisor, Config: cfg, + DayNames: dayNames, EnabledRuns: enabledRuns, DisabledRuns: disabledRuns, AvailableTZs: availableTZs, diff --git a/internal/server/template_parameters.go b/internal/server/template_parameters.go index 800ace12e..9202b5e85 100644 --- a/internal/server/template_parameters.go +++ b/internal/server/template_parameters.go @@ -23,6 +23,7 @@ type CharacterSettings struct { ErrorMessage string Supervisor string Config *config.CharacterCfg + DayNames []string EnabledRuns []string DisabledRuns []string AvailableTZs map[int]string diff --git a/internal/server/templates/character_settings.gohtml b/internal/server/templates/character_settings.gohtml index 4d955049c..91d632007 100644 --- a/internal/server/templates/character_settings.gohtml +++ b/internal/server/templates/character_settings.gohtml @@ -4,9 +4,10 @@ - + + Koolo Settings @@ -166,7 +167,38 @@ -

    Health settings


    + +

    Scheduler


    +
    +
    + +
    + +
    + {{ range $dayIndex, $day := .Config.Scheduler.Days }} +
    +

    {{ index $.DayNames $dayIndex }}

    +
    + {{ range $timeRange := $day.TimeRanges }} +
    + + to + + +
    + {{ end }} +
    + +
    + {{ end }} +
    + +

    Health settings


    - + {{ range $id, $name := .AvailableTZs }} - + {{ end }} {{ end }} From 9dd0d18e80884cc32180301f970c3b855a8b8d21 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Wed, 25 Sep 2024 08:02:17 +0900 Subject: [PATCH 343/548] pause loop during loading screen --- internal/context/context.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/internal/context/context.go b/internal/context/context.go index 7dc2d3bb3..cb4abeb35 100644 --- a/internal/context/context.go +++ b/internal/context/context.go @@ -106,6 +106,11 @@ func (ctx *Context) SwitchPriority(priority Priority) { } func (s *Status) PauseIfNotPriority() { + // This prevents bot from trying to move when loading screen is shown. + if s.Data.OpenMenus.LoadingScreen { + time.Sleep(time.Millisecond * 5) + } + for s.Priority != s.ExecutionPriority { if s.ExecutionPriority == PriorityStop { panic("Bot is stopped") From 77476d045f908d62209e73973d643b63929a6ace Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Wed, 25 Sep 2024 08:03:33 +0900 Subject: [PATCH 344/548] prevent injecting stuff when bot is paused (should fix the pause behavior) --- internal/bot/supervisor.go | 2 +- internal/game/memory_injector.go | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/internal/bot/supervisor.go b/internal/bot/supervisor.go index 2c0ce1a14..6d0b6aa38 100644 --- a/internal/bot/supervisor.go +++ b/internal/bot/supervisor.go @@ -56,8 +56,8 @@ func (s *baseSupervisor) Stats() Stats { func (s *baseSupervisor) TogglePause() { if s.bot.ctx.ExecutionPriority == ct.PriorityPause { - s.bot.ctx.SwitchPriority(ct.PriorityNormal) s.bot.ctx.MemoryInjector.Load() + s.bot.ctx.SwitchPriority(ct.PriorityNormal) s.bot.ctx.Logger.Info("Resuming...", slog.String("configuration", s.name)) event.Send(event.GamePaused(event.Text(s.name, "Game resumed"), false)) return diff --git a/internal/game/memory_injector.go b/internal/game/memory_injector.go index 3da4faf17..366930ccb 100644 --- a/internal/game/memory_injector.go +++ b/internal/game/memory_injector.go @@ -16,6 +16,7 @@ import ( const fullAccess = windows.PROCESS_VM_OPERATION | windows.PROCESS_VM_WRITE | windows.PROCESS_VM_READ type MemoryInjector struct { + isLoaded bool pid uint32 handle windows.Handle getCursorPosAddr uintptr @@ -40,6 +41,10 @@ func InjectorInit(logger *slog.Logger, pid uint32) (*MemoryInjector, error) { } func (i *MemoryInjector) Load() error { + if i.isLoaded { + return nil + } + modules, err := memory.GetProcessModules(i.pid) if err != nil { return fmt.Errorf("error getting process modules: %w", err) @@ -80,6 +85,7 @@ func (i *MemoryInjector) Load() error { return errors.New("could not find GetCursorPos address") } + i.isLoaded = true return nil } @@ -92,15 +98,24 @@ func (i *MemoryInjector) Unload() error { } func (i *MemoryInjector) RestoreMemory() error { + if !i.isLoaded { + return nil + } + + i.isLoaded = false err := i.RestoreGetCursorPosAddr() if err != nil { - i.logger.Error("error restoring memory", err) + return fmt.Errorf("error restoring memory: %v", err) } return i.RestoreGetKeyState() } func (i *MemoryInjector) CursorPos(x, y int) error { + if !i.isLoaded { + return nil + } + /* push rax mov rax, rcx @@ -123,6 +138,10 @@ func (i *MemoryInjector) CursorPos(x, y int) error { } func (i *MemoryInjector) OverrideGetKeyState(key byte) error { + if !i.isLoaded { + return nil + } + /* cmp rcx, 0x12 mov rax, 0x8000 From 0c048168bcca81a256161aa559346086b31ba579 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Wed, 25 Sep 2024 08:31:36 +0900 Subject: [PATCH 345/548] add legacy graphics check --- internal/bot/bot.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/bot/bot.go b/internal/bot/bot.go index 82fcdf614..ef7f6a98b 100644 --- a/internal/bot/bot.go +++ b/internal/bot/bot.go @@ -110,6 +110,7 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) error { } b.ctx.SwitchPriority(botCtx.PriorityHigh) + action.SwitchToLegacyMode() action.ItemPickup(30) action.BuffIfRequired() From 2c0c70680abf345c3e6fab508e456eaf31c7ea1d Mon Sep 17 00:00:00 2001 From: TDL Date: Wed, 25 Sep 2024 20:50:09 +0200 Subject: [PATCH 346/548] Fixed diablo run (#496) --- internal/config/config.go | 1 + internal/run/diablo.go | 565 ++++++------------ internal/server/http_server.go | 1 + .../templates/run_settings_components.gohtml | 7 +- 4 files changed, 177 insertions(+), 397 deletions(-) diff --git a/internal/config/config.go b/internal/config/config.go index 44e7ab012..af4b05e55 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -164,6 +164,7 @@ type CharacterCfg struct { KillDiablo bool `yaml:"killDiablo"` FullClear bool `yaml:"fullClear"` FocusOnElitePacks bool `yaml:"focusOnElitePacks"` + SkipStormcasters bool `yaml:"skipStormcasters"` } `yaml:"diablo"` Baal struct { KillBaal bool `yaml:"killBaal"` diff --git a/internal/run/diablo.go b/internal/run/diablo.go index abca18fc2..880441a80 100644 --- a/internal/run/diablo.go +++ b/internal/run/diablo.go @@ -3,7 +3,6 @@ package run import ( "fmt" "log/slog" - "math/rand" "slices" "time" @@ -22,23 +21,18 @@ var diabloSpawnPosition = data.Position{X: 7792, Y: 5294} var chaosSanctuaryEntrancePosition = data.Position{X: 7790, Y: 5544} type Diablo struct { - ctx *context.Status - vizLayout int - seisLayout int - infLayout int - cleared []data.Position - entranceToStar []data.Position - starToVizA []data.Position - starToVizB []data.Position - starToSeisA []data.Position - starToSeisB []data.Position - starToInfA []data.Position - starToInfB []data.Position + ctx *context.Status + vizLayout int + seisLayout int + infLayout int + cleared []data.Position + paths map[string][]data.Position } func NewDiablo() *Diablo { return &Diablo{ - ctx: context.Get(), + ctx: context.Get(), + paths: make(map[string][]data.Position), } } @@ -47,22 +41,17 @@ func (d *Diablo) Name() string { } func (d *Diablo) Run() error { - err := action.WayPoint(area.RiverOfFlame) - if err != nil { + if err := action.WayPoint(area.RiverOfFlame); err != nil { return err } - action.Buff() + targetPosition := diabloSpawnPosition if d.ctx.CharacterCfg.Game.Diablo.FullClear { - err = action.MoveToCoords(chaosSanctuaryEntrancePosition) - if err != nil { - return err - } - } else { - err = action.MoveToCoords(diabloSpawnPosition) - if err != nil { - return err - } + targetPosition = chaosSanctuaryEntrancePosition + } + + if err := action.MoveToCoords(targetPosition); err != nil { + return err } d.initLayout() @@ -75,41 +64,27 @@ func (d *Diablo) Run() error { } if d.ctx.CharacterCfg.Game.Diablo.FullClear { - d.entranceToStarClear() - } - - if d.ctx.CharacterCfg.Game.Diablo.FullClear { - d.starToVizClear() - } - - err = d.killVizier() - if err != nil { - return err - } - - if d.ctx.CharacterCfg.Game.Diablo.FullClear { - d.starToSeisClear() - } - - err = d.killSeis() - if err != nil { - return err + if err := d.clearPath("entranceToStar", d.getMonsterFilter()); err != nil { + return err + } } - if d.ctx.CharacterCfg.Game.Diablo.FullClear { - d.starToInfClear() - } + for _, boss := range []string{"Vizier", "Seis", "Infector"} { + if d.ctx.CharacterCfg.Game.Diablo.FullClear { + if err := d.clearPath(fmt.Sprintf("starTo%s", boss), d.getMonsterFilter()); err != nil { + return err + } + } - err = d.killInfector() - if err != nil { - return err + if err := d.killBoss(boss); err != nil { + return err + } } if d.ctx.CharacterCfg.Game.Diablo.KillDiablo { action.Buff() action.MoveToCoords(diabloSpawnPosition) - err = d.ctx.Char.KillDiablo() - if err != nil { + if err := d.ctx.Char.KillDiablo(); err != nil { return err } } @@ -121,7 +96,6 @@ func (d *Diablo) initLayout() { d.vizLayout = d.getLayout(object.DiabloSeal4, 5275) d.seisLayout = d.getLayout(object.DiabloSeal3, 7773) d.infLayout = d.getLayout(object.DiabloSeal1, 7893) - d.ctx.Logger.Debug(fmt.Sprintf("Layouts initialized - Vizier: %d, Seis: %d, Infector: %d", d.vizLayout, d.seisLayout, d.infLayout)) } @@ -129,194 +103,116 @@ func (d *Diablo) getLayout(seal object.Name, value int) int { for _, obj := range d.ctx.Data.AreaData.Objects { if obj.Name == seal { if obj.Position.Y == value || obj.Position.X == value { - d.ctx.Logger.Debug(fmt.Sprintf("Layout 1 detected for seal %v: position matches value %d", seal, value)) return 1 } - d.ctx.Logger.Debug(fmt.Sprintf("Layout 2 detected for seal %v: position does not match value %d", seal, value)) return 2 } } - d.ctx.Logger.Error(fmt.Sprintf("Failed to find seal preset: %v", seal)) - return 1 // Default to 1 if we can't determine the layout + return 1 } func (d *Diablo) initPaths() { - d.entranceToStar = []data.Position{{X: 7794, Y: 5517}, {X: 7791, Y: 5491}, {X: 7768, Y: 5459}, {X: 7775, Y: 5424}, {X: 7817, Y: 5458}, {X: 7777, Y: 5408}, {X: 7769, Y: 5379}, {X: 7777, Y: 5357}, {X: 7809, Y: 5359}, {X: 7805, Y: 5330}, {X: 7780, Y: 5317}, {X: 7791, Y: 5293}} - d.starToVizA = []data.Position{{X: 7759, Y: 5295}, {X: 7734, Y: 5295}, {X: 7716, Y: 5295}, {X: 7718, Y: 5276}, {X: 7697, Y: 5292}, {X: 7678, Y: 5293}, {X: 7665, Y: 5276}, {X: 7662, Y: 5314}} - d.starToVizB = []data.Position{{X: 7759, Y: 5295}, {X: 7734, Y: 5295}, {X: 7716, Y: 5295}, {X: 7701, Y: 5315}, {X: 7666, Y: 5313}, {X: 7653, Y: 5284}} - d.starToSeisA = []data.Position{{X: 7781, Y: 5259}, {X: 7805, Y: 5258}, {X: 7802, Y: 5237}, {X: 7776, Y: 5228}, {X: 7775, Y: 5205}, {X: 7804, Y: 5193}, {X: 7814, Y: 5169}, {X: 7788, Y: 5153}} - d.starToSeisB = []data.Position{{X: 7781, Y: 5259}, {X: 7805, Y: 5258}, {X: 7802, Y: 5237}, {X: 7776, Y: 5228}, {X: 7811, Y: 5218}, {X: 7807, Y: 5194}, {X: 7779, Y: 5193}, {X: 7774, Y: 5160}, {X: 7803, Y: 5154}} - d.starToInfA = []data.Position{{X: 7809, Y: 5268}, {X: 7834, Y: 5306}, {X: 7852, Y: 5280}, {X: 7852, Y: 5310}, {X: 7869, Y: 5294}, {X: 7895, Y: 5295}, {X: 7919, Y: 5290}} - d.starToInfB = []data.Position{{X: 7809, Y: 5268}, {X: 7834, Y: 5306}, {X: 7852, Y: 5280}, {X: 7852, Y: 5310}, {X: 7869, Y: 5294}, {X: 7895, Y: 5274}, {X: 7927, Y: 5275}, {X: 7932, Y: 5297}, {X: 7923, Y: 5313}} + d.paths["entranceToStar"] = []data.Position{{X: 7794, Y: 5517}, {X: 7791, Y: 5491}, {X: 7768, Y: 5459}, {X: 7775, Y: 5424}, {X: 7817, Y: 5458}, {X: 7777, Y: 5408}, {X: 7769, Y: 5379}, {X: 7777, Y: 5357}, {X: 7809, Y: 5359}, {X: 7805, Y: 5330}, {X: 7780, Y: 5317}, {X: 7791, Y: 5293}} + d.paths["starToVizierA"] = []data.Position{{X: 7759, Y: 5295}, {X: 7734, Y: 5295}, {X: 7716, Y: 5295}, {X: 7718, Y: 5276}, {X: 7697, Y: 5292}, {X: 7678, Y: 5293}, {X: 7665, Y: 5276}, {X: 7662, Y: 5314}} + d.paths["starToVizierB"] = []data.Position{{X: 7759, Y: 5295}, {X: 7734, Y: 5295}, {X: 7716, Y: 5295}, {X: 7701, Y: 5315}, {X: 7666, Y: 5313}, {X: 7653, Y: 5284}} + d.paths["starToSeisA"] = []data.Position{{X: 7781, Y: 5259}, {X: 7805, Y: 5258}, {X: 7802, Y: 5237}, {X: 7776, Y: 5228}, {X: 7775, Y: 5205}, {X: 7804, Y: 5193}, {X: 7814, Y: 5169}, {X: 7788, Y: 5153}} + d.paths["starToSeisB"] = []data.Position{{X: 7781, Y: 5259}, {X: 7805, Y: 5258}, {X: 7802, Y: 5237}, {X: 7776, Y: 5228}, {X: 7811, Y: 5218}, {X: 7807, Y: 5194}, {X: 7779, Y: 5193}, {X: 7774, Y: 5160}, {X: 7803, Y: 5154}} + d.paths["starToInfectorA"] = []data.Position{{X: 7809, Y: 5268}, {X: 7834, Y: 5306}, {X: 7852, Y: 5280}, {X: 7852, Y: 5310}, {X: 7869, Y: 5294}, {X: 7895, Y: 5295}, {X: 7919, Y: 5290}} + d.paths["starToInfectorB"] = []data.Position{{X: 7809, Y: 5268}, {X: 7834, Y: 5306}, {X: 7852, Y: 5280}, {X: 7852, Y: 5310}, {X: 7869, Y: 5294}, {X: 7895, Y: 5274}, {X: 7927, Y: 5275}, {X: 7932, Y: 5297}, {X: 7923, Y: 5313}} } -func (d *Diablo) killVizier() error { - d.ctx.Logger.Debug("Moving to Vizier seal") - - err := action.MoveTo(func() (data.Position, bool) { - seal4, _ := d.ctx.Data.Objects.FindOne(object.DiabloSeal4) - return seal4.Position, true - }) - if err != nil { - return err - } - - seal4, _ := d.ctx.Data.Objects.FindOne(object.DiabloSeal4) - bestCorner := d.getLessConcurredCornerAroundSeal(seal4.Position) +func (d *Diablo) killBoss(boss string) error { + d.ctx.Logger.Debug(fmt.Sprintf("Moving to %s seal", boss)) - action.MoveToCoords(bestCorner) - action.ClearAreaAroundPlayer(20, data.MonsterAnyFilter()) - d.activateSeal(object.DiabloSeal4) + sealName := map[string]object.Name{ + "Vizier": object.DiabloSeal4, + "Seis": object.DiabloSeal3, + "Infector": object.DiabloSeal1, + }[boss] - err = action.MoveTo(func() (data.Position, bool) { - seal5, _ := d.ctx.Data.Objects.FindOne(object.DiabloSeal5) - return seal5.Position, true - }) - if err != nil { + if err := d.moveToBossArea(boss); err != nil { return err } - seal5, _ := d.ctx.Data.Objects.FindOne(object.DiabloSeal5) - bestCorner = d.getLessConcurredCornerAroundSeal(seal5.Position) + seal, _ := d.ctx.Data.Objects.FindOne(sealName) + bestCorner := d.getLessConcurredCornerAroundSeal(seal.Position) action.MoveToCoords(bestCorner) action.ClearAreaAroundPlayer(20, data.MonsterAnyFilter()) - d.activateSeal(object.DiabloSeal5) - - d.moveToVizierSpawn() - time.Sleep(500) - - err = d.killSealElite() - if err != nil { + if err := d.activateSeal(sealName); err != nil { return err } - return nil -} - -func (d *Diablo) killSeis() error { - d.ctx.Logger.Debug("Moving to Seis seal") - - err := action.MoveTo(func() (data.Position, bool) { - seal3, _ := d.ctx.Data.Objects.FindOne(object.DiabloSeal3) - return seal3.Position, true - }) - if err != nil { - return err + if boss == "Vizier" || boss == "Infector" { + secondSeal := map[string]object.Name{ + "Vizier": object.DiabloSeal5, + "Infector": object.DiabloSeal2, + }[boss] + if err := d.moveToBossArea(boss); err != nil { + return err + } + seal, _ = d.ctx.Data.Objects.FindOne(secondSeal) + bestCorner = d.getLessConcurredCornerAroundSeal(seal.Position) + action.MoveToCoords(bestCorner) + action.ClearAreaAroundPlayer(20, data.MonsterAnyFilter()) + if err := d.activateSeal(secondSeal); err != nil { + return err + } } - seal3, _ := d.ctx.Data.Objects.FindOne(object.DiabloSeal3) - bestCorner := d.getLessConcurredCornerAroundSeal(seal3.Position) - - action.MoveToCoords(bestCorner) - action.ClearAreaAroundPlayer(20, data.MonsterAnyFilter()) - d.activateSeal(object.DiabloSeal3) - - d.moveToSeisSpawn() - time.Sleep(500) - - err = d.killSealElite() - if err != nil { - return err - } + d.moveToBossSpawn(boss) + time.Sleep(1500 * time.Millisecond) - return nil + return d.killSealElite() } -func (d *Diablo) killInfector() error { - d.ctx.Logger.Debug("Moving to Infector seal") - - err := action.MoveTo(func() (data.Position, bool) { - seal1, _ := d.ctx.Data.Objects.FindOne(object.DiabloSeal1) - return seal1.Position, true - }) - if err != nil { - return err - } - - seal1, _ := d.ctx.Data.Objects.FindOne(object.DiabloSeal1) - bestCorner := d.getLessConcurredCornerAroundSeal(seal1.Position) - - action.MoveToCoords(bestCorner) - action.ClearAreaAroundPlayer(20, data.MonsterAnyFilter()) - d.activateSeal(object.DiabloSeal1) +func (d *Diablo) moveToBossArea(boss string) error { + sealName := map[string]object.Name{ + "Vizier": object.DiabloSeal4, + "Seis": object.DiabloSeal3, + "Infector": object.DiabloSeal1, + }[boss] - err = action.MoveTo(func() (data.Position, bool) { - seal2, _ := d.ctx.Data.Objects.FindOne(object.DiabloSeal2) - return seal2.Position, true + return action.MoveTo(func() (data.Position, bool) { + seal, _ := d.ctx.Data.Objects.FindOne(sealName) + return seal.Position, true }) - if err != nil { - return err - } - - seal2, _ := d.ctx.Data.Objects.FindOne(object.DiabloSeal2) - bestCorner = d.getLessConcurredCornerAroundSeal(seal2.Position) - - action.MoveToCoords(bestCorner) - action.ClearAreaAroundPlayer(20, data.MonsterAnyFilter()) - d.activateSeal(object.DiabloSeal2) - - d.moveToInfectorSpawn() - time.Sleep(500) - - err = d.killSealElite() - if err != nil { - return err - } - - return nil } -func (d *Diablo) killSealElite() error { - d.ctx.Logger.Debug("Waiting for and killing seal elite") - startTime := time.Now() +func (d *Diablo) moveToBossSpawn(boss string) { + spawnPositions := map[string]map[int]data.Position{ + "Vizier": { + 1: {X: 7664, Y: 5305}, + 2: {X: 7675, Y: 5284}, + }, + "Seis": { + 1: {X: 7795, Y: 5195}, + 2: {X: 7795, Y: 5155}, + }, + "Infector": { + 1: {X: 7894, Y: 5294}, + 2: {X: 7928, Y: 5296}, + }, + } + + layout := map[string]int{ + "Vizier": d.vizLayout, + "Seis": d.seisLayout, + "Infector": d.infLayout, + }[boss] + + spawnPos := spawnPositions[boss][layout] + d.ctx.Logger.Debug(fmt.Sprintf("Moving to X: %d, Y: %d - %sLayout %d", spawnPos.X, spawnPos.Y, boss, layout)) + action.MoveToCoords(spawnPos) - for _, m := range d.ctx.Data.Monsters.Enemies(data.MonsterEliteFilter()) { - if action.IsMonsterSealElite(m) { - d.ctx.Logger.Debug("Seal defender found!") - return nil // Exit the step chain when elite is found - } - } - - if time.Since(startTime) < time.Second*5 { - time.Sleep(100 * time.Millisecond) - } - - d.ctx.Logger.Debug("No seal elite found within 5 seconds") - - // After the wait, attempt to clear and kill - for _, m := range d.ctx.Data.Monsters.Enemies(data.MonsterEliteFilter()) { - if action.IsMonsterSealElite(m) { - // Clear normal monsters around the elite - action.ClearAreaAroundPlayer(20, func(m data.Monsters) []data.Monster { - return m.Enemies(func(m data.Monsters) []data.Monster { - return slices.DeleteFunc(m, func(monster data.Monster) bool { - return action.IsMonsterSealElite(monster) - }) - }) - }) - - // Kill the seal elite - d.ctx.Char.KillMonsterSequence(func(dat game.Data) (data.UnitID, bool) { - for _, m := range dat.Monsters.Enemies(data.MonsterEliteFilter()) { - if action.IsMonsterSealElite(m) { - _, _, found := d.ctx.PathFinder.GetPath(m.Position) - if found { - d.ctx.Logger.Debug(fmt.Sprintf("Attempting to kill seal elite: %v", m.Name)) - return m.UnitID, true - } - } - } - d.ctx.Logger.Debug("Seal elite has been killed or is not found") - return 0, false - }, nil) + for _, m := range d.ctx.Data.Monsters.Enemies() { + if dist := d.ctx.PathFinder.DistanceFromMe(m.Position); dist < 4 { + d.ctx.Logger.Debug("Monster detected close to the player, clearing small radius") + action.ClearAreaAroundPlayer(5, data.MonsterAnyFilter()) + break } } - - d.ctx.Logger.Debug("No seal elite found after waiting") - - return nil } func (d *Diablo) activateSeal(seal object.Name) error { @@ -325,216 +221,94 @@ func (d *Diablo) activateSeal(seal object.Name) error { return fmt.Errorf("seal %v not found", seal) } - // Check for the bugged seal if seal == object.DiabloSeal3 && obj.Position.X == 7773 && obj.Position.Y == 5155 { if err := action.MoveToCoords(data.Position{X: 7768, Y: 5160}); err != nil { return fmt.Errorf("failed to move to bugged seal position: %w", err) } } - // Interact with the seal (bugged or normal) - if err := action.InteractObject(obj, func() bool { + return action.InteractObject(obj, func() bool { updatedObj, found := d.ctx.Data.Objects.FindOne(seal) - if found { - if !updatedObj.Selectable { - d.ctx.Logger.Debug(fmt.Sprintf("Seal activated: %v", seal)) - } - return !updatedObj.Selectable - } - return false - }); err != nil { - return fmt.Errorf("failed to interact with seal: %w", err) - } - - return nil + return found && !updatedObj.Selectable + }) } -func (d *Diablo) moveToVizierSpawn() error { - if d.vizLayout == 1 { - d.ctx.Logger.Debug("Moving to X: 7664, Y: 5305 - vizLayout 1") - action.MoveToCoords(data.Position{X: 7664, Y: 5305}) - } else { - d.ctx.Logger.Debug("Moving to X: 7675, Y: 5284 - vizLayout 2") - action.MoveToCoords(data.Position{X: 7675, Y: 5284}) - } - - // Check for nearby monsters after moving - for _, m := range d.ctx.Data.Monsters.Enemies() { - if dist := d.ctx.PathFinder.DistanceFromMe(m.Position); dist < 4 { - d.ctx.Logger.Debug("Monster detected close to the player, clearing small radius") - action.ClearAreaAroundPlayer(5, data.MonsterAnyFilter()) - } - } - // If no nearby monsters, do nothing - return nil -} +func (d *Diablo) killSealElite() error { + d.ctx.Logger.Debug("Waiting for and killing seal elite") + startTime := time.Now() -func (d *Diablo) moveToSeisSpawn() error { - if d.seisLayout == 1 { - d.ctx.Logger.Debug("Moving to X: 7795, Y: 5195 - seisLayout 1") - action.MoveToCoords(data.Position{X: 7795, Y: 5195}) - } else { - d.ctx.Logger.Debug("Moving to X: 7795, Y: 5155 - seisLayout 2") - action.MoveToCoords(data.Position{X: 7795, Y: 5155}) - } + for time.Since(startTime) < 5*time.Second { + for _, m := range d.ctx.Data.Monsters.Enemies(data.MonsterEliteFilter()) { + if action.IsMonsterSealElite(m) { + d.ctx.Logger.Debug("Seal defender found!") + action.ClearAreaAroundPlayer(20, func(monsters data.Monsters) []data.Monster { + return slices.DeleteFunc(monsters, func(monster data.Monster) bool { + return action.IsMonsterSealElite(monster) + }) + }) - // Check for nearby monsters after moving - for _, m := range d.ctx.Data.Monsters.Enemies() { - if dist := d.ctx.PathFinder.DistanceFromMe(m.Position); dist < 4 { - d.ctx.Logger.Debug("Monster detected close to the player, clearing small radius") - action.ClearAreaAroundPlayer(5, data.MonsterAnyFilter()) + return d.ctx.Char.KillMonsterSequence(func(dat game.Data) (data.UnitID, bool) { + for _, monster := range dat.Monsters.Enemies(data.MonsterEliteFilter()) { + if action.IsMonsterSealElite(monster) { + _, _, found := d.ctx.PathFinder.GetPath(monster.Position) + if found { + d.ctx.Logger.Debug(fmt.Sprintf("Attempting to kill seal elite: %v", monster.Name)) + return monster.UnitID, true + } + } + } + d.ctx.Logger.Debug("Seal elite has been killed or is not found") + return 0, false + }, nil) + } } - } - // If no nearby monsters, do nothing - return nil -} - -func (d *Diablo) moveToInfectorSpawn() error { - if d.infLayout == 1 { - d.ctx.Logger.Debug("Moving to X: 7894, Y: 5294 - infLayout 1") - action.MoveToCoords(data.Position{X: 7894, Y: 5294}) - } else { - d.ctx.Logger.Debug("Moving to X: 7928, Y: 5296 - infLayout 2") - action.MoveToCoords(data.Position{X: 7928, Y: 5296}) + time.Sleep(100 * time.Millisecond) } - // Check for nearby monsters after moving - for _, m := range d.ctx.Data.Monsters.Enemies() { - if dist := d.ctx.PathFinder.DistanceFromMe(m.Position); dist < 4 { - d.ctx.Logger.Debug("Monster detected close to the player, clearing small radius") - action.ClearAreaAroundPlayer(5, data.MonsterAnyFilter()) - } - } - // If no nearby monsters, do nothing + d.ctx.Logger.Debug("No seal elite found within 5 seconds") return nil } -func (d *Diablo) entranceToStarClear() error { - onlyElites := d.ctx.CharacterCfg.Game.Diablo.FocusOnElitePacks - - monsterFilter := func(monsters data.Monsters) []data.Monster { - filteredMonsters := skipStormCasterFilter(monsters) - if onlyElites { - return data.MonsterEliteFilter()(filteredMonsters) - } - return filteredMonsters - } - - d.ctx.Logger.Debug("Clearing path from entrance to star") - return d.clearPath(d.entranceToStar, monsterFilter) -} - -func (d *Diablo) starToVizClear() error { - onlyElites := d.ctx.CharacterCfg.Game.Diablo.FocusOnElitePacks - - monsterFilter := func(monsters data.Monsters) []data.Monster { - filteredMonsters := skipStormCasterFilter(monsters) - if onlyElites { - return data.MonsterEliteFilter()(filteredMonsters) - } - return filteredMonsters - } - - path := d.starToVizA - if d.vizLayout == 2 { - path = d.starToVizB - } - d.ctx.Logger.Debug("Clearing path from star to Vizier") - return d.clearPath(path, monsterFilter) -} - -func (d *Diablo) starToSeisClear() error { - onlyElites := d.ctx.CharacterCfg.Game.Diablo.FocusOnElitePacks - - monsterFilter := func(monsters data.Monsters) []data.Monster { - filteredMonsters := skipStormCasterFilter(monsters) - if onlyElites { - return data.MonsterEliteFilter()(filteredMonsters) - } - return filteredMonsters - } - - path := d.starToSeisA - if d.seisLayout == 2 { - path = d.starToSeisB - } - d.ctx.Logger.Debug("Clearing path from star to Seis") - return d.clearPath(path, monsterFilter) -} - -func (d *Diablo) starToInfClear() error { - onlyElites := d.ctx.CharacterCfg.Game.Diablo.FocusOnElitePacks - - monsterFilter := func(monsters data.Monsters) []data.Monster { - filteredMonsters := skipStormCasterFilter(monsters) - if onlyElites { - return data.MonsterEliteFilter()(filteredMonsters) - } - return filteredMonsters - } +func (d *Diablo) clearPath(pathName string, monsterFilter func(data.Monsters) []data.Monster) error { + action.Buff() - path := d.starToInfA - if d.infLayout == 2 { - path = d.starToInfB + path := d.paths[pathName] + if pathName == "starToVizier" { + path = d.paths[fmt.Sprintf("starToVizier%s", string('A'+d.vizLayout-1))] + } else if pathName == "starToSeis" { + path = d.paths[fmt.Sprintf("starToSeis%s", string('A'+d.seisLayout-1))] + } else if pathName == "starToInfector" { + path = d.paths[fmt.Sprintf("starToInfector%s", string('A'+d.infLayout-1))] } - d.ctx.Logger.Debug("Clearing path from star to Infector") - return d.clearPath(path, monsterFilter) -} - -func (d *Diablo) clearPath(path []data.Position, monsterFilter func(data.Monsters) []data.Monster) error { - maxPosDiff := 20 // Keep this as a constant for now - - // Create a local random number generator - localRand := rand.New(rand.NewSource(time.Now().UnixNano())) for _, pos := range path { - if d.ctx.Data.AreaData.IsWalkable(pos) { + if d.ctx.Data.AreaData.Grid.IsWalkable(pos) { + d.ctx.Logger.Debug("Moving to coords", slog.Any("coords", pos)) action.MoveToCoords(pos) } - // Directional zigzag: alternate between diagonal, horizontal, and vertical - directions := []struct{ dx, dy int }{{1, 1}, {1, 0}, {0, 1}} - - for _, dir := range directions { - multiplier := 1 - for range 2 { - for i := 1; i < maxPosDiff; i++ { - // Random offset: add a small random variation to each point - offsetX := localRand.Intn(3) - 1 // Random offset of -1, 0, or 1 - offsetY := localRand.Intn(3) - 1 // Random offset of -1, 0, or 1 - - newPos := data.Position{ - X: pos.X + (i * multiplier * dir.dx) + offsetX, - Y: pos.Y + (i * multiplier * dir.dy) + offsetY, - } - - if d.ctx.Data.AreaData.IsWalkable(newPos) { - action.MoveToCoords(newPos) - action.ClearAreaAroundPlayer(35, monsterFilter) - } - } - multiplier *= -1 + action.ClearAreaAroundPlayer(35, func(m data.Monsters) []data.Monster { + if d.ctx.CharacterCfg.Game.Diablo.SkipStormcasters { + m = d.skipStormCasterFilter(m) } - } + return monsterFilter(m) + }) d.cleared = append(d.cleared, pos) } - d.clearStrays(monsterFilter) - - return nil + return d.clearStrays(monsterFilter) } func (d *Diablo) clearStrays(monsterFilter data.MonsterFilter) error { d.ctx.Logger.Debug("Clearing potential stray monsters") oldPos := d.ctx.Data.PlayerUnit.Position - // Apply both filters at once - monsterfilter := func(m data.Monsters) []data.Monster { - return skipStormCasterFilter(monsterFilter(m)) + monsters := monsterFilter(d.ctx.Data.Monsters) + if d.ctx.CharacterCfg.Game.Diablo.SkipStormcasters { + monsters = d.skipStormCasterFilter(monsters) } - monsters := monsterfilter(d.ctx.Data.Monsters) d.ctx.Logger.Debug(fmt.Sprintf("Stray monsters to clear after filtering: %d", len(monsters))) actionPerformed := false @@ -542,7 +316,7 @@ func (d *Diablo) clearStrays(monsterFilter data.MonsterFilter) error { for _, clearedPos := range d.cleared { if pather.DistanceFromPoint(monster.Position, clearedPos) < 30 { action.MoveToCoords(monster.Position) - action.ClearAreaAroundPlayer(15, monsterfilter) + action.ClearAreaAroundPlayer(15, monsterFilter) actionPerformed = true break } @@ -559,17 +333,11 @@ func (d *Diablo) clearStrays(monsterFilter data.MonsterFilter) error { return nil } -func skipStormCasterFilter(monsters data.Monsters) []data.Monster { - var stormCasterIds = []npc.ID{npc.StormCaster, npc.StormCaster2} - var filteredMonsters []data.Monster - - for _, m := range monsters { - if !slices.Contains(stormCasterIds, m.Name) { - filteredMonsters = append(filteredMonsters, m) - } - } - - return filteredMonsters +func (d *Diablo) skipStormCasterFilter(monsters data.Monsters) []data.Monster { + stormCasterIds := []npc.ID{npc.StormCaster, npc.StormCaster2} + return slices.DeleteFunc(monsters, func(m data.Monster) bool { + return slices.Contains(stormCasterIds, m.Name) + }) } func (d *Diablo) getLessConcurredCornerAroundSeal(sealPosition data.Position) data.Position { @@ -588,7 +356,7 @@ func (d *Diablo) getLessConcurredCornerAroundSeal(sealPosition data.Position) da distance := pather.DistanceFromPoint(c, m.Position) if distance < 5 { monstersFound++ - averageDistance += pather.DistanceFromPoint(c, m.Position) + averageDistance += distance } } if averageDistance > bestCornerDistance { @@ -604,3 +372,12 @@ func (d *Diablo) getLessConcurredCornerAroundSeal(sealPosition data.Position) da d.ctx.Logger.Debug("Moving to corner", slog.Int("corner", bestCorner), slog.Int("monsters", bestCornerDistance)) return corners[bestCorner] } + +func (d *Diablo) getMonsterFilter() func(data.Monsters) []data.Monster { + return func(monsters data.Monsters) []data.Monster { + if d.ctx.CharacterCfg.Game.Diablo.FocusOnElitePacks { + return data.MonsterEliteFilter()(monsters) + } + return monsters + } +} diff --git a/internal/server/http_server.go b/internal/server/http_server.go index 71bba3a15..927aff100 100644 --- a/internal/server/http_server.go +++ b/internal/server/http_server.go @@ -849,6 +849,7 @@ func (s *HttpServer) characterSettings(w http.ResponseWriter, r *http.Request) { cfg.Game.Diablo.FullClear = r.Form.Has("gameDiabloFullClear") cfg.Game.Diablo.KillDiablo = r.Form.Has("gameDiabloKillDiablo") cfg.Game.Diablo.FocusOnElitePacks = r.Form.Has("gameDiabloFocusOnElitePacks") + cfg.Game.Diablo.SkipStormcasters = r.Form.Has("gameDiabloSkipStormcasters") cfg.Game.Leveling.EnsurePointsAllocation = r.Form.Has("gameLevelingEnsurePointsAllocation") cfg.Game.Leveling.EnsureKeyBinding = r.Form.Has("gameLevelingEnsureKeyBinding") diff --git a/internal/server/templates/run_settings_components.gohtml b/internal/server/templates/run_settings_components.gohtml index dea7c9d13..aee682679 100644 --- a/internal/server/templates/run_settings_components.gohtml +++ b/internal/server/templates/run_settings_components.gohtml @@ -103,12 +103,13 @@ {{ end }} {{ define "diablo" }} -
    - +
    + +
    - +
    {{ end }} From f2cb5f7f2697448663b7ae5cdc1a62ee35f35fce Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Sat, 28 Sep 2024 23:40:33 +0300 Subject: [PATCH 347/548] Add Stash actions (#499) --- internal/action/horadric_cube.go | 6 +-- internal/action/stash.go | 72 ++++++++++++++++++++++++++++++-- internal/action/vendor.go | 4 +- 3 files changed, 73 insertions(+), 9 deletions(-) diff --git a/internal/action/horadric_cube.go b/internal/action/horadric_cube.go index d8ff64844..6100ae89e 100644 --- a/internal/action/horadric_cube.go +++ b/internal/action/horadric_cube.go @@ -47,9 +47,9 @@ func CubeAddItems(items ...data.Item) error { // Check in which tab the item is and switch to it switch nwIt.Location.LocationType { case item.LocationStash: - switchTab(1) + SwitchStashTab(1) case item.LocationSharedStash: - switchTab(nwIt.Location.Page + 1) + SwitchStashTab(nwIt.Location.Page + 1) } ctx.Logger.Debug("Item found on the stash, picking it up", slog.String("Item", string(nwIt.Name))) @@ -121,7 +121,7 @@ func ensureCubeIsOpen(cube data.Item) error { ctx.Logger.Debug("Opening Horadric Cube...") // Switch to the tab - switchTab(cube.Location.Page + 1) + SwitchStashTab(cube.Location.Page + 1) screenPos := ui.GetScreenCoordsForItem(cube) diff --git a/internal/action/stash.go b/internal/action/stash.go index 27cf199e0..52cc7c236 100644 --- a/internal/action/stash.go +++ b/internal/action/stash.go @@ -1,6 +1,7 @@ package action import ( + "errors" "fmt" "log/slog" "slices" @@ -17,6 +18,7 @@ import ( "github.com/hectorgimenez/koolo/internal/game" "github.com/hectorgimenez/koolo/internal/ui" "github.com/hectorgimenez/koolo/internal/utils" + "github.com/lxn/win" ) const ( @@ -116,7 +118,7 @@ func stashGold() { } if goldInStash < maxGoldPerStashTab { - switchTab(tab + 1) + SwitchStashTab(tab + 1) clickStashGoldBtn() utils.Sleep(500) } @@ -133,7 +135,7 @@ func stashInventory(firstRun bool) { if ctx.CharacterCfg.Character.StashToShared { currentTab = 2 } - switchTab(currentTab) + SwitchStashTab(currentTab) for _, i := range ctx.Data.Inventory.ByLocation(item.LocationInventory) { stashIt, matchedRule, ruleFile := shouldStashIt(i, firstRun) @@ -165,7 +167,7 @@ func stashInventory(firstRun bool) { } ctx.Logger.Debug(fmt.Sprintf("Tab %d is full, switching to next one", currentTab)) currentTab++ - switchTab(currentTab) + SwitchStashTab(currentTab) } } } @@ -298,7 +300,7 @@ func clickStashGoldBtn() { } } -func switchTab(tab int) { +func SwitchStashTab(tab int) { ctx := context.Get() ctx.ContextDebug.LastStep = "switchTab" @@ -320,3 +322,65 @@ func switchTab(tab int) { utils.Sleep(500) } } + +func OpenStash() error { + ctx := context.Get() + ctx.ContextDebug.LastAction = "OpenStash" + + bank, found := ctx.Data.Objects.FindOne(object.Bank) + if !found { + return errors.New("stash not found") + } + InteractObject(bank, + func() bool { + return ctx.Data.OpenMenus.Stash + }, + ) + + return nil +} + +func CloseStash() error { + ctx := context.Get() + ctx.ContextDebug.LastAction = "CloseStash" + + if ctx.Data.OpenMenus.Stash { + ctx.HID.PressKey(win.VK_ESCAPE) + } else { + return errors.New("stash is not open") + } + + return nil +} + +func TakeItemsFromStash(stashedItems []data.Item) error { + ctx := context.Get() + ctx.ContextDebug.LastAction = "TakeItemsFromStash" + + if ctx.Data.OpenMenus.Stash { + err := OpenStash() + if err != nil { + return err + } + } + + utils.Sleep(250) + + for _, i := range stashedItems { + + if i.Location.LocationType != item.LocationStash && i.Location.LocationType != item.LocationSharedStash { + continue + } + + // Make sure we're on the correct tab + SwitchStashTab(i.Location.Page + 1) + + // Move the item to the inventory + screenPos := ui.GetScreenCoordsForItem(i) + ctx.HID.MovePointer(screenPos.X, screenPos.Y) + ctx.HID.ClickWithModifier(game.LeftButton, screenPos.X, screenPos.Y, game.CtrlKey) + utils.Sleep(500) + } + + return nil +} diff --git a/internal/action/vendor.go b/internal/action/vendor.go index 4f5780be9..3869b4660 100644 --- a/internal/action/vendor.go +++ b/internal/action/vendor.go @@ -41,7 +41,7 @@ func VendorRefill(forceRefill, sellJunk bool) error { ctx.HID.KeySequence(win.VK_HOME, win.VK_DOWN, win.VK_RETURN) } - switchTab(4) + SwitchStashTab(4) ctx.RefreshGameData() town.BuyConsumables(forceRefill) @@ -69,7 +69,7 @@ func BuyAtVendor(vendor npc.ID, items ...VendorItemRequest) error { } for _, i := range items { - switchTab(i.Tab) + SwitchStashTab(i.Tab) itm, found := ctx.Data.Inventory.Find(i.Item, item.LocationVendor) if found { town.BuyItem(itm, i.Quantity) From 237b53862e833d596f3165fc687b740693be2774 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Sun, 29 Sep 2024 17:28:59 +0900 Subject: [PATCH 348/548] use a fake mod to store custom game settings, this will allow bot/users to keep different settings --- internal/config/game_settings.go | 46 +++++++++++++++++++++++++++----- internal/game/manager.go | 39 ++++++++++++++++++++------- 2 files changed, 70 insertions(+), 15 deletions(-) diff --git a/internal/config/game_settings.go b/internal/config/game_settings.go index 58ce8142c..5f1eda6ea 100644 --- a/internal/config/game_settings.go +++ b/internal/config/game_settings.go @@ -1,24 +1,58 @@ package config import ( + "fmt" + "os" + "github.com/lxn/win" cp "github.com/otiai10/copy" - "os" ) var userProfile = os.Getenv("USERPROFILE") -var settingsFilePath = userProfile + "\\Saved Games\\Diablo II Resurrected\\Settings.json" +var settingsPath = userProfile + "\\Saved Games\\Diablo II Resurrected" + +func ReplaceGameSettings(modName string) error { + modDirPath := settingsPath + "\\mods\\" + modName + modSettingsPath := modDirPath + "\\Settings.json" + + if _, err := os.Stat(settingsPath); os.IsNotExist(err) { + return fmt.Errorf("game settings not found at %s", settingsPath) + } + + if _, err := os.Stat(modDirPath); os.IsNotExist(err) { + err = os.Mkdir(modDirPath, os.ModePerm) + if err != nil { + return fmt.Errorf("error creating mod folder to store settings: %w", err) + } + } -func ReplaceGameSettings() error { - if _, err := os.Stat(settingsFilePath + ".bkp"); os.IsNotExist(err) { - err = os.Rename(settingsFilePath, settingsFilePath+".bkp") + if _, err := os.Stat(modSettingsPath + ".bkp"); os.IsExist(err) { + err = os.Rename(modSettingsPath, modSettingsPath+".bkp") // File does not exist, no need to back up if err != nil && !os.IsNotExist(err) { return err } } - return cp.Copy("config/Settings.json", settingsFilePath) + return cp.Copy("config/Settings.json", modSettingsPath) +} + +func InstallMod() error { + if _, err := os.Stat(Koolo.D2RPath + "\\d2r.exe"); os.IsNotExist(err) { + return fmt.Errorf("game not found at %s", Koolo.D2RPath) + } + + if _, err := os.Stat(Koolo.D2RPath + "\\mods\\koolo\\koolo.mpq\\modinfo.json"); err == nil { + return nil + } + + if err := os.MkdirAll(Koolo.D2RPath+"\\mods\\koolo\\koolo.mpq", os.ModePerm); err != nil { + return fmt.Errorf("error creating mod folder: %w", err) + } + + modFileContent := []byte(`{"name":"koolo","savepath":"koolo/"}`) + + return os.WriteFile(Koolo.D2RPath+"\\mods\\koolo\\koolo.mpq\\modinfo.json", modFileContent, 0644) } func GetCurrentDisplayScale() float64 { diff --git a/internal/game/manager.go b/internal/game/manager.go index 7584aab4d..630eea4ab 100644 --- a/internal/game/manager.go +++ b/internal/game/manager.go @@ -217,11 +217,40 @@ func StartGame(username string, password string, authmethod string, authToken st // Parse the provided additional arguments additionalArguments := strings.Fields(arguments) + // Let's use the mod directory for storing the settings, so we stop overwriting the default config + if useCustomSettings { + modName := "koolo" + found := false + for i, arg := range additionalArguments { + if arg == "-mod" { + modName = additionalArguments[i+1] + found = true + break + } + } + if !found { + additionalArguments = append(additionalArguments, "-mod", modName) + } + + // If there is no real mod, let's create a fake mod called "koolo" so we can store our own config + if modName == "koolo" { + err = config.InstallMod() + if err != nil { + return 0, 0, err + } + } + + // Replace game mod settings with the custom ones + err = config.ReplaceGameSettings(modName) + if err != nil { + return 0, 0, err + } + } + // Add them to the full argument list fullArgs := append(baseArgs, additionalArguments...) if authmethod == "TokenAuth" { - // Entropy buffer entropy := []byte{0xc8, 0x76, 0xf4, 0xae, 0x4c, 0x95, 0x2e, 0xfe, 0xf2, 0xfa, 0x0f, 0x54, 0x19, 0xc0, 0x9c, 0x43} tokenBytes := []byte(authToken) @@ -266,14 +295,6 @@ func StartGame(username string, password string, authmethod string, authToken st // Start the game cmd := exec.Command(config.Koolo.D2RPath+"\\D2R.exe", fullArgs...) - - if useCustomSettings { - err = config.ReplaceGameSettings() - if err != nil { - return 0, 0, err - } - } - err = cmd.Start() if err != nil { return 0, 0, err From 9381a21dcb4a1ae35bbab2e434901e5fe5879ae8 Mon Sep 17 00:00:00 2001 From: elb <51070858+elobo91@users.noreply.github.com> Date: Tue, 1 Oct 2024 18:50:04 -0400 Subject: [PATCH 349/548] Update gambling.go (#501) --- internal/action/gambling.go | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/internal/action/gambling.go b/internal/action/gambling.go index f4a6a1dee..1d62e0295 100644 --- a/internal/action/gambling.go +++ b/internal/action/gambling.go @@ -156,7 +156,6 @@ func gambleItems() error { if lastStep { utils.Sleep(200) ctx.Logger.Info("Finished gambling", slog.Int("currentGold", ctx.Data.PlayerUnit.TotalPlayerGold())) - return step.CloseAllMenus() } @@ -170,13 +169,14 @@ func gambleItems() error { } if _, result := ctx.Data.CharacterCfg.Runtime.Rules.EvaluateAll(itemBought); result == nip.RuleResultFullMatch { + ctx.Logger.Info("Found item matching NIP rules, keeping", slog.Any("item", itemBought)) lastStep = true - } else { // Filter not pass, selling the item + ctx.Logger.Debug("Item doesn't match NIP rules, selling", slog.Any("item", itemBought)) town.SellItem(itemBought) - itemBought = data.Item{} } + itemBought = data.Item{} // Reset itemBought after processing continue } @@ -186,7 +186,6 @@ func gambleItems() error { } for idx, itmName := range ctx.Data.CharacterCfg.Gambling.Items { - // Let's try to get one of each every time if currentIdx == len(ctx.CharacterCfg.Gambling.Items) { currentIdx = 0 } @@ -198,20 +197,23 @@ func gambleItems() error { itm, found := ctx.Data.Inventory.Find(itmName, item.LocationVendor) if !found { ctx.Logger.Debug("Item not found in gambling window, refreshing...", slog.String("item", string(itmName))) - - if ctx.Data.LegacyGraphics { - ctx.HID.Click(game.LeftButton, ui.GambleRefreshButtonXClassic, ui.GambleRefreshButtonYClassic) - } else { - ctx.HID.Click(game.LeftButton, ui.GambleRefreshButtonX, ui.GambleRefreshButtonY) - } - + RefreshGamblingWindow(ctx) utils.Sleep(500) - continue + break // Exit the inner loop to re-check inventory after refresh } town.BuyItem(itm, 1) itemBought = itm currentIdx++ + break // Exit the inner loop after buying an item } } } + +func RefreshGamblingWindow(ctx *context.Status) { + if ctx.Data.LegacyGraphics { + ctx.HID.Click(game.LeftButton, ui.GambleRefreshButtonXClassic, ui.GambleRefreshButtonYClassic) + } else { + ctx.HID.Click(game.LeftButton, ui.GambleRefreshButtonX, ui.GambleRefreshButtonY) + } +} From 71b7f962e0043d421dd05ae38610e46c8ee723db Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Wed, 2 Oct 2024 23:19:59 +0900 Subject: [PATCH 350/548] calculate inventory matrix to check for free space before picking up process --- go.mod | 2 +- go.sum | 4 +- internal/action/item_pickup.go | 84 ++++++++++++++++++++--------- internal/action/step/pickup_item.go | 6 +-- internal/bot/bot.go | 5 +- internal/bot/single_supervisor.go | 2 +- internal/context/context.go | 7 +++ 7 files changed, 76 insertions(+), 34 deletions(-) diff --git a/go.mod b/go.mod index 7450d6a0c..4dbdbafc4 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/bwmarrin/discordgo v0.28.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 github.com/gorilla/websocket v1.5.3 - github.com/hectorgimenez/d2go v0.0.0-20240914141007-8239f1bbe464 + github.com/hectorgimenez/d2go v0.0.0-20241002141317-ab7163d11146 github.com/inkeliz/gowebview v1.0.1 github.com/inkeliz/w32 v1.0.2 github.com/lxn/win v0.0.0-20210218163916-a377121e959e diff --git a/go.sum b/go.sum index 1a073b68a..36d96a2c7 100644 --- a/go.sum +++ b/go.sum @@ -15,8 +15,8 @@ github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hectorgimenez/d2go v0.0.0-20240914141007-8239f1bbe464 h1:PfqErritdb+ex9eSjCTYjAAuNnG+Mp5UbaEvGBV4g7Y= -github.com/hectorgimenez/d2go v0.0.0-20240914141007-8239f1bbe464/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= +github.com/hectorgimenez/d2go v0.0.0-20241002141317-ab7163d11146 h1:dtM/si1YHZ4GQ/p14qFeZGoDFPQxW7INkvr5bNZ5D04= +github.com/hectorgimenez/d2go v0.0.0-20241002141317-ab7163d11146/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= github.com/inkeliz/gowebview v1.0.1 h1:4gpLE2qt4kV3DB+xHkHKUeLLiGPN5Xw3or9A3hVqYyA= github.com/inkeliz/gowebview v1.0.1/go.mod h1:4SNjXp/fogE11MwvJD67kMBmSObY2BBqinEgH8+8eM8= github.com/inkeliz/w32 v1.0.2 h1:Es8Bmw9ApOY0PVRpGs7wsqIKdK5C3xBkP5TOATfVmtU= diff --git a/internal/action/item_pickup.go b/internal/action/item_pickup.go index fd6592d79..68f0c9d3a 100644 --- a/internal/action/item_pickup.go +++ b/internal/action/item_pickup.go @@ -15,24 +15,60 @@ import ( "github.com/hectorgimenez/koolo/internal/game" ) +func itemFitsInventory(i data.Item) bool { + invMatrix := context.Get().Data.Inventory.Matrix() + + for y := 0; y <= len(invMatrix)-i.Desc().InventoryHeight; y++ { + for x := 0; x <= len(invMatrix[0])-i.Desc().InventoryWidth; x++ { + freeSpace := true + for dy := 0; dy < i.Desc().InventoryHeight; dy++ { + for dx := 0; dx < i.Desc().InventoryWidth; dx++ { + if invMatrix[y+dy][x+dx] { + freeSpace = false + break + } + } + if !freeSpace { + break + } + } + + if freeSpace { + return true + } + } + } + + return false +} + func ItemPickup(maxDistance int) error { ctx := context.Get() ctx.ContextDebug.LastAction = "ItemPickup" - var itemBeingPickedUp data.UnitID - for { itemsToPickup := GetItemsToPickup(maxDistance) if len(itemsToPickup) == 0 { return nil } - i := itemsToPickup[0] + itemToPickup := data.Item{} + for _, i := range itemsToPickup { + if itemFitsInventory(i) { + itemToPickup = i + break + } + } + + if itemToPickup.UnitID == 0 { + ctx.Logger.Debug("Inventory is full, returning to town to sell junk and stash items") + InRunReturnTownRoutine() + continue + } for _, m := range ctx.Data.Monsters.Enemies() { - if _, dist, _ := ctx.PathFinder.GetPathFrom(i.Position, m.Position); dist <= 3 { + if _, dist, _ := ctx.PathFinder.GetPathFrom(itemToPickup.Position, m.Position); dist <= 3 { ctx.Logger.Debug("Monsters detected close to the item being picked up, killing them...", slog.Any("monster", m)) - itemBeingPickedUp = -1 _ = ctx.Char.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { return m.UnitID, true }, nil) @@ -40,36 +76,27 @@ func ItemPickup(maxDistance int) error { } } - // Error picking up Item, go back to town, sell junk, stash and try again. - if itemBeingPickedUp == i.UnitID { - ctx.Logger.Debug("Item could not be picked up, going back to town to sell junk and stash") - itemBeingPickedUp = -1 - InRunReturnTownRoutine() - continue - } - ctx.Logger.Debug(fmt.Sprintf( "Item Detected: %s [%d] at X:%d Y:%d", - i.Name, - i.Quality, - i.Position.X, - i.Position.Y, + itemToPickup.Name, + itemToPickup.Quality, + itemToPickup.Position.X, + itemToPickup.Position.Y, )) - itemBeingPickedUp = i.UnitID - err := MoveToCoords(i.Position) + err := MoveToCoords(itemToPickup.Position) if err != nil { ctx.Logger.Warn("Failed moving closer to item, trying to pickup it anyway", err) } - // TODO Handle proper error & multiple items and blacklist - err = step.PickupItem(i) + err = step.PickupItem(itemToPickup) if err != nil { + ctx.CurrentGame.BlacklistedItems = append(ctx.CurrentGame.BlacklistedItems, itemToPickup) ctx.Logger.Warn( - "Failed picking up item, skipping", + "Failed picking up item, blacklisting it", err.Error(), - slog.String("itemName", i.Desc().Name), - slog.Int("unitID", int(i.UnitID)), + slog.String("itemName", itemToPickup.Desc().Name), + slog.Int("unitID", int(itemToPickup.UnitID)), ) } } @@ -123,6 +150,15 @@ func GetItemsToPickup(maxDistance int) []data.Item { } } + // Remove blacklisted items from the list, we don't want to pick them up + for i, itm := range itemsToPickup { + for _, k := range ctx.CurrentGame.BlacklistedItems { + if itm.UnitID == k.UnitID { + itemsToPickup = append(itemsToPickup[:i], itemsToPickup[i+1:]...) + } + } + } + return itemsToPickup } diff --git a/internal/action/step/pickup_item.go b/internal/action/step/pickup_item.go index d6af8bc3a..85749cb88 100644 --- a/internal/action/step/pickup_item.go +++ b/internal/action/step/pickup_item.go @@ -47,7 +47,7 @@ func PickupItem(it data.Item) error { } if mouseOverAttempts > maxInteractions || !waitingForInteraction.IsZero() && time.Since(waitingForInteraction) > time.Second*3 { - return fmt.Errorf("item %s [%s] could not be picked up", it.Desc().Name, it.Quality.ToString()) + return fmt.Errorf("item %s [%s] could not be picked up: mouseover attempts limit reached", it.Desc().Name, it.Quality.ToString()) } if time.Since(lastRun) < utils.RandomDurationMs(120, 320) { @@ -68,9 +68,9 @@ func PickupItem(it data.Item) error { ctx.HID.MovePointer(mX, mY) // Refresh game data to update the item hover status - ctx.RefreshGameData() mouseOverAttempts++ time.Sleep(time.Millisecond * 100) + ctx.RefreshGameData() if it.IsHovered { ctx.HID.Click(game.LeftButton, currentMouseCoords.X, currentMouseCoords.Y) @@ -88,7 +88,7 @@ func PickupItem(it data.Item) error { distance := ctx.PathFinder.DistanceFromMe(it.Position) if distance > 10 { ctx.Logger.Info("item is too far away", slog.String("item", it.Desc().Name)) - return fmt.Errorf("item is too far away: %s", it.Desc().Name) + return fmt.Errorf("item is too far away (%d): %s", distance, it.Desc().Name) } x, y := utils.Spiral(mouseOverAttempts) diff --git a/internal/bot/bot.go b/internal/bot/bot.go index ef7f6a98b..ae0497273 100644 --- a/internal/bot/bot.go +++ b/internal/bot/bot.go @@ -29,7 +29,8 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) error { g, ctx := errgroup.WithContext(ctx) gameStartedAt := time.Now() - b.ctx.SwitchPriority(botCtx.PriorityNormal) // Restore priority to normal, in case it was stopped in previous game + b.ctx.SwitchPriority(botCtx.PriorityNormal) // Restore priority to normal, in case it was stopped in previous game + b.ctx.CurrentGame = &botCtx.CurrentGameHelper{} // Reset current game helper structure // Let's make sure we have updated game data before we start the runs err := b.ctx.GameReader.FetchMapData() @@ -37,8 +38,6 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) error { return err } - b.ctx.RefreshGameData() - // This routine is in charge of refreshing the game data and handling cancellation, will work in parallel with any other execution g.Go(func() error { b.ctx.AttachRoutine(botCtx.PriorityBackground) diff --git a/internal/bot/single_supervisor.go b/internal/bot/single_supervisor.go index c5d43d501..e4fd99bde 100644 --- a/internal/bot/single_supervisor.go +++ b/internal/bot/single_supervisor.go @@ -109,6 +109,7 @@ func (s *SinglePlayerSupervisor) Start() error { } err = s.bot.Run(ctx, firstRun, runs) + firstRun = false if err != nil { if errors.Is(ctx.Err(), context.Canceled) { continue @@ -140,7 +141,6 @@ func (s *SinglePlayerSupervisor) Start() error { return errors.New(errMsg) } - firstRun = false } } } diff --git a/internal/context/context.go b/internal/context/context.go index cb4abeb35..cd356537e 100644 --- a/internal/context/context.go +++ b/internal/context/context.go @@ -8,6 +8,7 @@ import ( "sync" "time" + "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/event" "github.com/hectorgimenez/koolo/internal/game" @@ -50,6 +51,7 @@ type Context struct { Char Character LastBuffAt time.Time ContextDebug *Debug + CurrentGame *CurrentGameHelper } type Debug struct { @@ -57,12 +59,17 @@ type Debug struct { LastStep string } +type CurrentGameHelper struct { + BlacklistedItems []data.Item +} + func NewContext(name string) *Status { ctx := &Context{ Name: name, Data: &game.Data{}, ExecutionPriority: PriorityNormal, ContextDebug: &Debug{}, + CurrentGame: &CurrentGameHelper{}, } botContexts[getGoroutineID()] = &Status{Priority: PriorityNormal, Context: ctx} From 65918f014097e20cf2f14f0469f94bf4476d93cc Mon Sep 17 00:00:00 2001 From: elb <51070858+elobo91@users.noreply.github.com> Date: Thu, 3 Oct 2024 19:28:54 -0400 Subject: [PATCH 351/548] Berserk_barb arrives to v2 (travincal barb for now) (#506) --- internal/action/step/attack.go | 10 + internal/action/tp_actions.go | 38 ++- internal/bot/bot.go | 20 +- internal/character/berserk_barb.go | 452 +++++++++++++++++------------ internal/character/character.go | 2 +- internal/context/context.go | 8 + internal/run/travincal.go | 8 +- 7 files changed, 345 insertions(+), 193 deletions(-) diff --git a/internal/action/step/attack.go b/internal/action/step/attack.go index 43bb4b877..0f3ce11f7 100644 --- a/internal/action/step/attack.go +++ b/internal/action/step/attack.go @@ -48,6 +48,16 @@ func Telestomp() AttackOption { } func PrimaryAttack(target data.UnitID, numOfAttacks int, standStill bool, opts ...AttackOption) error { + ctx := context.Get() + + // Special case for Berserker + if berserker, ok := ctx.Char.(interface{ PerformBerserkAttack(data.UnitID) }); ok { + for i := 0; i < numOfAttacks; i++ { + berserker.PerformBerserkAttack(target) + } + return nil + } + settings := attackSettings{ target: target, numOfAttacks: numOfAttacks, diff --git a/internal/action/tp_actions.go b/internal/action/tp_actions.go index 8b7a8e5ca..bfab61a25 100644 --- a/internal/action/tp_actions.go +++ b/internal/action/tp_actions.go @@ -2,7 +2,7 @@ package action import ( "errors" - + "fmt" "github.com/hectorgimenez/d2go/pkg/data/object" "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/context" @@ -36,7 +36,29 @@ func UsePortalInTown() error { tpArea := town.GetTownByArea(ctx.Data.PlayerUnit.Area).TPWaitingArea(*ctx.Data) _ = MoveToCoords(tpArea) - return UsePortalFrom(ctx.Data.PlayerUnit.Name) + err := UsePortalFrom(ctx.Data.PlayerUnit.Name) + if err != nil { + return err + } + + // Wait for the game to fully load after using the portal + ctx.WaitForGameToLoad() + + // Refresh game data to ensure we have the latest information + ctx.RefreshGameData() + + // Ensure we're not in town + if ctx.Data.PlayerUnit.Area.IsTown() { + return fmt.Errorf("failed to leave town area") + } + + // Perform item pickup after re-entering the portal + err = ItemPickup(40) + if err != nil { + ctx.Logger.Warn("Error during item pickup after portal use", "error", err) + } + + return nil } func UsePortalFrom(owner string) error { @@ -49,16 +71,22 @@ func UsePortalFrom(owner string) error { for _, obj := range ctx.Data.Objects { if obj.IsPortal() && obj.Owner == owner { - return InteractObjectByID(obj.ID, func() bool { + err := InteractObjectByID(obj.ID, func() bool { if !ctx.Data.PlayerUnit.Area.IsTown() { utils.Sleep(500) return true } - return false }) + + if err == nil { + // Perform actions after re-entering the game area + + } + + return err } } - return nil + return errors.New("portal not found") } diff --git a/internal/bot/bot.go b/internal/bot/bot.go index ae0497273..eceb5cb62 100644 --- a/internal/bot/bot.go +++ b/internal/bot/bot.go @@ -3,6 +3,7 @@ package bot import ( "context" "fmt" + "github.com/hectorgimenez/koolo/internal/character" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -38,6 +39,14 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) error { return err } + + b.ctx.WaitForGameToLoad() + + // Switch to legacy mode if configured + action.SwitchToLegacyMode() + b.ctx.RefreshGameData() + + // This routine is in charge of refreshing the game data and handling cancellation, will work in parallel with any other execution g.Go(func() error { b.ctx.AttachRoutine(botCtx.PriorityBackground) @@ -108,9 +117,16 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) error { continue } + if b.ctx.CharacterCfg.ClassicMode && !b.ctx.Data.LegacyGraphics { + action.SwitchToLegacyMode() + b.ctx.RefreshGameData() + } + b.ctx.SwitchPriority(botCtx.PriorityHigh) - action.SwitchToLegacyMode() - action.ItemPickup(30) + // Check if Berserker is currently killing council + if berserker, ok := b.ctx.Char.(*character.Berserker); !ok || !berserker.IsKillingCouncil() { + action.ItemPickup(30) + } action.BuffIfRequired() _, healingPotsFound := b.ctx.Data.Inventory.Belt.GetFirstPotion(data.HealingPotion) diff --git a/internal/character/berserk_barb.go b/internal/character/berserk_barb.go index eadde11bf..c9dc3ed02 100644 --- a/internal/character/berserk_barb.go +++ b/internal/character/berserk_barb.go @@ -1,9 +1,12 @@ package character import ( - "fmt" + "errors" + "github.com/hectorgimenez/d2go/pkg/data/area" + "github.com/hectorgimenez/koolo/internal/action" "log/slog" "sort" + "sync/atomic" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -12,17 +15,25 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/d2go/pkg/data/state" "github.com/hectorgimenez/koolo/internal/action/step" + "github.com/hectorgimenez/koolo/internal/context" "github.com/hectorgimenez/koolo/internal/game" - "github.com/hectorgimenez/koolo/internal/utils" ) type Berserker struct { BaseCharacter - *game.HID + isKillingCouncil atomic.Bool } -func (s Berserker) CheckKeyBindings() []skill.ID { - requireKeybindings := []skill.ID{skill.BattleCommand, skill.BattleOrders, skill.Shout, skill.FindItem, skill.TomeOfTownPortal} +const ( + maxHorkRange = 40 + meleeRange = 5 + maxAttackAttempts = 20 +) + +var ErrNotInTravincal = errors.New("not in Travincal") + +func (s *Berserker) CheckKeyBindings() []skill.ID { + requireKeybindings := []skill.ID{skill.BattleCommand, skill.BattleOrders, skill.Shout, skill.FindItem, skill.Berserk} missingKeybindings := []skill.ID{} for _, cskill := range requireKeybindings { @@ -38,250 +49,226 @@ func (s Berserker) CheckKeyBindings() []skill.ID { return missingKeybindings } -func (s Berserker) KillMonsterSequence( +func (s *Berserker) IsKillingCouncil() bool { + return s.isKillingCouncil.Load() +} + +func (s *Berserker) KillMonsterSequence( monsterSelector func(d game.Data) (data.UnitID, bool), skipOnImmunities []stat.Resist, ) error { - completedAttackLoops := 0 - previousUnitID := 0 - findItemAttempts := 0 - const maxFindItemAttempts = 1 - const maxRange = 15 - const berserkerMaxAttacksLoop = 5 // Adjust this value as needed - for { + for attackAttempts := 0; attackAttempts < maxAttackAttempts; attackAttempts++ { id, found := monsterSelector(*s.data) if !found { - // Find Item logic - if findItemAttempts < maxFindItemAttempts { - foundCorpse := s.FindItemOnNearbyCorpses(*s.data, maxRange, time.Millisecond*100) - if foundCorpse { - findItemAttempts++ - utils.Sleep(1000) - } else { - findItemAttempts = maxFindItemAttempts - } - } - - if findItemAttempts >= maxFindItemAttempts { - return nil + if !s.isKillingCouncil.Load() { + s.FindItemOnNearbyCorpses(maxHorkRange) } - continue - } - - if previousUnitID != int(id) { - completedAttackLoops = 0 + return nil } if !s.preBattleChecks(id, skipOnImmunities) { return nil } - if completedAttackLoops >= berserkerMaxAttacksLoop { - return nil + monster, monsterFound := s.data.Monsters.FindByID(id) + if !monsterFound || monster.Stats[stat.Life] <= 0 { + continue } - monster, found := s.data.Monsters.FindByID(id) - if !found { - s.logger.Info("Monster not found", slog.String("monster", fmt.Sprintf("%v", monster))) - return nil + distance := s.pf.DistanceFromMe(monster.Position) + if distance > meleeRange { + err := step.MoveTo(monster.Position) + if err != nil { + s.logger.Warn("Failed to move to monster", slog.String("error", err.Error())) + continue + } } - step.MoveTo(monster.Position) - step.PrimaryAttack(id, 1, false, step.Distance(1, maxRange)) - - completedAttackLoops++ - previousUnitID = int(id) + s.PerformBerserkAttack(monster.UnitID) + time.Sleep(50 * time.Millisecond) } + + return nil } -func (s Berserker) killMonster(npc npc.ID, t data.MonsterType) error { - return s.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { - m, found := d.Monsters.FindOne(npc, t) - if !found { - return 0, false - } +func (s *Berserker) PerformBerserkAttack(monsterID data.UnitID) { + ctx := context.Get() + monster, found := s.data.Monsters.FindByID(monsterID) + if !found { + return + } - return m.UnitID, true - }, nil) + // Ensure Berserk skill is active + berserkKey, found := s.data.KeyBindings.KeyBindingForSkill(skill.Berserk) + if found && s.data.PlayerUnit.RightSkill != skill.Berserk { + ctx.HID.PressKeyBinding(berserkKey) + time.Sleep(50 * time.Millisecond) + } + + screenX, screenY := ctx.PathFinder.GameCoordsToScreenCords(monster.Position.X, monster.Position.Y) + ctx.HID.Click(game.LeftButton, screenX, screenY) } -func (s *Berserker) FindItemOnNearbyCorpses(d game.Data, maxRange int, waitTime time.Duration) bool { - s.logger.Debug("Attempting Find Item on nearby corpses", slog.Int("total_corpses", len(d.Corpses))) +func (s *Berserker) FindItemOnNearbyCorpses(maxRange int) { + ctx := context.Get() - findItemKey, found := d.KeyBindings.KeyBindingForSkill(skill.FindItem) + findItemKey, found := s.data.KeyBindings.KeyBindingForSkill(skill.FindItem) if !found { s.logger.Debug("Find Item skill not found in key bindings") - return false + return } - playerPos := d.PlayerUnit.Position - corpseFound := false - successfulFindItems := 0 - checkedCorpses := make(map[data.UnitID]bool) - - // Sort corpses by distance from the player - sort.Slice(d.Corpses, func(i, j int) bool { - distI := s.pf.DistanceFromMe(d.Corpses[i].Position) - distJ := s.pf.DistanceFromMe(d.Corpses[j].Position) - return distI < distJ - }) - - for _, corpse := range d.Corpses { - distance := s.pf.DistanceFromMe(corpse.Position) - - if distance > maxRange { - break - } + corpses := s.getSortedHorkableCorpses(s.data.Corpses, s.data.PlayerUnit.Position, maxRange) + s.logger.Debug("Horkable corpses found", slog.Int("count", len(corpses))) - // Check if this corpse has already been processed - if checkedCorpses[corpse.UnitID] { + for _, corpse := range corpses { + err := step.MoveTo(corpse.Position) + if err != nil { + s.logger.Warn("Failed to move to corpse", slog.String("error", err.Error())) continue } - if corpse.Type != data.MonsterTypeChampion && - corpse.Type != data.MonsterTypeMinion && - corpse.Type != data.MonsterTypeUnique && - corpse.Type != data.MonsterTypeSuperUnique { - continue + if s.data.PlayerUnit.RightSkill != skill.FindItem { + ctx.HID.PressKeyBinding(findItemKey) + time.Sleep(time.Millisecond * 50) } - screenX, screenY := s.pf.GameCoordsToScreenCords( - corpse.Position.X, corpse.Position.Y, - ) - - s.HID.MovePointer(screenX, screenY) - time.Sleep(waitTime) - - s.HID.PressKeyBinding(findItemKey) - time.Sleep(waitTime) - - s.HID.Click(game.RightButton, screenX, screenY) + clickPos := s.getOptimalClickPosition(corpse) + screenX, screenY := ctx.PathFinder.GameCoordsToScreenCords(clickPos.X, clickPos.Y) + ctx.HID.Click(game.RightButton, screenX, screenY) s.logger.Debug("Find Item used on corpse", slog.Any("corpse_id", corpse.UnitID)) - time.Sleep(waitTime) - // Mark this corpse as checked - checkedCorpses[corpse.UnitID] = true + time.Sleep(time.Millisecond * 300) + } - corpseFound = true - successfulFindItems++ +} - if d.PlayerUnit.States.HasState(state.Cooldown) { - break +func (s *Berserker) getSortedHorkableCorpses(corpses data.Monsters, playerPos data.Position, maxRange int) []data.Monster { + var horkableCorpses []data.Monster + for _, corpse := range corpses { + if s.isCorpseHorkable(corpse) && s.pf.DistanceFromMe(corpse.Position) <= maxRange { + horkableCorpses = append(horkableCorpses, corpse) } + } - playerPos = d.PlayerUnit.Position + sort.Slice(horkableCorpses, func(i, j int) bool { + distI := s.pf.DistanceFromMe(horkableCorpses[i].Position) + distJ := s.pf.DistanceFromMe(horkableCorpses[j].Position) + return distI < distJ + }) + + return horkableCorpses +} - if s.pf.DistanceFromMe(playerPos) > maxRange { - break +func (s *Berserker) isCorpseHorkable(corpse data.Monster) bool { + unhorkableStates := []state.State{ + state.CorpseNoselect, + state.CorpseNodraw, + state.Revive, + state.Redeemed, + state.Shatter, + state.Freeze, + state.Restinpeace, + } + + for _, st := range unhorkableStates { + if corpse.States.HasState(st) { + return false } } - s.logger.Debug("Find Item sequence completed", - slog.Bool("corpse_found", corpseFound), - slog.Int("successful_find_items", successfulFindItems)) - return corpseFound + return corpse.Type == data.MonsterTypeChampion || + corpse.Type == data.MonsterTypeMinion || + corpse.Type == data.MonsterTypeUnique || + corpse.Type == data.MonsterTypeSuperUnique } -// Placeholder for possible Howl addition -/// -// func (s Berserker) ensureHowlSkill(d game.Data) []step.Step { -// if d.PlayerUnit.RightSkill != skill.Howl { -// if howlKey, found := d.KeyBindings.KeyBindingForSkill(skill.Howl); found { -// s.logger.Debug(fmt.Sprintf("Activating Howl skill with key binding: %v", howlKey)) -// return []step.Step{step.SyncStep(func(d game.Data) error { -// s.container.HID.PressKeyBinding(howlKey) -// time.Sleep(80 * time.Millisecond) // Short delay after key press -// return nil -// })} -// } else { -// s.logger.Debug("Howl key binding not found") -// } -// } else { -// s.logger.Debug("Howl skill already active") -// } -// return nil -// } - -func (s Berserker) PreCTABuffSkills() []skill.ID { - return []skill.ID{} +func (s *Berserker) getOptimalClickPosition(corpse data.Monster) data.Position { + return data.Position{X: corpse.Position.X, Y: corpse.Position.Y + 1} } -func (s Berserker) BuffSkills() []skill.ID { +/* +todo need to define wich weapon slot I/II is primary/secondary before using that function +func (s *Berserker) swapToWeaponSlot(slot int) error { + ctx := context.Get() + ctx.ContextDebug.LastStep = "swapToWeaponSlot" + + currentSlot := "primary" + if !s.isOnWeaponSlotOne() { + currentSlot = "secondary" + } + + ctx.Logger.Debug("Attempting weapon swap", + slog.Int("targetSlot", slot), + slog.String("currentSlot", currentSlot)) + + if (slot == 1 && s.isOnWeaponSlotOne()) || (slot == 2 && !s.isOnWeaponSlotOne()) { + ctx.Logger.Debug("Already on correct weapon slot", slog.Int("slot", slot)) + return nil + } + + ctx.HID.PressKeyBinding(ctx.Data.KeyBindings.SwapWeapons) + time.Sleep(100 * time.Millisecond) + + ctx.Logger.Debug("Weapon swap performed", slog.Int("toSlot", slot)) + return nil +} +func (s *Berserker) isOnWeaponSlotOne() bool { + + +}*/ + +func (s *Berserker) BuffSkills() []skill.ID { + skillsList := make([]skill.ID, 0) if _, found := s.data.KeyBindings.KeyBindingForSkill(skill.BattleCommand); found { skillsList = append(skillsList, skill.BattleCommand) } - if _, found := s.data.KeyBindings.KeyBindingForSkill(skill.Shout); found { skillsList = append(skillsList, skill.Shout) } - if _, found := s.data.KeyBindings.KeyBindingForSkill(skill.BattleOrders); found { skillsList = append(skillsList, skill.BattleOrders) } - return skillsList } -func (s Berserker) KillCountess() error { +func (s *Berserker) PreCTABuffSkills() []skill.ID { + return []skill.ID{} +} + +func (s *Berserker) killMonster(npc npc.ID, t data.MonsterType) error { + return s.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { + m, found := d.Monsters.FindOne(npc, t) + if !found { + return 0, false + } + return m.UnitID, true + }, nil) +} + +func (s *Berserker) KillCountess() error { return s.killMonster(npc.DarkStalker, data.MonsterTypeSuperUnique) } -func (s Berserker) KillAndariel() error { +func (s *Berserker) KillAndariel() error { return s.killMonster(npc.Andariel, data.MonsterTypeNone) } -func (s Berserker) KillSummoner() error { +func (s *Berserker) KillSummoner() error { return s.killMonster(npc.Summoner, data.MonsterTypeNone) } -func (s Berserker) KillDuriel() error { +func (s *Berserker) KillDuriel() error { return s.killMonster(npc.Duriel, data.MonsterTypeNone) } -func (s Berserker) KillCouncil() error { - return s.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { - // Exclude monsters that are not council members - var councilMembers []data.Monster - for _, m := range d.Monsters { - if m.Name == npc.CouncilMember || m.Name == npc.CouncilMember2 || m.Name == npc.CouncilMember3 { - councilMembers = append(councilMembers, m) - } - } - - // Order council members by distance - sort.Slice(councilMembers, func(i, j int) bool { - distanceI := s.pf.DistanceFromMe(councilMembers[i].Position) - distanceJ := s.pf.DistanceFromMe(councilMembers[j].Position) - - return distanceI < distanceJ - }) - - for _, m := range councilMembers { - return m.UnitID, true - } - - return 0, false - }, nil) -} - -func (s Berserker) KillMephisto() error { +func (s *Berserker) KillMephisto() error { return s.killMonster(npc.Mephisto, data.MonsterTypeNone) } -func (s Berserker) KillIzual() error { - s.killMonster(npc.Izual, data.MonsterTypeNone) - s.killMonster(npc.Izual, data.MonsterTypeNone) - s.killMonster(npc.Izual, data.MonsterTypeNone) - s.killMonster(npc.Izual, data.MonsterTypeNone) - s.killMonster(npc.Izual, data.MonsterTypeNone) - s.killMonster(npc.Izual, data.MonsterTypeNone) - - return s.killMonster(npc.Izual, data.MonsterTypeNone) -} - -func (s Berserker) KillDiablo() error { +func (s *Berserker) KillDiablo() error { timeout := time.Second * 20 startTime := time.Now() diabloFound := false @@ -294,13 +281,10 @@ func (s Berserker) KillDiablo() error { diablo, found := s.data.Monsters.FindOne(npc.Diablo, data.MonsterTypeNone) if !found || diablo.Stats[stat.Life] <= 0 { - // Already dead if diabloFound { return nil } - - // Keep waiting... - time.Sleep(200) + time.Sleep(200 * time.Millisecond) continue } @@ -311,18 +295,118 @@ func (s Berserker) KillDiablo() error { } } -func (s Berserker) KillPindle() error { +func (s *Berserker) KillCouncil() error { + s.isKillingCouncil.Store(true) + defer s.isKillingCouncil.Store(false) + for { + err := s.killAllCouncilMembers() + if err != nil { + if err == ErrNotInTravincal { + s.logger.Info("Not in Travincal during Council kill, moving back") + if moveErr := action.MoveToArea(area.Travincal); moveErr != nil { + return moveErr + } + continue // Retry the Council kill after moving back to Travincal + } + return err + } + break // Exit the loop if killAllCouncilMembers completes without error + } + + // Wait for corpses to settle + time.Sleep(500 * time.Millisecond) + + // Perform horking in two passes + for i := 0; i < 2; i++ { + if err := s.ensureInTravincal(); err != nil { + return err + } + + s.FindItemOnNearbyCorpses(maxHorkRange) + + // Wait between passes + time.Sleep(300 * time.Millisecond) + + // Refresh game data to catch any new corpses + context.Get().RefreshGameData() + } + + // Final wait for items to drop + time.Sleep(500 * time.Millisecond) + + // Final item pickup + err := action.ItemPickup(maxHorkRange) + if err != nil { + s.logger.Warn("Error during final item pickup after horking", "error", err) + return err + } + + // Wait a moment to ensure all items are picked up + time.Sleep(300 * time.Millisecond) + + return nil +} + +func (s *Berserker) killAllCouncilMembers() error { + for { + if err := s.ensureInTravincal(); err != nil { + return ErrNotInTravincal + } + + if !s.anyCouncilMemberAlive() { + return nil + } + + err := s.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { + for _, m := range d.Monsters.Enemies() { + if (m.Name == npc.CouncilMember || m.Name == npc.CouncilMember2 || m.Name == npc.CouncilMember3) && m.Stats[stat.Life] > 0 { + return m.UnitID, true + } + } + return 0, false + }, nil) + + if err != nil { + // Check if we're still in Travincal after the attack sequence + if checkErr := s.ensureInTravincal(); checkErr != nil { + return ErrNotInTravincal + } + // If we're still in Travincal, return the original error + return err + } + } +} + +func (s *Berserker) anyCouncilMemberAlive() bool { + for _, m := range s.data.Monsters.Enemies() { + if (m.Name == npc.CouncilMember || m.Name == npc.CouncilMember2 || m.Name == npc.CouncilMember3) && m.Stats[stat.Life] > 0 { + return true + } + } + return false +} + +// could be optimized it takes up to 15 second to get back in +func (s *Berserker) ensureInTravincal() error { + ctx := context.Get() + if ctx.Data.PlayerUnit.Area != area.Travincal { + return ErrNotInTravincal + } + return nil +} + +func (s *Berserker) KillIzual() error { + return s.killMonster(npc.Izual, data.MonsterTypeNone) +} + +func (s *Berserker) KillPindle() error { return s.killMonster(npc.DefiledWarrior, data.MonsterTypeSuperUnique) } -func (s Berserker) KillNihlathak() error { +func (s *Berserker) KillNihlathak() error { return s.killMonster(npc.Nihlathak, data.MonsterTypeSuperUnique) } -func (s Berserker) KillBaal() error { - s.killMonster(npc.BaalCrab, data.MonsterTypeNone) - s.killMonster(npc.BaalCrab, data.MonsterTypeNone) - s.killMonster(npc.BaalCrab, data.MonsterTypeNone) - +func (s *Berserker) KillBaal() error { return s.killMonster(npc.BaalCrab, data.MonsterTypeNone) } diff --git a/internal/character/character.go b/internal/character/character.go index 0c7e0f7f6..879e49e4f 100644 --- a/internal/character/character.go +++ b/internal/character/character.go @@ -56,7 +56,7 @@ func BuildCharacter(logger *slog.Logger, cfg *config.CharacterCfg, data *game.Da case "javazon": return Javazon{BaseCharacter: bc}, nil case "berserker": - return Berserker{BaseCharacter: bc}, nil + return &Berserker{BaseCharacter: bc}, nil // Return a pointer to Berserker } return nil, fmt.Errorf("class %s not implemented", cfg.Character.Class) diff --git a/internal/context/context.go b/internal/context/context.go index cd356537e..496735ded 100644 --- a/internal/context/context.go +++ b/internal/context/context.go @@ -126,3 +126,11 @@ func (s *Status) PauseIfNotPriority() { time.Sleep(time.Millisecond * 10) } } +func (ctx *Context) WaitForGameToLoad() { + for ctx.Data.OpenMenus.LoadingScreen { + ctx.RefreshGameData() + time.Sleep(100 * time.Millisecond) + } + // Add a small buffer to ensure everything is fully loaded + time.Sleep(300 * time.Millisecond) +} diff --git a/internal/run/travincal.go b/internal/run/travincal.go index 57594b38f..492b8dece 100644 --- a/internal/run/travincal.go +++ b/internal/run/travincal.go @@ -23,11 +23,17 @@ func (s Council) Name() string { } func (s Council) Run() error { - err := action.WayPoint(area.Travincal) // Moving to starting point (Travincal) + err := action.WayPoint(area.Travincal) if err != nil { return err } + // Wait for the game to fully load + s.ctx.WaitForGameToLoad() + + // Buff after ensuring we're in Travincal + action.Buff() + for _, al := range s.ctx.Data.AdjacentLevels { if al.Area == area.DuranceOfHateLevel1 { err = action.MoveToCoords(data.Position{ From 192999908866359e0577d6e9a0f8799eb63e3ae3 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Fri, 4 Oct 2024 08:36:12 +0900 Subject: [PATCH 352/548] check if character is moving before finishing MoveTo step, use WaitForGameToLoad after each wp usage --- go.mod | 2 +- go.sum | 4 ++-- internal/action/step/move.go | 33 +++++++++++++++++---------------- internal/action/waypoint.go | 1 + internal/context/context.go | 2 +- internal/run/travincal.go | 3 --- 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index 4dbdbafc4..9bdcbc59b 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/bwmarrin/discordgo v0.28.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 github.com/gorilla/websocket v1.5.3 - github.com/hectorgimenez/d2go v0.0.0-20241002141317-ab7163d11146 + github.com/hectorgimenez/d2go v0.0.0-20241002222940-19376148b310 github.com/inkeliz/gowebview v1.0.1 github.com/inkeliz/w32 v1.0.2 github.com/lxn/win v0.0.0-20210218163916-a377121e959e diff --git a/go.sum b/go.sum index 36d96a2c7..634696273 100644 --- a/go.sum +++ b/go.sum @@ -15,8 +15,8 @@ github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2 github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/hectorgimenez/d2go v0.0.0-20241002141317-ab7163d11146 h1:dtM/si1YHZ4GQ/p14qFeZGoDFPQxW7INkvr5bNZ5D04= -github.com/hectorgimenez/d2go v0.0.0-20241002141317-ab7163d11146/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= +github.com/hectorgimenez/d2go v0.0.0-20241002222940-19376148b310 h1:l7YbYbvvdyWhzZNrhIAh+CrDZGQ6eG+kQ2+/DFCKJT4= +github.com/hectorgimenez/d2go v0.0.0-20241002222940-19376148b310/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= github.com/inkeliz/gowebview v1.0.1 h1:4gpLE2qt4kV3DB+xHkHKUeLLiGPN5Xw3or9A3hVqYyA= github.com/inkeliz/gowebview v1.0.1/go.mod h1:4SNjXp/fogE11MwvJD67kMBmSObY2BBqinEgH8+8eM8= github.com/inkeliz/w32 v1.0.2 h1:Es8Bmw9ApOY0PVRpGs7wsqIKdK5C3xBkP5TOATfVmtU= diff --git a/internal/action/step/move.go b/internal/action/step/move.go index eca2775d8..71490d411 100644 --- a/internal/action/step/move.go +++ b/internal/action/step/move.go @@ -5,6 +5,7 @@ import ( "time" "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/d2go/pkg/data/mode" "github.com/hectorgimenez/d2go/pkg/data/skill" "github.com/hectorgimenez/koolo/internal/context" "github.com/hectorgimenez/koolo/internal/utils" @@ -18,8 +19,18 @@ func MoveTo(dest data.Position) error { defer func() { if ctx.Data.CanTeleport() { utils.Sleep(250) - } else { - utils.Sleep(500) + return + } + + for { + switch ctx.Data.PlayerUnit.Mode { + case mode.Walking, mode.WalkingInTown: + utils.Sleep(100) + ctx.RefreshGameData() + continue + default: + return + } } }() @@ -47,16 +58,7 @@ func MoveTo(dest data.Position) error { } } - distance := ctx.PathFinder.DistanceFromMe(dest) - if distance <= stopAtDistance { - // In case distance is lower, we double-check with the pathfinder and the full path instead of euclidean distance - _, distance, found := ctx.PathFinder.GetPath(dest) - if !found || distance <= stopAtDistance { - return nil - } - } - - path, _, found := ctx.PathFinder.GetClosestWalkablePath(dest) + path, distance, found := ctx.PathFinder.GetPath(dest) if !found { if ctx.PathFinder.DistanceFromMe(dest) < stopAtDistance+5 { return nil @@ -65,10 +67,11 @@ func MoveTo(dest data.Position) error { return errors.New("path could not be calculated, maybe there is an obstacle or a flying platform (arcane sanctuary)") } - if found && len(path) <= stopAtDistance { + if distance <= stopAtDistance || len(path) <= stopAtDistance || len(path) == 0 { return nil } + // Exit on timeout if timeout > 0 && time.Since(startedAt) > timeout { return nil } @@ -79,14 +82,12 @@ func MoveTo(dest data.Position) error { continue } + // We skip the movement if we can teleport and the last movement time was less than the player cast duration if ctx.Data.CanTeleport() && time.Since(lastRun) < ctx.Data.PlayerCastDuration() { continue } lastRun = time.Now() - if len(path) == 0 { - return nil - } // If we are stuck in the same position, make a random movement and cross fingers if previousPosition == ctx.Data.PlayerUnit.Position && !ctx.Data.CanTeleport() { diff --git a/internal/action/waypoint.go b/internal/action/waypoint.go index dbd4e34c2..9a8503405 100644 --- a/internal/action/waypoint.go +++ b/internal/action/waypoint.go @@ -23,6 +23,7 @@ func WayPoint(dest area.ID) error { } if ctx.Data.PlayerUnit.Area == dest { + ctx.WaitForGameToLoad() return nil } diff --git a/internal/context/context.go b/internal/context/context.go index 496735ded..c3ec1e960 100644 --- a/internal/context/context.go +++ b/internal/context/context.go @@ -128,8 +128,8 @@ func (s *Status) PauseIfNotPriority() { } func (ctx *Context) WaitForGameToLoad() { for ctx.Data.OpenMenus.LoadingScreen { - ctx.RefreshGameData() time.Sleep(100 * time.Millisecond) + ctx.RefreshGameData() } // Add a small buffer to ensure everything is fully loaded time.Sleep(300 * time.Millisecond) diff --git a/internal/run/travincal.go b/internal/run/travincal.go index 492b8dece..392539942 100644 --- a/internal/run/travincal.go +++ b/internal/run/travincal.go @@ -28,9 +28,6 @@ func (s Council) Run() error { return err } - // Wait for the game to fully load - s.ctx.WaitForGameToLoad() - // Buff after ensuring we're in Travincal action.Buff() From b8ccfc57f6fc090159720445ff94147c86e0f468 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Fri, 4 Oct 2024 16:25:04 +0900 Subject: [PATCH 353/548] Fetch map data concurrently --- internal/game/memory_injector.go | 2 +- internal/game/memory_reader.go | 57 ++++++++++++++++++++------------ 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/internal/game/memory_injector.go b/internal/game/memory_injector.go index 366930ccb..e894f5e62 100644 --- a/internal/game/memory_injector.go +++ b/internal/game/memory_injector.go @@ -91,7 +91,7 @@ func (i *MemoryInjector) Load() error { func (i *MemoryInjector) Unload() error { if err := i.RestoreMemory(); err != nil { - i.logger.Error("error restoring memory", err) + i.logger.Error(fmt.Sprintf("error restoring memory: %v", err)) } return windows.CloseHandle(i.handle) diff --git a/internal/game/memory_reader.go b/internal/game/memory_reader.go index 6b4bbfd24..8b04934f0 100644 --- a/internal/game/memory_reader.go +++ b/internal/game/memory_reader.go @@ -5,6 +5,7 @@ import ( "fmt" "log/slog" "strconv" + "sync" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -14,6 +15,7 @@ import ( "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/game/map_client" "github.com/lxn/win" + "golang.org/x/sync/errgroup" ) type MemoryReader struct { @@ -65,35 +67,46 @@ func (gd *MemoryReader) FetchMapData() error { } areas := make(map[area.ID]AreaData) + var mu sync.Mutex + g := errgroup.Group{} for _, lvl := range mapData { - cg := lvl.CollisionGrid() - resultGrid := make([][]CollisionType, lvl.Size.Height) - for i := range resultGrid { - resultGrid[i] = make([]CollisionType, lvl.Size.Width) - } + g.Go(func() error { + cg := lvl.CollisionGrid() + resultGrid := make([][]CollisionType, lvl.Size.Height) + for i := range resultGrid { + resultGrid[i] = make([]CollisionType, lvl.Size.Width) + } - for y := 0; y < lvl.Size.Height; y++ { - for x := 0; x < lvl.Size.Width; x++ { - if cg[y][x] { - resultGrid[y][x] = CollisionTypeWalkable - } else { - resultGrid[y][x] = CollisionTypeNonWalkable + for y := 0; y < lvl.Size.Height; y++ { + for x := 0; x < lvl.Size.Width; x++ { + if cg[y][x] { + resultGrid[y][x] = CollisionTypeWalkable + } else { + resultGrid[y][x] = CollisionTypeNonWalkable + } } } - } - npcs, exits, objects, rooms := lvl.NPCsExitsAndObjects() - areas[area.ID(lvl.ID)] = AreaData{ - Area: area.ID(lvl.ID), - Name: lvl.Name, - NPCs: npcs, - AdjacentLevels: exits, - Objects: objects, - Rooms: rooms, - Grid: NewGrid(resultGrid, lvl.Offset.X, lvl.Offset.Y), - } + npcs, exits, objects, rooms := lvl.NPCsExitsAndObjects() + grid := NewGrid(resultGrid, lvl.Offset.X, lvl.Offset.Y) + mu.Lock() + areas[area.ID(lvl.ID)] = AreaData{ + Area: area.ID(lvl.ID), + Name: lvl.Name, + NPCs: npcs, + AdjacentLevels: exits, + Objects: objects, + Rooms: rooms, + Grid: grid, + } + mu.Unlock() + + return nil + }) } + _ = g.Wait() + gd.cachedMapData = areas gd.logger.Debug("Fetch completed", slog.Int64("ms", time.Since(t).Milliseconds())) From d1786c665ab1b0bd13cf6f12d406df0b10b5af21 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Fri, 4 Oct 2024 16:26:09 +0900 Subject: [PATCH 354/548] add delay after opening chests, this will allow the animation to finish so we can pickup the items, otherwise bot is too fast and teleports away the chest --- internal/action/clear_level.go | 2 ++ internal/run/lower_kurast_chests.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/internal/action/clear_level.go b/internal/action/clear_level.go index 4e4ee60bb..792080ccd 100644 --- a/internal/action/clear_level.go +++ b/internal/action/clear_level.go @@ -8,6 +8,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/context" "github.com/hectorgimenez/koolo/internal/game" + "github.com/hectorgimenez/koolo/internal/utils" ) func ClearCurrentLevel(openChests bool, filter data.MonsterFilter) error { @@ -39,6 +40,7 @@ func ClearCurrentLevel(openChests bool, filter data.MonsterFilter) error { if err != nil { ctx.Logger.Warn("Failed interacting with chest: %v", err) } + utils.Sleep(500) // Add small delay to allow the game to open the chest and drop the content } } } diff --git a/internal/run/lower_kurast_chests.go b/internal/run/lower_kurast_chests.go index 10ac038bc..0ba8abe40 100644 --- a/internal/run/lower_kurast_chests.go +++ b/internal/run/lower_kurast_chests.go @@ -11,6 +11,7 @@ import ( "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/context" "github.com/hectorgimenez/koolo/internal/pather" + "github.com/hectorgimenez/koolo/internal/utils" ) var minChestDistanceFromBonfire = 25 @@ -85,6 +86,7 @@ func (run LowerKurastChests) Run() error { if err != nil { run.ctx.Logger.Warn("Failed interacting with chest: %v", err) } + utils.Sleep(500) // Add small delay to allow the game to open the chest and drop the content // Remove the interacted chest from the list chests = chests[1:] From e446b802b8966fd7af7f4aeb55898d5fa68340df Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Fri, 4 Oct 2024 16:26:58 +0900 Subject: [PATCH 355/548] high priority loop is super fast (less than 1ms), we can execute it more often so item pickup will be more reactive --- internal/bot/bot.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/internal/bot/bot.go b/internal/bot/bot.go index eceb5cb62..ce9120894 100644 --- a/internal/bot/bot.go +++ b/internal/bot/bot.go @@ -3,9 +3,10 @@ package bot import ( "context" "fmt" - "github.com/hectorgimenez/koolo/internal/character" "time" + "github.com/hectorgimenez/koolo/internal/character" + "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/koolo/internal/action" botCtx "github.com/hectorgimenez/koolo/internal/context" @@ -39,14 +40,12 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) error { return err } - b.ctx.WaitForGameToLoad() // Switch to legacy mode if configured action.SwitchToLegacyMode() b.ctx.RefreshGameData() - // This routine is in charge of refreshing the game data and handling cancellation, will work in parallel with any other execution g.Go(func() error { b.ctx.AttachRoutine(botCtx.PriorityBackground) @@ -107,7 +106,7 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) error { }() b.ctx.AttachRoutine(botCtx.PriorityHigh) - ticker := time.NewTicker(time.Second) + ticker := time.NewTicker(time.Millisecond * 100) for { select { case <-ctx.Done(): From 083afca15a5f332d523f2fbdb58e37cda97f4a60 Mon Sep 17 00:00:00 2001 From: Hector Gimenez Date: Fri, 4 Oct 2024 16:28:47 +0900 Subject: [PATCH 356/548] bugfixing on item pickup and overall interaction improvements --- internal/action/item.go | 5 +---- internal/action/item_pickup.go | 7 ++++++- internal/action/move.go | 1 + internal/action/stash.go | 2 +- internal/action/step/interact_npc.go | 2 +- internal/action/step/interact_object.go | 3 +-- internal/action/step/move.go | 7 +------ internal/action/step/pickup_item.go | 7 ++++--- internal/action/tp_actions.go | 1 + 9 files changed, 17 insertions(+), 18 deletions(-) diff --git a/internal/action/item.go b/internal/action/item.go index 1ec49197f..2239461f5 100644 --- a/internal/action/item.go +++ b/internal/action/item.go @@ -12,7 +12,7 @@ import ( "github.com/hectorgimenez/koolo/internal/utils" ) -func doesExceedQuantity(i data.Item, rule nip.Rule) bool { +func doesExceedQuantity(rule nip.Rule) bool { ctx := context.Get() ctx.ContextDebug.LastAction = "doesExceedQuantity" @@ -24,7 +24,6 @@ func doesExceedQuantity(i data.Item, rule nip.Rule) bool { } if maxQuantity == 0 { - ctx.Logger.Debug(fmt.Sprintf("Max quantity for %s item is 0, skipping further logic", i.Name)) return false } @@ -37,8 +36,6 @@ func doesExceedQuantity(i data.Item, rule nip.Rule) bool { } } - ctx.Logger.Debug(fmt.Sprintf("For item %s found %d max quantity from pickit rule, number of items in the stash tabs %d", i.Name, maxQuantity, matchedItemsInStash)) - return matchedItemsInStash >= maxQuantity } diff --git a/internal/action/item_pickup.go b/internal/action/item_pickup.go index 68f0c9d3a..22004b74a 100644 --- a/internal/action/item_pickup.go +++ b/internal/action/item_pickup.go @@ -1,6 +1,7 @@ package action import ( + "errors" "fmt" "log/slog" "slices" @@ -90,6 +91,10 @@ func ItemPickup(maxDistance int) error { } err = step.PickupItem(itemToPickup) + if errors.Is(err, step.ErrItemTooFar) { + ctx.Logger.Debug("Item is too far away, retrying...") + continue + } if err != nil { ctx.CurrentGame.BlacklistedItems = append(ctx.CurrentGame.BlacklistedItems, itemToPickup) ctx.Logger.Warn( @@ -220,7 +225,7 @@ func shouldBePickedUp(i data.Item) bool { return true } - exceedQuantity := doesExceedQuantity(i, matchedRule) + exceedQuantity := doesExceedQuantity(matchedRule) return !exceedQuantity } diff --git a/internal/action/move.go b/internal/action/move.go index 19dfaf034..be9514d5d 100644 --- a/internal/action/move.go +++ b/internal/action/move.go @@ -123,6 +123,7 @@ func MoveTo(toFunc func() (data.Position, bool)) error { openedDoors := make(map[object.Name]data.Position) previousIterationPosition := data.Position{} for { + ctx.RefreshGameData() to, found := toFunc() if !found { return nil diff --git a/internal/action/stash.go b/internal/action/stash.go index 52cc7c236..42503f5af 100644 --- a/internal/action/stash.go +++ b/internal/action/stash.go @@ -209,7 +209,7 @@ func shouldStashIt(i data.Item, firstRun bool) (bool, string, string) { } rule, res := ctx.CharacterCfg.Runtime.Rules.EvaluateAll(i) - if res == nip.RuleResultFullMatch && doesExceedQuantity(i, rule) { + if res == nip.RuleResultFullMatch && doesExceedQuantity(rule) { return false, "", "" } diff --git a/internal/action/step/interact_npc.go b/internal/action/step/interact_npc.go index 080ab70da..438d9eb55 100644 --- a/internal/action/step/interact_npc.go +++ b/internal/action/step/interact_npc.go @@ -37,7 +37,7 @@ func InteractNPC(npcID npc.ID) error { } // Give some time before retrying the interaction - if waitingForInteraction && time.Since(lastRun) < time.Millisecond*500 { + if waitingForInteraction && time.Since(lastRun) < time.Millisecond*200 { continue } diff --git a/internal/action/step/interact_object.go b/internal/action/step/interact_object.go index 58afa5791..66cc47165 100644 --- a/internal/action/step/interact_object.go +++ b/internal/action/step/interact_object.go @@ -14,7 +14,6 @@ import ( ) func InteractObject(obj data.Object, isCompletedFn func() bool) error { - utils.Sleep(500) maxInteractionAttempts := 10 interactionAttempts := 0 maxMouseOverAttempts := 20 @@ -48,7 +47,7 @@ func InteractObject(obj data.Object, isCompletedFn func() bool) error { ctx.RefreshGameData() // Give some time before retrying the interaction - if waitingForInteraction && time.Since(lastRun) < time.Millisecond*500 { + if waitingForInteraction && time.Since(lastRun) < time.Millisecond*200 { continue } diff --git a/internal/action/step/move.go b/internal/action/step/move.go index 71490d411..24dbb20b2 100644 --- a/internal/action/step/move.go +++ b/internal/action/step/move.go @@ -17,14 +17,9 @@ func MoveTo(dest data.Position) error { // This is to ensure we finished moving before returning defer func() { - if ctx.Data.CanTeleport() { - utils.Sleep(250) - return - } - for { switch ctx.Data.PlayerUnit.Mode { - case mode.Walking, mode.WalkingInTown: + case mode.Walking, mode.WalkingInTown, mode.Running, mode.CastingSkill: utils.Sleep(100) ctx.RefreshGameData() continue diff --git a/internal/action/step/pickup_item.go b/internal/action/step/pickup_item.go index 85749cb88..746564082 100644 --- a/internal/action/step/pickup_item.go +++ b/internal/action/step/pickup_item.go @@ -1,8 +1,8 @@ package step import ( + "errors" "fmt" - "log/slog" "time" "github.com/hectorgimenez/d2go/pkg/data" @@ -15,6 +15,8 @@ import ( const maxInteractions = 45 +var ErrItemTooFar = errors.New("item is too far away") + func PickupItem(it data.Item) error { ctx := context.Get() ctx.ContextDebug.LastStep = "PickupItem" @@ -87,8 +89,7 @@ func PickupItem(it data.Item) error { distance := ctx.PathFinder.DistanceFromMe(it.Position) if distance > 10 { - ctx.Logger.Info("item is too far away", slog.String("item", it.Desc().Name)) - return fmt.Errorf("item is too far away (%d): %s", distance, it.Desc().Name) + return fmt.Errorf("%v (%d): %s", ErrItemTooFar, distance, it.Desc().Name) } x, y := utils.Spiral(mouseOverAttempts) diff --git a/internal/action/tp_actions.go b/internal/action/tp_actions.go index bfab61a25..59ddc4a1a 100644 --- a/internal/action/tp_actions.go +++ b/internal/action/tp_actions.go @@ -3,6 +3,7 @@ package action import ( "errors" "fmt" + "github.com/hectorgimenez/d2go/pkg/data/object" "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/context" From 79f20d4ad25b02a7eeb1db073fd7b0c1a90e8e7f Mon Sep 17 00:00:00 2001 From: elb <51070858+elobo91@users.noreply.github.com> Date: Fri, 4 Oct 2024 22:48:34 -0400 Subject: [PATCH 357/548] Swap Items before Hork ( Barbarian) (#507) --- internal/character/berserk_barb.go | 40 ++++++++----------- internal/config/config.go | 10 +++-- internal/run/travincal.go | 6 +++ internal/server/http_server.go | 1 + .../templates/character_settings.gohtml | 4 ++ 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/internal/character/berserk_barb.go b/internal/character/berserk_barb.go index c9dc3ed02..18abd29a9 100644 --- a/internal/character/berserk_barb.go +++ b/internal/character/berserk_barb.go @@ -113,6 +113,8 @@ func (s *Berserker) PerformBerserkAttack(monsterID data.UnitID) { func (s *Berserker) FindItemOnNearbyCorpses(maxRange int) { ctx := context.Get() + s.SwapToSlot(1) + findItemKey, found := s.data.KeyBindings.KeyBindingForSkill(skill.FindItem) if !found { s.logger.Debug("Find Item skill not found in key bindings") @@ -188,36 +190,26 @@ func (s *Berserker) getOptimalClickPosition(corpse data.Monster) data.Position { return data.Position{X: corpse.Position.X, Y: corpse.Position.Y + 1} } -/* -todo need to define wich weapon slot I/II is primary/secondary before using that function -func (s *Berserker) swapToWeaponSlot(slot int) error { +// slot 0 means lowest Gold Find, slot 1 means highest Gold Find +// Presuming attack items will be on slot 0 and Goldfind items on slot 1 +// TODO find a way to get active inventory slot from memory. +func (s *Berserker) SwapToSlot(slot int) { ctx := context.Get() - ctx.ContextDebug.LastStep = "swapToWeaponSlot" - - currentSlot := "primary" - if !s.isOnWeaponSlotOne() { - currentSlot = "secondary" - } - - ctx.Logger.Debug("Attempting weapon swap", - slog.Int("targetSlot", slot), - slog.String("currentSlot", currentSlot)) - - if (slot == 1 && s.isOnWeaponSlotOne()) || (slot == 2 && !s.isOnWeaponSlotOne()) { - ctx.Logger.Debug("Already on correct weapon slot", slog.Int("slot", slot)) - return nil + if !ctx.CharacterCfg.Character.FindItemSwitch { + return // Do nothing if FindItemSwitch is disabled } - ctx.HID.PressKeyBinding(ctx.Data.KeyBindings.SwapWeapons) + initialGF, _ := s.data.PlayerUnit.FindStat(stat.GoldFind, 0) + ctx.HID.PressKey('W') time.Sleep(100 * time.Millisecond) + ctx.RefreshGameData() + swappedGF, _ := s.data.PlayerUnit.FindStat(stat.GoldFind, 0) - ctx.Logger.Debug("Weapon swap performed", slog.Int("toSlot", slot)) - return nil + if (slot == 0 && swappedGF.Value > initialGF.Value) || + (slot == 1 && swappedGF.Value < initialGF.Value) { + ctx.HID.PressKey('W') // Swap back if not in desired slot + } } -func (s *Berserker) isOnWeaponSlotOne() bool { - - -}*/ func (s *Berserker) BuffSkills() []skill.ID { diff --git a/internal/config/config.go b/internal/config/config.go index af4b05e55..8fab7f426 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -101,11 +101,13 @@ type CharacterCfg struct { BeltColumns BeltColumns `yaml:"beltColumns"` } `yaml:"inventory"` Character struct { - Class string `yaml:"class"` - UseMerc bool `yaml:"useMerc"` - StashToShared bool `yaml:"stashToShared"` - UseTeleport bool `yaml:"useTeleport"` + Class string `yaml:"class"` + UseMerc bool `yaml:"useMerc"` + StashToShared bool `yaml:"stashToShared"` + UseTeleport bool `yaml:"useTeleport"` + FindItemSwitch bool `yaml:"find_item_switch"` } `yaml:"character"` + Game struct { MinGoldPickupThreshold int `yaml:"minGoldPickupThreshold"` ClearTPArea bool `yaml:"clearTPArea"` diff --git a/internal/run/travincal.go b/internal/run/travincal.go index 392539942..d380bc750 100644 --- a/internal/run/travincal.go +++ b/internal/run/travincal.go @@ -4,6 +4,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/koolo/internal/action" + "github.com/hectorgimenez/koolo/internal/character" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/context" ) @@ -23,6 +24,11 @@ func (s Council) Name() string { } func (s Council) Run() error { + // Check if the character is a Berserker and swap to combat gear + if berserker, ok := s.ctx.Char.(*character.Berserker); ok { + berserker.SwapToSlot(0) // Swap to combat gear (lowest Gold Find) + } + err := action.WayPoint(area.Travincal) if err != nil { return err diff --git a/internal/server/http_server.go b/internal/server/http_server.go index 927aff100..fa5402303 100644 --- a/internal/server/http_server.go +++ b/internal/server/http_server.go @@ -781,6 +781,7 @@ func (s *HttpServer) characterSettings(w http.ResponseWriter, r *http.Request) { cfg.Character.Class = r.Form.Get("characterClass") cfg.Character.StashToShared = r.Form.Has("characterStashToShared") cfg.Character.UseTeleport = r.Form.Has("characterUseTeleport") + cfg.Character.FindItemSwitch = r.Form.Has("characterFindItemSwitch") for y, row := range cfg.Inventory.InventoryLock { for x := range row { diff --git a/internal/server/templates/character_settings.gohtml b/internal/server/templates/character_settings.gohtml index 351afa351..e7214e430 100644 --- a/internal/server/templates/character_settings.gohtml +++ b/internal/server/templates/character_settings.gohtml @@ -92,6 +92,10 @@ Always stash to shared tab +
    - + +
    - +
    + +
    From e7c0ff7ccc76d6de4232f33b8e7cc9d319ed4f2d Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Fri, 20 Dec 2024 12:52:03 +0200 Subject: [PATCH 490/548] Stash items before identify (#591) --- internal/action/town.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/internal/action/town.go b/internal/action/town.go index 9d0be3503..62b131d16 100644 --- a/internal/action/town.go +++ b/internal/action/town.go @@ -19,13 +19,31 @@ func PreRun(firstRun bool) error { } UpdateQuestLog() + + // Store items that need to be left unidentified + if HaveItemsToStashUnidentified() { + Stash(firstRun) + } + + // Identify - either via Cain or Tome IdentifyAll(firstRun) + + // Stash before vendor Stash(firstRun) + + // Refill pots, sell, buy etc VendorRefill(false, true) + + // Gamble Gamble() + + // Stash again if needed Stash(false) + + // Perform cube recipes CubeRecipes() + // Leveling related checks if ctx.CharacterCfg.Game.Leveling.EnsurePointsAllocation { ResetStats() EnsureStatPoints() From f03856a01f24c1fed6fc9992c4c94fdc6360b196 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Fri, 20 Dec 2024 13:43:28 +0200 Subject: [PATCH 491/548] fix taking items from cube (#592) --- internal/action/horadric_cube.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/internal/action/horadric_cube.go b/internal/action/horadric_cube.go index defbb42e0..84e8edc70 100644 --- a/internal/action/horadric_cube.go +++ b/internal/action/horadric_cube.go @@ -100,13 +100,15 @@ func CubeTransmute() error { utils.Sleep(2000) - if ctx.Data.LegacyGraphics { - ctx.HID.ClickWithModifier(game.LeftButton, ui.CubeTakeItemXClassic, ui.CubeTakeItemYClassic, game.CtrlKey) - } else { - ctx.HID.ClickWithModifier(game.LeftButton, ui.CubeTakeItemX, ui.CubeTakeItemY, game.CtrlKey) - } + // Take the items out of the cube + for _, itm := range ctx.Data.Inventory.ByLocation(item.LocationCube) { + ctx.Logger.Debug("Moving Item to the inventory", slog.String("Item", string(itm.Name))) - utils.Sleep(300) + screenPos := ui.GetScreenCoordsForItem(itm) + + ctx.HID.ClickWithModifier(game.LeftButton, screenPos.X, screenPos.Y, game.CtrlKey) + utils.Sleep(500) + } return step.CloseAllMenus() } From 759f8a7727243ab261b63f74f4b7391a45a82b27 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Mon, 23 Dec 2024 13:21:45 +0200 Subject: [PATCH 492/548] Implement centralized pickit option (#601) --- internal/bot/manager.go | 30 +++++++++++ internal/config/config.go | 54 ++++++++++++++----- internal/context/context.go | 4 +- internal/game/memory_reader.go | 12 ++++- internal/server/assets/css/dashboard.css | 13 +++++ internal/server/assets/js/dashboard.js | 22 ++++++++ internal/server/http_server.go | 20 +++++-- .../templates/character_settings.gohtml | 6 ++- internal/server/templates/config.gohtml | 8 +++ internal/server/templates/index.gohtml | 5 +- 10 files changed, 152 insertions(+), 22 deletions(-) diff --git a/internal/bot/manager.go b/internal/bot/manager.go index e4db8403a..fd2230b8e 100644 --- a/internal/bot/manager.go +++ b/internal/bot/manager.go @@ -110,6 +110,36 @@ func (mng *SupervisorManager) Start(supervisorName string, attachToExisting bool return nil } +func (mng *SupervisorManager) ReloadConfig() error { + + // Load fresh configs + if err := config.Load(); err != nil { + return err + } + + // Apply new configs to running supervisors + for name, sup := range mng.supervisors { + newCfg, exists := config.Characters[name] + if !exists { + continue + } + + ctx := sup.GetContext() + if ctx == nil { + continue + } + + // Preserve runtime data + //oldRuntimeData := ctx.CharacterCfg.Runtime + + // Update the config + *ctx.CharacterCfg = *newCfg + //ctx.CharacterCfg.Runtime = oldRuntimeData + } + + return nil +} + func (mng *SupervisorManager) StopAll() { for _, s := range mng.supervisors { s.Stop() diff --git a/internal/config/config.go b/internal/config/config.go index 0e3ebc508..7a930c29b 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -7,6 +7,7 @@ import ( "time" "github.com/hectorgimenez/d2go/pkg/data" + "github.com/hectorgimenez/koolo/internal/utils" "os" "strings" @@ -40,6 +41,7 @@ type KooloCfg struct { LogSaveDirectory string `yaml:"logSaveDirectory"` D2LoDPath string `yaml:"D2LoDPath"` D2RPath string `yaml:"D2RPath"` + CentralizedPickitPath string `yaml:"centralizedPickitPath"` Discord struct { Enabled bool `yaml:"enabled"` EnableGameCreatedMessages bool `yaml:"enableGameCreatedMessages"` @@ -73,17 +75,18 @@ type TimeRange struct { } type CharacterCfg struct { - MaxGameLength int `yaml:"maxGameLength"` - Username string `yaml:"username"` - Password string `yaml:"password"` - AuthMethod string `yaml:"authMethod"` - AuthToken string `yaml:"authToken"` - Realm string `yaml:"realm"` - CharacterName string `yaml:"characterName"` - CommandLineArgs string `yaml:"commandLineArgs"` - KillD2OnStop bool `yaml:"killD2OnStop"` - ClassicMode bool `yaml:"classicMode"` - CloseMiniPanel bool `yaml:"closeMiniPanel"` + MaxGameLength int `yaml:"maxGameLength"` + Username string `yaml:"username"` + Password string `yaml:"password"` + AuthMethod string `yaml:"authMethod"` + AuthToken string `yaml:"authToken"` + Realm string `yaml:"realm"` + CharacterName string `yaml:"characterName"` + CommandLineArgs string `yaml:"commandLineArgs"` + KillD2OnStop bool `yaml:"killD2OnStop"` + ClassicMode bool `yaml:"classicMode"` + CloseMiniPanel bool `yaml:"closeMiniPanel"` + UseCentralizedPickit bool `yaml:"useCentralizedPickit"` Scheduler Scheduler `yaml:"scheduler"` Health struct { @@ -301,12 +304,15 @@ func Load() error { return fmt.Errorf("error reading config directory %s: %w", configDir, err) } + // Read character configs for _, entry := range entries { - if !entry.IsDir() { + if !entry.IsDir() || entry.Name() == "template" { continue } charCfg := CharacterCfg{} + + // Load character config from the current working directory/config/{charName}/config.yaml charConfigPath := getAbsPath(filepath.Join("config", entry.Name(), "config.yaml")) r, err = os.Open(charConfigPath) if err != nil { @@ -314,17 +320,36 @@ func Load() error { } defer r.Close() + // Load character config d := yaml.NewDecoder(r) if err = d.Decode(&charCfg); err != nil { return fmt.Errorf("error reading %s character config: %w", charConfigPath, err) } - pickitPath := getAbsPath(filepath.Join("config", entry.Name(), "pickit")) + "\\" + var pickitPath string + + if Koolo.CentralizedPickitPath != "" && charCfg.UseCentralizedPickit { + // Validate centralized pickit path + if _, err := os.Stat(Koolo.CentralizedPickitPath); os.IsNotExist(err) { + utils.ShowDialog("Error loading pickit rules for "+entry.Name(), "The centralized pickit path does not exist: "+Koolo.CentralizedPickitPath+"\nPlease check your Koolo settings.\nFalling back to local pickit.") + + // Set the pickit path to the current dir/config/{charName}/pickit + pickitPath = getAbsPath(filepath.Join("config", entry.Name(), "pickit")) + "\\" + } else { + pickitPath = Koolo.CentralizedPickitPath + "\\" + } + } else { + // Set the pickit path to the current dir/config/{charName}/pickit + pickitPath = getAbsPath(filepath.Join("config", entry.Name(), "pickit")) + "\\" + } + + // Load the pickit rules from the directory rules, err := nip.ReadDir(pickitPath) if err != nil { return fmt.Errorf("error reading pickit directory %s: %w", pickitPath, err) } + // Load the leveling pickit rules if len(charCfg.Game.Runs) > 0 && charCfg.Game.Runs[0] == "leveling" { levelingPickitPath := getAbsPath(filepath.Join("config", entry.Name(), "pickit_leveling")) + "\\" levelingRules, err := nip.ReadDir(levelingPickitPath) @@ -335,9 +360,10 @@ func Load() error { } charCfg.Runtime.Rules = rules - Characters[entry.Name()] = &charCfg } + + // Validate configs for _, charCfg := range Characters { charCfg.Validate() } diff --git a/internal/context/context.go b/internal/context/context.go index b2014389d..85320f508 100644 --- a/internal/context/context.go +++ b/internal/context/context.go @@ -56,8 +56,8 @@ type Context struct { } type Debug struct { - LastAction string - LastStep string + LastAction string `json:"lastAction"` + LastStep string `json:"lastStep"` } type CurrentGameHelper struct { diff --git a/internal/game/memory_reader.go b/internal/game/memory_reader.go index 24a15c9cb..eae501d75 100644 --- a/internal/game/memory_reader.go +++ b/internal/game/memory_reader.go @@ -152,7 +152,17 @@ func (gd *MemoryReader) GetData() Data { d.Objects = memObjects } - return Data{Data: d, CharacterCfg: *gd.cfg, AreaData: currentArea, Areas: gd.cachedMapData} + var cfgCopy config.CharacterCfg + if gd.cfg != nil { + cfgCopy = *gd.cfg + } + + return Data{ + Data: d, + CharacterCfg: cfgCopy, + AreaData: currentArea, + Areas: gd.cachedMapData, + } } func (gd *MemoryReader) getMapSeed(playerUnit uintptr) (uint, error) { diff --git a/internal/server/assets/css/dashboard.css b/internal/server/assets/css/dashboard.css index d661223a2..ecedf48ed 100644 --- a/internal/server/assets/css/dashboard.css +++ b/internal/server/assets/css/dashboard.css @@ -512,4 +512,17 @@ stat-value { @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } +} + +.rotate { + animation: rotation 1s infinite linear; +} + +@keyframes rotation { + from { + transform: rotate(0deg); + } + to { + transform: rotate(359deg); + } } \ No newline at end of file diff --git a/internal/server/assets/js/dashboard.js b/internal/server/assets/js/dashboard.js index b3587b8c8..b1d0845fb 100644 --- a/internal/server/assets/js/dashboard.js +++ b/internal/server/assets/js/dashboard.js @@ -619,6 +619,28 @@ function updateButtons(startPauseBtn, stopBtn, attachBtn, status) { } } + async function reloadConfig() { + const btn = document.getElementById('reloadConfigBtn'); + const icon = btn.querySelector('i'); + + // Disable button and start rotation + btn.disabled = true; + icon.classList.add('rotate'); + + try { + const response = await fetch('/api/reload-config'); + if (!response.ok) { + throw new Error('Failed to reload config'); + } + } catch (error) { + console.error('Error reloading config:', error); + } finally { + // Re-enable button and stop rotation + btn.disabled = false; + icon.classList.remove('rotate'); + } + } + function closeAttachPopup() { const popup = document.querySelector('.attach-popup'); if (popup) { diff --git a/internal/server/http_server.go b/internal/server/http_server.go index dfc862e8f..d172eaa32 100644 --- a/internal/server/http_server.go +++ b/internal/server/http_server.go @@ -417,8 +417,9 @@ func (s *HttpServer) Listen(port int) error { http.HandleFunc("/drops", s.drops) http.HandleFunc("/process-list", s.getProcessList) http.HandleFunc("/attach-process", s.attachProcess) - http.HandleFunc("/ws", s.wsServer.HandleWebSocket) // Web socket - http.HandleFunc("/initial-data", s.initialData) // Web socket data + http.HandleFunc("/ws", s.wsServer.HandleWebSocket) // Web socket + http.HandleFunc("/initial-data", s.initialData) // Web socket data + http.HandleFunc("/api/reload-config", s.reloadConfig) // New handler assets, _ := fs.Sub(assetsFS, "assets") http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.FS(assets)))) @@ -434,6 +435,17 @@ func (s *HttpServer) Listen(port int) error { return nil } +func (s *HttpServer) reloadConfig(w http.ResponseWriter, r *http.Request) { + result := s.manager.ReloadConfig() + if result != nil { + http.Error(w, result.Error(), http.StatusInternalServerError) + return + } + + s.logger.Info("Config reloaded") + w.WriteHeader(http.StatusOK) +} + func (s *HttpServer) Stop() error { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() @@ -627,6 +639,7 @@ func (s *HttpServer) config(w http.ResponseWriter, r *http.Request) { newConfig.FirstRun = false // Disable the welcome assistant newConfig.D2RPath = r.Form.Get("d2rpath") newConfig.D2LoDPath = r.Form.Get("d2lodpath") + newConfig.CentralizedPickitPath = r.Form.Get("centralized_pickit_path") newConfig.UseCustomSettings = r.Form.Get("use_custom_settings") == "true" newConfig.GameWindowArrangement = r.Form.Get("game_window_arrangement") == "true" // Debug @@ -838,13 +851,14 @@ func (s *HttpServer) characterSettings(w http.ResponseWriter, r *http.Request) { // Game cfg.Game.CreateLobbyGames = r.Form.Has("createLobbyGames") cfg.Game.MinGoldPickupThreshold, _ = strconv.Atoi(r.Form.Get("gameMinGoldPickupThreshold")) + cfg.UseCentralizedPickit = r.Form.Has("useCentralizedPickit") cfg.Game.UseCainIdentify = r.Form.Has("useCainIdentify") cfg.Game.Difficulty = difficulty.Difficulty(r.Form.Get("gameDifficulty")) cfg.Game.RandomizeRuns = r.Form.Has("gameRandomizeRuns") // Runs specific config - enabledRuns := make([]config.Run, 0) + // we don't like errors, so we ignore them json.Unmarshal([]byte(r.FormValue("gameRuns")), &enabledRuns) cfg.Game.Runs = enabledRuns diff --git a/internal/server/templates/character_settings.gohtml b/internal/server/templates/character_settings.gohtml index 2355e8c36..a2fcbe724 100644 --- a/internal/server/templates/character_settings.gohtml +++ b/internal/server/templates/character_settings.gohtml @@ -141,8 +141,8 @@
    + +
    Class-Specific Settings
    - + - + - +
    @@ -186,6 +186,10 @@ Close the mini panel at game start (Legacy Graphics) +

    Battle.net settings


    @@ -234,7 +238,7 @@ - +

    Scheduler



    @@ -341,10 +345,10 @@ {{ range $rowIndex, $row := .Config.Inventory.InventoryLock }} {{ range $columnIndex, $unlocked := $row }} - - - + + + {{ end }} {{ end }} @@ -375,10 +379,10 @@ -

    Run Settings


    @@ -392,7 +396,7 @@
    -
    Enabled Runs:
    +
    Enabled Runs:
    - +
    From 015e6079bafc83e4e5761fcfb1c32af05962468d Mon Sep 17 00:00:00 2001 From: Sam Doidge Date: Mon, 17 Feb 2025 11:59:18 +0000 Subject: [PATCH 530/548] Doc Readme typo (#672) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a79b0a3dd..a9b626ae3 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ --- -Koolo is a small bot for Diablo II: Resurrected (Expension). Koolo project was built for informational and educational purposes +Koolo is a small bot for Diablo II: Resurrected (Expansion). Koolo project was built for informational and educational purposes only, it's not intended for online usage. Feel free to contribute opening pull requests with new features or bugfixes. Koolo reads game memory and interacts with the game injecting clicks/keystrokes to the game window. As good as it can. From 8ff92661316d3b6924638b3579ba50e8c6c95ac4 Mon Sep 17 00:00:00 2001 From: braccali1 <92634889+braccali1@users.noreply.github.com> Date: Fri, 21 Feb 2025 11:10:39 -0500 Subject: [PATCH 531/548] Item Pickup Improvements (#666) Co-authored-by: Arto Simonyan --- internal/action/item_pickup.go | 47 +++++++++++++++++++++----- internal/action/step/pickup_item.go | 52 ++++++++++++++++++++--------- internal/event/events.go | 12 +++++++ 3 files changed, 88 insertions(+), 23 deletions(-) diff --git a/internal/action/item_pickup.go b/internal/action/item_pickup.go index 0b41f89f5..ce70657c1 100644 --- a/internal/action/item_pickup.go +++ b/internal/action/item_pickup.go @@ -5,7 +5,6 @@ import ( "fmt" "log/slog" "slices" - "time" "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" @@ -14,6 +13,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/nip" "github.com/hectorgimenez/koolo/internal/action/step" "github.com/hectorgimenez/koolo/internal/context" + "github.com/hectorgimenez/koolo/internal/event" ) func itemFitsInventory(i data.Item) bool { @@ -47,9 +47,12 @@ func ItemPickup(maxDistance int) error { ctx := context.Get() ctx.SetLastAction("ItemPickup") - const maxRetries = 3 + const maxRetries = 5 + const maxItemTooFarAttempts = 5 for { + ctx.PauseIfNotPriority() + itemsToPickup := GetItemsToPickup(maxDistance) if len(itemsToPickup) == 0 { return nil @@ -81,12 +84,14 @@ func ItemPickup(maxDistance int) error { // Try to pick up the item with retries var lastError error attempt := 1 + attemptItemTooFar := 1 for attempt <= maxRetries { // Clear monsters on each attempt ClearAreaAroundPosition(itemToPickup.Position, 4, data.MonsterAnyFilter()) // Calculate position to move to based on attempt number // on 2nd and 3rd attempt try position left/right of item + // on 4th and 5th attempt try position further away pickupPosition := itemToPickup.Position moveDistance := 3 if attempt > 1 { @@ -101,6 +106,13 @@ func ItemPickup(maxDistance int) error { X: itemToPickup.Position.X - moveDistance, Y: itemToPickup.Position.Y + 1, } + case 4: + pickupPosition = data.Position{ + X: itemToPickup.Position.X + moveDistance + 2, + Y: itemToPickup.Position.Y - 3, + } + case 5: + MoveToCoords(ctx.PathFinder.BeyondPosition(ctx.Data.PlayerUnit.Position, itemToPickup.Position, 4)) } } @@ -119,19 +131,34 @@ func ItemPickup(maxDistance int) error { } // Try to pick up the item - err := step.PickupItem(itemToPickup) + err := step.PickupItem(itemToPickup, attempt) if err == nil { break // Success! } lastError = err + // Skip logging when casting moving error and don't count these specific errors as retry attempts + if errors.Is(err, step.ErrCastingMoving) { + continue + } ctx.Logger.Debug(fmt.Sprintf("Pickup attempt %d failed: %v", attempt, err)) // Don't count these specific errors as retry attempts - if errors.Is(err, step.ErrMonsterAroundItem) || errors.Is(err, step.ErrItemTooFar) { + if errors.Is(err, step.ErrMonsterAroundItem) { continue } + // Item too far retry logic + if errors.Is(err, step.ErrItemTooFar) { + // Use default retries first, if we hit last attempt retry add random movement and continue until maxItemTooFarAttempts + if attempt >= maxRetries && attemptItemTooFar <= maxItemTooFarAttempts { + ctx.Logger.Debug(fmt.Sprintf("Item too far pickup attempt %d", attemptItemTooFar)) + attemptItemTooFar++ + ctx.PathFinder.RandomMovement() + continue + } + } + if errors.Is(err, step.ErrNoLOSToItem) { ctx.Logger.Debug("No line of sight to item, moving closer", slog.String("item", itemToPickup.Desc().Name)) @@ -139,7 +166,7 @@ func ItemPickup(maxDistance int) error { // Try moving beyond the item for better line of sight beyondPos := ctx.PathFinder.BeyondPosition(ctx.Data.PlayerUnit.Position, itemToPickup.Position, 2+attempt) if mvErr := MoveToCoords(beyondPos); mvErr == nil { - err = step.PickupItem(itemToPickup) + err = step.PickupItem(itemToPickup, attempt) if err == nil { break } @@ -151,14 +178,18 @@ func ItemPickup(maxDistance int) error { attempt++ - if attempt <= maxRetries { - time.Sleep(150 * time.Duration(attempt-1) * time.Millisecond) - } } // If all attempts failed, blacklist the item if attempt > maxRetries && lastError != nil { ctx.CurrentGame.BlacklistedItems = append(ctx.CurrentGame.BlacklistedItems, itemToPickup) + + // Screenshot with show items on + ctx.HID.KeyDown(ctx.Data.KeyBindings.ShowItems) + screenshot := ctx.GameReader.Screenshot() + event.Send(event.ItemBlackListed(event.WithScreenshot(ctx.Name, fmt.Sprintf("Item %s [%s] BlackListed in Area:%s", itemToPickup.Name, itemToPickup.Quality.ToString(), ctx.Data.PlayerUnit.Area.Area().Name), screenshot), data.Drop{Item: itemToPickup})) + ctx.HID.KeyUp(ctx.Data.KeyBindings.ShowItems) + ctx.Logger.Warn( "Failed picking up item after all attempts, blacklisting it", slog.String("itemName", itemToPickup.Desc().Name), diff --git a/internal/action/step/pickup_item.go b/internal/action/step/pickup_item.go index 3b5f5e319..8471d83a6 100644 --- a/internal/action/step/pickup_item.go +++ b/internal/action/step/pickup_item.go @@ -7,6 +7,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/item" + "github.com/hectorgimenez/d2go/pkg/data/mode" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/koolo/internal/context" "github.com/hectorgimenez/koolo/internal/game" @@ -15,25 +16,45 @@ import ( ) const ( - maxInteractions = 45 - spiralDelay = 50 * time.Millisecond - clickDelay = 25 * time.Millisecond - pickupTimeout = 3 * time.Second + clickDelay = 25 * time.Millisecond + spiralDelay = 25 * time.Millisecond + pickupTimeout = 3 * time.Second ) var ( + maxInteractions = 24 // 25 attempts since we start at 0 ErrItemTooFar = errors.New("item is too far away") ErrNoLOSToItem = errors.New("no line of sight to item") ErrMonsterAroundItem = errors.New("monsters detected around item") + ErrCastingMoving = errors.New("char casting or moving") ) -func PickupItem(it data.Item) error { +func PickupItem(it data.Item, itemPickupAttempt int) error { ctx := context.Get() ctx.SetLastStep("PickupItem") + // Casting skill/moving return back + for ctx.Data.PlayerUnit.Mode == mode.CastingSkill || ctx.Data.PlayerUnit.Mode == mode.Running || ctx.Data.PlayerUnit.Mode == mode.Walking || ctx.Data.PlayerUnit.Mode == mode.WalkingInTown { + time.Sleep(25 * time.Millisecond) + return ErrCastingMoving + } + // Calculate base screen position for item baseX := it.Position.X - 1 baseY := it.Position.Y - 1 + switch itemPickupAttempt { + case 3: + baseX = baseX + 1 + case 4: + maxInteractions = 44 + baseY = baseY + 1 + case 5: + maxInteractions = 44 + baseX = baseX - 1 + baseY = baseY - 1 + default: + maxInteractions = 24 + } baseScreenX, baseScreenY := ctx.PathFinder.GameCoordsToScreenCords(baseX, baseY) // Check for monsters first @@ -59,7 +80,7 @@ func PickupItem(it data.Item) error { spiralAttempt := 0 targetItem := it lastMonsterCheck := time.Now() - const monsterCheckInterval = 250 * time.Millisecond + const monsterCheckInterval = 150 * time.Millisecond startTime := time.Now() @@ -78,15 +99,18 @@ func PickupItem(it data.Item) error { // Check if item still exists currentItem, exists := findItemOnGround(targetItem.UnitID) if !exists { - ctx.Logger.Info(fmt.Sprintf("Picked up: %s [%s]", targetItem.Desc().Name, targetItem.Quality.ToString())) + + ctx.Logger.Info(fmt.Sprintf("Picked up: %s [%s] | Item Pickup Attempt:%d | Spiral Attempt:%d", targetItem.Desc().Name, targetItem.Quality.ToString(), itemPickupAttempt, spiralAttempt)) + ctx.CurrentGame.PickedUpItems[int(targetItem.UnitID)] = int(ctx.Data.PlayerUnit.Area.Area().ID) + return nil // Success! } // Check timeout conditions if spiralAttempt > maxInteractions || (!waitingForInteraction.IsZero() && time.Since(waitingForInteraction) > pickupTimeout) || - time.Since(startTime) > pickupTimeout*2 { + time.Since(startTime) > pickupTimeout { return fmt.Errorf("failed to pick up %s after %d attempts", it.Desc().Name, spiralAttempt) } @@ -98,10 +122,8 @@ func PickupItem(it data.Item) error { ctx.HID.MovePointer(cursorX, cursorY) time.Sleep(spiralDelay) - // Refresh game state and check hover - ctx.RefreshGameData() - - if currentItem.IsHovered { + // Click on item if mouse is hovering over + if currentItem.UnitID == ctx.GameReader.GameReader.GetData().HoverData.UnitID { ctx.HID.Click(game.LeftButton, cursorX, cursorY) time.Sleep(clickDelay) @@ -113,7 +135,7 @@ func PickupItem(it data.Item) error { // Sometimes we got stuck because mouse is hovering a chest and item is in behind, it usually happens a lot // on Andariel, so we open it - if isChestHovered() { + if isChestorShrineHovered() { ctx.HID.Click(game.LeftButton, cursorX, cursorY) time.Sleep(50 * time.Millisecond) } @@ -143,11 +165,11 @@ func findItemOnGround(targetID data.UnitID) (data.Item, bool) { return data.Item{}, false } -func isChestHovered() bool { +func isChestorShrineHovered() bool { ctx := context.Get() for _, o := range ctx.Data.Objects { - if o.IsChest() && o.IsHovered { + if (o.IsChest() || o.IsShrine()) && o.IsHovered { return true } } diff --git a/internal/event/events.go b/internal/event/events.go index c6177b0ec..991e4cc3c 100644 --- a/internal/event/events.go +++ b/internal/event/events.go @@ -87,6 +87,18 @@ type RunStartedEvent struct { RunName string } +type ItemBlackListedEvent struct { + BaseEvent + Item data.Drop +} + +func ItemBlackListed(be BaseEvent, drop data.Drop) ItemBlackListedEvent { + return ItemBlackListedEvent{ + BaseEvent: be, + Item: drop, + } +} + func RunStarted(be BaseEvent, runName string) RunStartedEvent { return RunStartedEvent{ BaseEvent: be, From 523a6a0a211435284da0f2a6a747dfce8b3c20e4 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Fri, 21 Feb 2025 18:23:15 +0200 Subject: [PATCH 532/548] Fixes and stuff (#689) --- go.mod | 2 +- go.sum | 4 ++ internal/action/repair.go | 99 ++++++++++++++++---------- internal/bot/bot.go | 2 +- internal/run/terror_zone.go | 5 +- internal/server/http_server.go | 2 + internal/server/templates/drops.gohtml | 60 +++++++++------- 7 files changed, 110 insertions(+), 64 deletions(-) diff --git a/go.mod b/go.mod index 79fe37756..72fd9b3e4 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/bwmarrin/discordgo v0.28.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 github.com/gorilla/websocket v1.5.3 - github.com/hectorgimenez/d2go v0.0.0-20250119163231-415ac29ab1ab + github.com/hectorgimenez/d2go v0.0.0-20250221161127-5455fd977276 github.com/inkeliz/gowebview v1.0.1 github.com/lxn/win v0.0.0-20210218163916-a377121e959e github.com/otiai10/copy v1.14.0 diff --git a/go.sum b/go.sum index ad80b61ea..11e61c9f0 100644 --- a/go.sum +++ b/go.sum @@ -25,6 +25,10 @@ github.com/hectorgimenez/d2go v0.0.0-20250106015039-8bce23b03973 h1:dRqPFWAf0yb1 github.com/hectorgimenez/d2go v0.0.0-20250106015039-8bce23b03973/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= github.com/hectorgimenez/d2go v0.0.0-20250119163231-415ac29ab1ab h1:vrZ5hlN1qnUXPHjVRCvSuWyjfauNopuMLU+/YmBge2c= github.com/hectorgimenez/d2go v0.0.0-20250119163231-415ac29ab1ab/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= +github.com/hectorgimenez/d2go v0.0.0-20250219111533-438f80b9113e h1:upmLVX6I3rYRJZXwVJ0ZDv0O0zcSpVLUKeCucbuHjyg= +github.com/hectorgimenez/d2go v0.0.0-20250219111533-438f80b9113e/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= +github.com/hectorgimenez/d2go v0.0.0-20250221161127-5455fd977276 h1:A4LnLo5dsLmUzoDtndegivn5hx2TfiXL/18bepMxW70= +github.com/hectorgimenez/d2go v0.0.0-20250221161127-5455fd977276/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= github.com/inkeliz/gowebview v1.0.1 h1:4gpLE2qt4kV3DB+xHkHKUeLLiGPN5Xw3or9A3hVqYyA= github.com/inkeliz/gowebview v1.0.1/go.mod h1:4SNjXp/fogE11MwvJD67kMBmSObY2BBqinEgH8+8eM8= github.com/inkeliz/w32 v1.0.2 h1:Es8Bmw9ApOY0PVRpGs7wsqIKdK5C3xBkP5TOATfVmtU= diff --git a/internal/action/repair.go b/internal/action/repair.go index 92ced5fda..e5f2671e1 100644 --- a/internal/action/repair.go +++ b/internal/action/repair.go @@ -82,40 +82,67 @@ func Repair() error { } func RepairRequired() bool { - ctx := context.Get() - ctx.SetLastAction("RepairRequired") - - for _, i := range ctx.Data.Inventory.ByLocation(item.LocationEquipped) { - // Skip indestructible items - _, indestructible := i.FindStat(stat.Indestructible, 0) - if i.Ethereal || indestructible { - continue - } - - currentDurability, currentDurabilityFound := i.FindStat(stat.Durability, 0) - maxDurability, maxDurabilityFound := i.FindStat(stat.MaxDurability, 0) - - // If we have both stats, check percentage - if currentDurabilityFound && maxDurabilityFound { - durabilityPercent := int((float64(currentDurability.Value) / float64(maxDurability.Value)) * 100) - if durabilityPercent <= 20 { - return true - } - } - - // If we only have current durability, check absolute value - if currentDurabilityFound { - if currentDurability.Value <= 5 { - return true - } - } - - // Handle case where durability stat is missing but max durability exists - // This likely indicates the item needs repair - if maxDurabilityFound && !currentDurabilityFound { - return true - } - } - - return false + ctx := context.Get() + ctx.SetLastAction("RepairRequired") + + for _, i := range ctx.Data.Inventory.ByLocation(item.LocationEquipped) { + // Skip indestructible items + _, indestructible := i.FindStat(stat.Indestructible, 0) + if i.Ethereal || indestructible { + continue + } + + currentDurability, currentDurabilityFound := i.FindStat(stat.Durability, 0) + maxDurability, maxDurabilityFound := i.FindStat(stat.MaxDurability, 0) + + // If we have both stats, check percentage + if currentDurabilityFound && maxDurabilityFound { + durabilityPercent := int((float64(currentDurability.Value) / float64(maxDurability.Value)) * 100) + if durabilityPercent <= 20 { + return true + } + } + + // If we only have current durability, check absolute value + if currentDurabilityFound { + if currentDurability.Value <= 5 { + return true + } + } + + // Handle case where durability stat is missing but max durability exists + // This likely indicates the item needs repair + if maxDurabilityFound && !currentDurabilityFound { + return true + } + } + + return false +} + +func IsEquipmentBroken() bool { + ctx := context.Get() + ctx.SetLastAction("EquipmentBroken") + + for _, i := range ctx.Data.Inventory.ByLocation(item.LocationEquipped) { + + // Check if the item is ethereal + if i.Ethereal { + continue + } + + // Check if the item is indestructible + _, indestructible := i.FindStat(stat.Indestructible, 0) + if indestructible { + continue + } + + // Check if the item is broken + if i.IsBroken { + ctx.Logger.Debug("Equipment is broken, returning to town", "item", i.Name) + return true + } + } + + return false } diff --git a/internal/bot/bot.go b/internal/bot/bot.go index 985d15ae5..d6547f159 100644 --- a/internal/bot/bot.go +++ b/internal/bot/bot.go @@ -158,7 +158,7 @@ func (b *Bot) Run(ctx context.Context, firstRun bool, runs []run.Run) error { // Check if we need to go back to town (no pots or merc died) if (b.ctx.CharacterCfg.BackToTown.NoHpPotions && !healingPotsFound || - b.ctx.CharacterCfg.BackToTown.EquipmentBroken && action.RepairRequired() || + b.ctx.CharacterCfg.BackToTown.EquipmentBroken && action.IsEquipmentBroken() || b.ctx.CharacterCfg.BackToTown.NoMpPotions && !manaPotsFound || b.ctx.CharacterCfg.BackToTown.MercDied && b.ctx.Data.MercHPPercent() <= 0 && b.ctx.CharacterCfg.Character.UseMerc) && !b.ctx.Data.PlayerUnit.Area.IsTown() { diff --git a/internal/run/terror_zone.go b/internal/run/terror_zone.go index c1e6f11c5..f9249c5dc 100644 --- a/internal/run/terror_zone.go +++ b/internal/run/terror_zone.go @@ -30,12 +30,13 @@ func (tz TerrorZone) Name() string { } func (tz TerrorZone) Run() error { + availableTzs := tz.AvailableTZs() if len(availableTzs) == 0 { return nil } - switch tz.ctx.Data.TerrorZones[0] { + switch availableTzs[0] { case area.PitLevel1: return NewPit().Run() case area.Tristram: @@ -102,6 +103,7 @@ func (tz TerrorZone) Run() error { } func (tz TerrorZone) AvailableTZs() []area.ID { + tz.ctx.RefreshGameData() var availableTZs []area.ID for _, tzone := range tz.ctx.Data.TerrorZones { for _, tzArea := range tz.ctx.CharacterCfg.Game.TerrorZone.Areas { @@ -177,6 +179,7 @@ func (tz TerrorZone) tzAreaGroups(firstTZ area.ID) [][]area.ID { } func (tz TerrorZone) customTZEnemyFilter() data.MonsterFilter { + return func(m data.Monsters) []data.Monster { var filteredMonsters []data.Monster monsterFilter := data.MonsterAnyFilter() diff --git a/internal/server/http_server.go b/internal/server/http_server.go index 765e7b33e..7ec51428e 100644 --- a/internal/server/http_server.go +++ b/internal/server/http_server.go @@ -357,6 +357,8 @@ func qualityClass(quality string) string { return "rare-quality" case "Unique": return "unique-quality" + case "Crafted": + return "crafted-quality" default: return "unknown-quality" } diff --git a/internal/server/templates/drops.gohtml b/internal/server/templates/drops.gohtml index 7b847f66b..4466c29a9 100644 --- a/internal/server/templates/drops.gohtml +++ b/internal/server/templates/drops.gohtml @@ -15,6 +15,7 @@ .set-quality { color: #10B981; } .rare-quality { color: #FBBF24; } .unique-quality { color: #bfa969; } + .crafted-quality { color: #FFA500; } .unknown-quality { color: #000000; } /* Drop location style */ @@ -258,7 +259,11 @@
    - {{ .Item.Name }} + {{ if .Item.IdentifiedName }} + {{ .Item.IdentifiedName }} + {{ else }} + {{ .Item.Name }} + {{ end }}
    @@ -268,38 +273,43 @@
    Unidentified
    {{ else }} - - {{ range .Item.Stats }} - {{ if eq .ID 31 }} -
    - Defense: {{ .Value }} -
    + +
    + {{ range .Item.Stats }} + {{ if eq .ID 31 }} +
    Defense: {{ .Value }}
    + {{ end }} {{ end }} - {{ end }} - - - {{ $currentDur := 0 }} - {{ $maxDur := 0 }} - {{ range .Item.Stats }} - {{ if eq .ID 72 }} - {{ $currentDur = .Value }} + + {{ $currentDur := 0 }} + {{ $maxDur := 0 }} + {{ range .Item.Stats }} + {{ if eq .ID 72 }} + {{ $currentDur = .Value }} + {{ end }} + {{ if eq .ID 73 }} + {{ $maxDur = .Value }} + {{ end }} {{ end }} - {{ if eq .ID 73 }} - {{ $maxDur = .Value }} + {{ if and (ne $currentDur 0) (ne $maxDur 0) }} +
    Durability: {{ $currentDur }} of {{ $maxDur }}
    {{ end }} - {{ end }} - {{ if and (ne $currentDur 0) (ne $maxDur 0) }} -
    - Durability: {{ $currentDur }} of {{ $maxDur }} -
    - {{ end }} +
    - + + {{ range .Item.Stats }} + {{ if eq .ID 92 }} + {{ if ne .Value 0 }} +
    {{ .String }}
    + {{ end }} + {{ end }} + {{ end }} + {{ range .Item.Stats }} - {{ if and (ne .ID 31) (ne .ID 72) (ne .ID 73)}} + {{ if and (ne .ID 31) (ne .ID 72) (ne .ID 73) (ne .ID 21) (ne .ID 22) (ne .ID 23) (ne .ID 24) (ne .ID 68) (ne .ID 92) }}
    {{ .String }}
    {{ end }} {{ end }} From b63d7a3eba2ac6e92edc022c676b744ab3506fda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Gim=C3=A9nez?= Date: Thu, 27 Feb 2025 17:50:15 +0900 Subject: [PATCH 533/548] Wait until fcr/walk time is finished (#701) --- internal/action/step/move.go | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/internal/action/step/move.go b/internal/action/step/move.go index cd64c20fa..1f665a594 100644 --- a/internal/action/step/move.go +++ b/internal/action/step/move.go @@ -73,6 +73,19 @@ func MoveTo(dest data.Position, options ...MoveOption) error { // is needed to prevent bot teleporting in circle when it reached destination (lower end cpu) cost is minimal. ctx.RefreshGameData() + // Add some delay between clicks to let the character move to destination + walkDuration := utils.RandomDurationMs(600, 1200) + if !ctx.Data.CanTeleport() && time.Since(lastRun) < walkDuration { + time.Sleep(walkDuration - time.Since(lastRun)) + continue + } + + // We skip the movement if we can teleport and the last movement time was less than the player cast duration + if ctx.Data.CanTeleport() && time.Since(lastRun) < ctx.Data.PlayerCastDuration() { + time.Sleep(ctx.Data.PlayerCastDuration() - time.Since(lastRun)) + continue + } + // Check for idle state outside town if ctx.Data.PlayerUnit.Mode == mode.StandingOutsideTown { if idleStartTime.IsZero() { @@ -116,17 +129,6 @@ func MoveTo(dest data.Position, options ...MoveOption) error { return nil } - // Add some delay between clicks to let the character move to destination - walkDuration := utils.RandomDurationMs(600, 1200) - if !ctx.Data.CanTeleport() && time.Since(lastRun) < walkDuration { - continue - } - - // We skip the movement if we can teleport and the last movement time was less than the player cast duration - if ctx.Data.CanTeleport() && time.Since(lastRun) < ctx.Data.PlayerCastDuration() { - continue - } - lastRun = time.Now() // If we are stuck in the same position, make a random movement and cross fingers From 734122f96c352d07ce333520efdc2a36b9ad07e0 Mon Sep 17 00:00:00 2001 From: elb <51070858+elobo91@users.noreply.github.com> Date: Thu, 27 Feb 2025 04:09:37 -0500 Subject: [PATCH 534/548] Fix anti-idle triggering when teleporting (#711) --- internal/action/step/move.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/internal/action/step/move.go b/internal/action/step/move.go index 1f665a594..538e1c65d 100644 --- a/internal/action/step/move.go +++ b/internal/action/step/move.go @@ -86,8 +86,8 @@ func MoveTo(dest data.Position, options ...MoveOption) error { continue } - // Check for idle state outside town - if ctx.Data.PlayerUnit.Mode == mode.StandingOutsideTown { + // Check for idle state + if ctx.Data.PlayerUnit.Position == previousPosition { if idleStartTime.IsZero() { idleStartTime = time.Now() } else if time.Since(idleStartTime) > idleThreshold { @@ -98,7 +98,8 @@ func MoveTo(dest data.Position, options ...MoveOption) error { continue } } else { - idleStartTime = time.Time{} // Reset idle timer if not in StandingOutsideTown mode + idleStartTime = time.Time{} // Reset idle timer if position changed + previousPosition = ctx.Data.PlayerUnit.Position } // Press the Teleport keybinding if it's available, otherwise use vigor (if available) @@ -131,12 +132,6 @@ func MoveTo(dest data.Position, options ...MoveOption) error { lastRun = time.Now() - // If we are stuck in the same position, make a random movement and cross fingers - if previousPosition == ctx.Data.PlayerUnit.Position && !ctx.Data.CanTeleport() { - ctx.PathFinder.RandomMovement() - continue - } - // This is a workaround to avoid the character to get stuck in the same position when the hitbox of the destination is too big if distance < 20 && math.Abs(float64(previousDistance-distance)) < DistanceToFinishMoving { minDistanceToFinishMoving += DistanceToFinishMoving From 6ab0cd2769d757c2a8475fd1af7c1252a59cd8d8 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Thu, 27 Feb 2025 17:10:04 +0200 Subject: [PATCH 535/548] More CPU Improvements and Faster TPs (#712) --- go.mod | 2 +- go.sum | 2 ++ internal/game/data.go | 42 +++++++++++++++++++++--------------------- 3 files changed, 24 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index 72fd9b3e4..5c0d2fe41 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/bwmarrin/discordgo v0.28.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 github.com/gorilla/websocket v1.5.3 - github.com/hectorgimenez/d2go v0.0.0-20250221161127-5455fd977276 + github.com/hectorgimenez/d2go v0.0.0-20250227150416-4204d68f233f github.com/inkeliz/gowebview v1.0.1 github.com/lxn/win v0.0.0-20210218163916-a377121e959e github.com/otiai10/copy v1.14.0 diff --git a/go.sum b/go.sum index 11e61c9f0..5300e6b90 100644 --- a/go.sum +++ b/go.sum @@ -29,6 +29,8 @@ github.com/hectorgimenez/d2go v0.0.0-20250219111533-438f80b9113e h1:upmLVX6I3rYR github.com/hectorgimenez/d2go v0.0.0-20250219111533-438f80b9113e/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= github.com/hectorgimenez/d2go v0.0.0-20250221161127-5455fd977276 h1:A4LnLo5dsLmUzoDtndegivn5hx2TfiXL/18bepMxW70= github.com/hectorgimenez/d2go v0.0.0-20250221161127-5455fd977276/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= +github.com/hectorgimenez/d2go v0.0.0-20250227150416-4204d68f233f h1:Qp4gJANcIkJJdnImJ9G1LRLqZh0gXnONm9awBEMEjPk= +github.com/hectorgimenez/d2go v0.0.0-20250227150416-4204d68f233f/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= github.com/inkeliz/gowebview v1.0.1 h1:4gpLE2qt4kV3DB+xHkHKUeLLiGPN5Xw3or9A3hVqYyA= github.com/inkeliz/gowebview v1.0.1/go.mod h1:4SNjXp/fogE11MwvJD67kMBmSObY2BBqinEgH8+8eM8= github.com/inkeliz/w32 v1.0.2 h1:Es8Bmw9ApOY0PVRpGs7wsqIKdK5C3xBkP5TOATfVmtU= diff --git a/internal/game/data.go b/internal/game/data.go index 8ca50c3de..721ce877c 100644 --- a/internal/game/data.go +++ b/internal/game/data.go @@ -18,31 +18,31 @@ type Data struct { } func (d Data) CanTeleport() bool { - if !d.CharacterCfg.Character.UseTeleport { - return false - } -// In Duriel Lair we can teleport only in boss room -// Only enable Teleport in largest room where is Duriel - if d.PlayerUnit.Area == area.DurielsLair { - if len(d.AreaData.Rooms) > 0 { - bossRoom := d.AreaData.Rooms[0] - for _, room := range d.AreaData.Rooms { - if (room.Width * room.Height) > (bossRoom.Width * bossRoom.Height) { - bossRoom = room - } - } - return bossRoom.IsInside(d.PlayerUnit.Position) - } - return false - } - - _, isTpBound := d.KeyBindings.KeyBindingForSkill(skill.Teleport) - return isTpBound && !d.PlayerUnit.Area.IsTown() + if !d.CharacterCfg.Character.UseTeleport { + return false + } + // In Duriel Lair we can teleport only in boss room + // Only enable Teleport in largest room where is Duriel + if d.PlayerUnit.Area == area.DurielsLair { + if len(d.AreaData.Rooms) > 0 { + bossRoom := d.AreaData.Rooms[0] + for _, room := range d.AreaData.Rooms { + if (room.Width * room.Height) > (bossRoom.Width * bossRoom.Height) { + bossRoom = room + } + } + return bossRoom.IsInside(d.PlayerUnit.Position) + } + return false + } + + _, isTpBound := d.KeyBindings.KeyBindingForSkill(skill.Teleport) + return isTpBound && !d.PlayerUnit.Area.IsTown() } func (d Data) PlayerCastDuration() time.Duration { secs := float64(d.PlayerUnit.CastingFrames())*0.04 + 0.01 - secs = math.Max(0.40, secs) + secs = math.Max(0.30, secs) return time.Duration(secs*1000) * time.Millisecond } From 0a6820f95a35bd754c0ce593e287b79d36b25ac4 Mon Sep 17 00:00:00 2001 From: jasorello Date: Sat, 1 Mar 2025 09:27:34 -0500 Subject: [PATCH 536/548] Bugfix: UI crashes on first time setup because of validation error in scheduler (#706) --- config/template/config.yaml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/config/template/config.yaml b/config/template/config.yaml index 823782b0e..14fef4883 100644 --- a/config/template/config.yaml +++ b/config/template/config.yaml @@ -13,6 +13,24 @@ closeMiniPanel: false # Set to true to close the mini panel at start of game in hidePortraits: true # Set to true to hide mercenary and other players portraits (avatar) enableCubeRecipes: true # Enable cubing of flawlesses and tokens +scheduler: + enabled: false + days: + - dayOfWeek: 0 + timeRange: [] + - dayOfWeek: 1 + timeRange: [] + - dayOfWeek: 2 + timeRange: [] + - dayOfWeek: 3 + timeRange: [] + - dayOfWeek: 4 + timeRange: [] + - dayOfWeek: 5 + timeRange: [] + - dayOfWeek: 6 + timeRange: [] + health: # Healing configuration, all values in % healingPotionAt: 75 manaPotionAt: 10 From 8ef98c58b7210fbddbe43b0fdb39a387242eb809 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Mon, 10 Mar 2025 16:26:04 +0200 Subject: [PATCH 537/548] Fix bliz sorc boss killing (#727) --- internal/character/blizzard_sorceress.go | 30 +++++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/internal/character/blizzard_sorceress.go b/internal/character/blizzard_sorceress.go index 027d15435..5da82e056 100644 --- a/internal/character/blizzard_sorceress.go +++ b/internal/character/blizzard_sorceress.go @@ -120,13 +120,25 @@ func (s BlizzardSorceress) killMonster(npc npc.ID, t data.MonsterType) error { } func (s BlizzardSorceress) killMonsterByName(id npc.ID, monsterType data.MonsterType, skipOnImmunities []stat.Resist) error { - return s.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { - if m, found := d.Monsters.FindOne(id, monsterType); found { - return m.UnitID, true - } + // while the monster is alive, keep attacking it + for { + if m, found := s.Data.Monsters.FindOne(id, monsterType); found { + if m.Stats[stat.Life] <= 0 { + break + } - return 0, false - }, skipOnImmunities) + s.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { + if m, found := d.Monsters.FindOne(id, monsterType); found { + return m.UnitID, true + } + + return 0, false + }, skipOnImmunities) + } else { + break + } + } + return nil } func (s BlizzardSorceress) BuffSkills() []skill.ID { @@ -199,7 +211,7 @@ func (s BlizzardSorceress) KillIzual() error { m, _ := s.Data.Monsters.FindOne(npc.Izual, data.MonsterTypeUnique) _ = step.SecondaryAttack(skill.StaticField, m.UnitID, 4, step.Distance(5, 8)) - return s.killMonster(npc.Izual, data.MonsterTypeUnique) + return s.killMonsterByName(npc.Izual, data.MonsterTypeUnique, nil) } func (s BlizzardSorceress) KillDiablo() error { @@ -230,7 +242,7 @@ func (s BlizzardSorceress) KillDiablo() error { _ = step.SecondaryAttack(skill.StaticField, diablo.UnitID, 5, step.Distance(3, 8)) - return s.killMonster(npc.Diablo, data.MonsterTypeUnique) + return s.killMonsterByName(npc.Diablo, data.MonsterTypeUnique, nil) } } @@ -246,5 +258,5 @@ func (s BlizzardSorceress) KillBaal() error { m, _ := s.Data.Monsters.FindOne(npc.BaalCrab, data.MonsterTypeUnique) step.SecondaryAttack(skill.StaticField, m.UnitID, 4, step.Distance(5, 8)) - return s.killMonster(npc.BaalCrab, data.MonsterTypeUnique) + return s.killMonsterByName(npc.BaalCrab, data.MonsterTypeUnique, nil) } From 51d5d38c5abc159e4b913e2997cc41d42e0ce950 Mon Sep 17 00:00:00 2001 From: xVoidByte Date: Wed, 12 Mar 2025 14:11:26 +0200 Subject: [PATCH 538/548] Potential fix for losing Magefist/gloves/weapon. (#728) --- internal/action/horadric_cube.go | 34 ++++++++++++++++++++++++++++++-- internal/action/stash.go | 29 +++++++++++++++++++++------ 2 files changed, 55 insertions(+), 8 deletions(-) diff --git a/internal/action/horadric_cube.go b/internal/action/horadric_cube.go index c280c6ece..77a9039a3 100644 --- a/internal/action/horadric_cube.go +++ b/internal/action/horadric_cube.go @@ -22,10 +22,20 @@ func CubeAddItems(items ...data.Item) error { // Ensure stash is open if !ctx.Data.OpenMenus.Stash { - bank, _ := ctx.Data.Objects.FindOne(object.Bank) + + utils.Sleep(300) + bank, found := ctx.Data.Objects.FindOne(object.Bank) + if !found { + return fmt.Errorf("stash not found") + } + + // Clear any popups first + ClearMessages() + err := InteractObject(bank, func() bool { return ctx.Data.OpenMenus.Stash }) + if err != nil { return err } @@ -36,6 +46,21 @@ func CubeAddItems(items ...data.Item) error { // If items are on the Stash, pickup them to the inventory for _, itm := range items { + + ctx.Logger.Info("Processing item", + slog.String("Name", string(itm.Name)), + slog.String("Location", fmt.Sprintf("%v", itm.Location.LocationType)), + ) + + // Add check to skip equipped items + if itm.Location.LocationType == item.LocationEquipped { + ctx.Logger.Warn("Skipping equipped item", + slog.String("Item", string(itm.Name)), + slog.Any("Location", itm.Location), + ) + continue + } + nwIt := itm if nwIt.Location.LocationType != item.LocationStash && nwIt.Location.LocationType != item.LocationSharedStash { continue @@ -152,8 +177,13 @@ func ensureCubeIsOpen() error { ctx := context.Get() ctx.Logger.Debug("Opening Horadric Cube...") + // Force a refresh to sync menu states + ctx.RefreshGameData() + if ctx.Data.OpenMenus.Cube { - ctx.Logger.Debug("Horadric Cube window already open") + ctx.Logger.Info("Horadric Cube window already open, moving cursor to avoid Gloves/Weapon loss") + // Move cursor to the center-right of the screen to avoid Magefist/Weapon loss + ctx.HID.MovePointer(1245, 355) // X=1245, Y=355 (center | right side) return nil } diff --git a/internal/action/stash.go b/internal/action/stash.go index 4a1eff294..3b1c33cbb 100644 --- a/internal/action/stash.go +++ b/internal/action/stash.go @@ -382,13 +382,30 @@ func OpenStash() error { if !found { return errors.New("stash not found") } - InteractObject(bank, - func() bool { - return ctx.Data.OpenMenus.Stash - }, - ) - return nil + // Clear any UI popups first + ClearMessages() + + // Open the stash + err := InteractObject(bank, func() bool { + return ctx.Data.OpenMenus.Stash + }) + if err != nil { + return err + } + + // Force a refresh to ensure menu state is updated + ctx.RefreshGameData() + utils.Sleep(300) // Short delay for menu rendering + + if ctx.Data.OpenMenus.Stash { + // Move cursor to the center-right of the screen to avoid Magefist/Weapon loss + ctx.HID.MovePointer(1245, 355) // X=1245, Y=355 (center | right side) + ctx.Logger.Info("Stash opened - cursor moved to safe position") + return nil + } + + return errors.New("stash window not detected after interaction") } func CloseStash() error { From b6539c2c324084e35495a375db1c362a5dc35606 Mon Sep 17 00:00:00 2001 From: elb <51070858+elobo91@users.noreply.github.com> Date: Sat, 15 Mar 2025 09:32:37 -0400 Subject: [PATCH 539/548] Optimization: Revert LoS door check, ClearAreaAroundPosition (#704) --- internal/action/clear_area.go | 35 ++++++++--------------------------- internal/pather/utils.go | 33 +-------------------------------- internal/run/baal.go | 35 ++++++----------------------------- internal/run/diablo.go | 8 +++++++- 4 files changed, 22 insertions(+), 89 deletions(-) diff --git a/internal/action/clear_area.go b/internal/action/clear_area.go index 903938133..4596f4b6f 100644 --- a/internal/action/clear_area.go +++ b/internal/action/clear_area.go @@ -18,37 +18,18 @@ func ClearAreaAroundPosition(pos data.Position, radius int, filter data.MonsterF ctx := context.Get() ctx.SetLastAction("ClearAreaAroundPosition") - for { - ctx.PauseIfNotPriority() - - // Check for closest monster within radius - monsters are already sorted by distance - err := ctx.Char.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { - for _, m := range d.Monsters.Enemies(filter) { - dist := pather.DistanceFromPoint(pos, m.Position) - if ctx.Data.AreaData.IsWalkable(m.Position) && dist <= radius { - return m.UnitID, true - } + return ctx.Char.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { + for _, m := range d.Monsters.Enemies(filter) { + distanceToTarget := pather.DistanceFromPoint(pos, m.Position) + if ctx.Data.AreaData.IsWalkable(m.Position) && distanceToTarget <= radius { + return m.UnitID, true } - return 0, false - }, nil) - - if err != nil { - return err } - // If no monsters found within radius, we're done - found := false - for _, m := range ctx.Data.Monsters.Enemies(filter) { - if pather.DistanceFromPoint(pos, m.Position) <= radius { - found = true - break - } - } - if !found { - return nil - } - } + return 0, false + }, nil) } + func ClearThroughPath(pos data.Position, radius int, filter data.MonsterFilter) error { ctx := context.Get() diff --git a/internal/pather/utils.go b/internal/pather/utils.go index 612b77d8a..b338e793a 100644 --- a/internal/pather/utils.go +++ b/internal/pather/utils.go @@ -145,29 +145,6 @@ func DistanceFromPoint(from data.Position, to data.Position) int { } func (pf *PathFinder) LineOfSight(origin data.Position, destination data.Position) bool { - // Pre-calculate door collision boxes - var doorBoxes []struct { - minX, maxX, minY, maxY int - } - for _, obj := range pf.data.Objects { - if obj.IsDoor() && obj.Selectable { - desc := obj.Desc() - halfSizeX := desc.SizeX / 2 - halfSizeY := desc.SizeY / 2 - doorX := obj.Position.X + desc.Xoffset - doorY := obj.Position.Y + desc.Yoffset - - doorBoxes = append(doorBoxes, struct { - minX, maxX, minY, maxY int - }{ - minX: doorX - halfSizeX, - maxX: doorX + halfSizeX, - minY: doorY - halfSizeY, - maxY: doorY + halfSizeY, - }) - } - } - dx := int(math.Abs(float64(destination.X - origin.X))) dy := int(math.Abs(float64(destination.Y - origin.Y))) sx, sy := 1, 1 @@ -180,6 +157,7 @@ func (pf *PathFinder) LineOfSight(origin data.Position, destination data.Positio } err := dx - dy + x, y := origin.X, origin.Y for { @@ -189,15 +167,6 @@ func (pf *PathFinder) LineOfSight(origin data.Position, destination data.Positio if x == destination.X && y == destination.Y { break } - - // Check pre-calculated door boxes - for _, box := range doorBoxes { - if x >= box.minX && x <= box.maxX && - y >= box.minY && y <= box.maxY { - return false - } - } - e2 := 2 * err if e2 > -dy { err -= dy diff --git a/internal/run/baal.go b/internal/run/baal.go index 80129c368..b6b469de5 100644 --- a/internal/run/baal.go +++ b/internal/run/baal.go @@ -2,6 +2,7 @@ package run import ( "errors" + "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/area" "github.com/hectorgimenez/d2go/pkg/data/npc" @@ -9,8 +10,6 @@ import ( "github.com/hectorgimenez/koolo/internal/action" "github.com/hectorgimenez/koolo/internal/config" "github.com/hectorgimenez/koolo/internal/context" - "github.com/hectorgimenez/koolo/internal/game" - "github.com/hectorgimenez/koolo/internal/pather" "github.com/hectorgimenez/koolo/internal/utils" ) @@ -98,37 +97,27 @@ func (s Baal) Run() error { return err } - // Handle Baal waves lastWave := false for !lastWave { - // Check for last wave if _, found := s.ctx.Data.Monsters.FindOne(npc.BaalsMinion, data.MonsterTypeMinion); found { lastWave = true } - - // Clear current wave - err = s.clearWave() - if err != nil { - return err - } - // Return to throne position between waves - err = action.MoveToCoords(baalThronePosition) + err = action.ClearAreaAroundPosition(baalThronePosition, 50, data.MonsterAnyFilter()) if err != nil { return err } - // Small delay to allow next wave to spawn if not last wave - if !lastWave { - utils.Sleep(500) - } + action.MoveToCoords(baalThronePosition) } + // Let's be sure everything is dead + err = action.ClearAreaAroundPosition(baalThronePosition, 50, data.MonsterAnyFilter()) + _, isLevelingChar := s.ctx.Char.(context.LevelingCharacter) if s.ctx.CharacterCfg.Game.Baal.KillBaal || isLevelingChar { utils.Sleep(15000) action.Buff() - // Exception: Baal portal has no destination in memory baalPortal, _ := s.ctx.Data.Objects.FindOne(object.BaalsPortal) err = action.InteractObject(baalPortal, func() bool { @@ -146,18 +135,6 @@ func (s Baal) Run() error { return nil } -func (s Baal) clearWave() error { - return s.ctx.Char.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { - for _, m := range d.Monsters.Enemies(data.MonsterAnyFilter()) { - dist := pather.DistanceFromPoint(baalThronePosition, m.Position) - if d.AreaData.IsWalkable(m.Position) && dist <= 45 { - return m.UnitID, true - } - } - return 0, false - }, nil) -} - func (s Baal) checkForSoulsOrDolls() bool { var npcIds []npc.ID diff --git a/internal/run/diablo.go b/internal/run/diablo.go index f7d9a3404..90a0b4e87 100644 --- a/internal/run/diablo.go +++ b/internal/run/diablo.go @@ -155,7 +155,13 @@ func (d *Diablo) killSealElite(boss string) error { if action.IsMonsterSealElite(m) { d.ctx.Logger.Debug(fmt.Sprintf("Seal elite found: %s at position X: %d, Y: %d", m.Name, m.Position.X, m.Position.Y)) - return action.ClearAreaAroundPosition(m.Position, 30, d.ctx.Data.MonsterFilterAnyReachable()) + return action.ClearAreaAroundPosition(m.Position, 30, func(monsters data.Monsters) (filteredMonsters []data.Monster) { + if action.IsMonsterSealElite(m) { + filteredMonsters = append(filteredMonsters, m) + } + + return filteredMonsters + }) } } time.Sleep(100 * time.Millisecond) From 5032952117112eda10a1fc071b941a9149ae8c37 Mon Sep 17 00:00:00 2001 From: elb <51070858+elobo91@users.noreply.github.com> Date: Sun, 16 Mar 2025 02:34:05 -0400 Subject: [PATCH 540/548] Enable/Repair game.ShiftKey ( shift + left click ) (#684) Co-authored-by: Arto Simonyan --- internal/game/memory_injector.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/internal/game/memory_injector.go b/internal/game/memory_injector.go index e894f5e62..17adbd65f 100644 --- a/internal/game/memory_injector.go +++ b/internal/game/memory_injector.go @@ -141,16 +141,18 @@ func (i *MemoryInjector) OverrideGetKeyState(key byte) error { if !i.isLoaded { return nil } - /* - cmp rcx, 0x12 - mov rax, 0x8000 - ret + Assembly: Compare key byte, set al if match, shift left to create 0x8000 if matched (4 cycles) + cmp cl, key -> Compare key byte + sete al -> Set al to 1 if equal + shl ax, 15 -> Shift left by 15 to create 0x8000 if was 1, else 0 + ret -> Return with result in ax */ - bytes := []byte{0x48, 0x81, 0xF9, key, 0x00, 0x00, 0x00, 0x48, 0xB8, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3} + + bytes := []byte{0x80, 0xF9, key, 0x0F, 0x94, 0xC0, 0x66, 0xC1, 0xE0, 0x0F, 0xC3} + return windows.WriteProcessMemory(i.handle, i.getKeyStateAddr, &bytes[0], uintptr(len(bytes)), nil) } - func (i *MemoryInjector) OverrideSetCursorPos() error { /* Just do nothing, this prevents the game from moving our cursor, for example when opening inventory or wp list From 9f0c798d68b8c889c76f890039eaa834612ed406 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Sun, 16 Mar 2025 09:06:18 +0200 Subject: [PATCH 541/548] Fix immunity issue (#737) --- internal/character/blizzard_sorceress.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/internal/character/blizzard_sorceress.go b/internal/character/blizzard_sorceress.go index 5da82e056..cc475a250 100644 --- a/internal/character/blizzard_sorceress.go +++ b/internal/character/blizzard_sorceress.go @@ -11,6 +11,7 @@ import ( "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/d2go/pkg/data/state" "github.com/hectorgimenez/koolo/internal/action/step" + "github.com/hectorgimenez/koolo/internal/context" "github.com/hectorgimenez/koolo/internal/game" ) @@ -57,6 +58,7 @@ func (s BlizzardSorceress) KillMonsterSequence( monsterSelector func(d game.Data) (data.UnitID, bool), skipOnImmunities []stat.Resist, ) error { + ctx := context.Get() completedAttackLoops := 0 previousUnitID := 0 previousSelfBlizzard := time.Time{} @@ -65,6 +67,9 @@ func (s BlizzardSorceress) KillMonsterSequence( lsOpts := step.Distance(LSMinDistance, LSMaxDistance) for { + // Pause if not priority + ctx.PauseIfNotPriority() + id, found := monsterSelector(*s.Data) if !found { return nil @@ -127,6 +132,13 @@ func (s BlizzardSorceress) killMonsterByName(id npc.ID, monsterType data.Monster break } + // Check if monster is immune to any of the skipOnImmunities + for _, immunity := range skipOnImmunities { + if m.IsImmune(immunity) { + return nil + } + } + s.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { if m, found := d.Monsters.FindOne(id, monsterType); found { return m.UnitID, true From 85058b406305bba5cc9d140c7fc569e926b4209a Mon Sep 17 00:00:00 2001 From: xVoidByte Date: Sun, 16 Mar 2025 10:44:28 +0200 Subject: [PATCH 542/548] Update Tornado Druid (wing_druig.go) to work with latest code base of Koolo (#724) --- internal/character/wind_druid.go | 217 +++++++++++++++++-------------- 1 file changed, 121 insertions(+), 96 deletions(-) diff --git a/internal/character/wind_druid.go b/internal/character/wind_druid.go index 6741c401a..f44facce4 100644 --- a/internal/character/wind_druid.go +++ b/internal/character/wind_druid.go @@ -6,30 +6,35 @@ import ( "sort" "time" + "github.com/hectorgimenez/d2go/pkg/data/mode" + "github.com/hectorgimenez/koolo/internal/context" + "github.com/hectorgimenez/koolo/internal/game" + "github.com/hectorgimenez/d2go/pkg/data" "github.com/hectorgimenez/d2go/pkg/data/npc" "github.com/hectorgimenez/d2go/pkg/data/skill" "github.com/hectorgimenez/d2go/pkg/data/stat" "github.com/hectorgimenez/d2go/pkg/data/state" "github.com/hectorgimenez/koolo/internal/action/step" - "github.com/hectorgimenez/koolo/internal/game" "github.com/hectorgimenez/koolo/internal/utils" ) const ( - druMaxAttacksLoop = 20 - druMinDistance = 2 - druMaxDistance = 8 + druMaxAttacksLoop = 20 // Max number of attack loops before stopping + druMinDistance = 2 // Min distance to maintain from target + druMaxDistance = 8 // Max distance to maintain from target + druidCastingTimeout = 3 * time.Second // Timeout for casting actions ) type WindDruid struct { - BaseCharacter - *game.HID + BaseCharacter // Inherits common character functionality + lastCastTime time.Time // Tracks the last time a skill was cast } +// Verify that required skills are bound to keys func (s WindDruid) CheckKeyBindings() []skill.ID { - requireKeybindings := []skill.ID{skill.Hurricane, skill.OakSage, skill.CycloneArmor, skill.TomeOfTownPortal} - missingKeybindings := []skill.ID{} + requireKeybindings := []skill.ID{skill.Hurricane, skill.OakSage, skill.CycloneArmor, skill.TomeOfTownPortal, skill.Tornado} + missingKeybindings := make([]skill.ID, 0) for _, cskill := range requireKeybindings { if _, found := s.Data.KeyBindings.KeyBindingForSkill(cskill); !found { @@ -41,169 +46,193 @@ func (s WindDruid) CheckKeyBindings() []skill.ID { s.Logger.Debug("There are missing required key bindings.", slog.Any("Bindings", missingKeybindings)) } - return missingKeybindings + return missingKeybindings // Returns list of unbound required skills +} + +// Ensure casting animation finishes before proceeding +func (s WindDruid) waitForCastComplete() bool { + ctx := context.Get() + startTime := time.Now() + + for time.Since(startTime) < castingTimeout { + ctx.RefreshGameData() + + if ctx.Data.PlayerUnit.Mode != mode.CastingSkill && // Check if not casting + time.Since(s.lastCastTime) > 150*time.Millisecond { // Ensure enough time has passed + return true + } + + time.Sleep(16 * time.Millisecond) // Small delay to avoid busy-waiting + } + + return false // Returns false if timeout is reached } +// Handle the main combat loop for attacking monsters func (s WindDruid) KillMonsterSequence( - monsterSelector func(d game.Data) (data.UnitID, bool), - skipOnImmunities []stat.Resist, + monsterSelector func(d game.Data) (data.UnitID, bool), // Function to select target monster + skipOnImmunities []stat.Resist, // Resistances to skip if monster is immune ) error { + ctx := context.Get() + lastRefresh := time.Now() completedAttackLoops := 0 - previousUnitID := 0 + var currentTargetID data.UnitID - for { - id, found := monsterSelector(*s.Data) - if !found { - return nil - } - if previousUnitID != int(id) { - completedAttackLoops = 0 + defer func() { // Ensures Tornado is set as active skill on exit + if kb, found := ctx.Data.KeyBindings.KeyBindingForSkill(skill.Tornado); found { + ctx.HID.PressKeyBinding(kb) } + }() - if !s.preBattleChecks(id, skipOnImmunities) { - return nil + attackOpts := []step.AttackOption{ + step.StationaryDistance(druMinDistance, druMaxDistance), // Maintains distance range + } + + for { + if time.Since(lastRefresh) > time.Millisecond*100 { + ctx.RefreshGameData() + lastRefresh = time.Now() } - s.RecastBuffs() + ctx.PauseIfNotPriority() // Pause if not the priority task - if completedAttackLoops >= maxAttacksLoop { - return nil + if completedAttackLoops >= druMaxAttacksLoop { + return nil // Exit if max attack loops reached } - monster, found := s.Data.Monsters.FindByID(id) - if !found { - s.Logger.Info("Monster not found", slog.String("monster", fmt.Sprintf("%v", monster))) - return nil + if currentTargetID == 0 { // Select a new target if none exists + id, found := monsterSelector(*s.Data) + if !found { + return nil // Exit if no target found + } + currentTargetID = id } - // Add a random movement, maybe tornado is not hitting the target - if previousUnitID == int(id) { - if monster.Stats[stat.Life] > 0 { - s.PathFinder.RandomMovement() - } + monster, found := s.Data.Monsters.FindByID(currentTargetID) + if !found || monster.Stats[stat.Life] <= 0 { // Check if target is dead or missing + currentTargetID = 0 + continue + } + + if !s.preBattleChecks(currentTargetID, skipOnImmunities) { // Perform pre-combat checks return nil } - step.PrimaryAttack( - id, - 3, - true, - step.Distance(druMinDistance, druMaxDistance), - ) + s.RecastBuffs() // Refresh buffs before attacking - completedAttackLoops++ - previousUnitID = int(id) + if kb, found := ctx.Data.KeyBindings.KeyBindingForSkill(skill.Tornado); found { + ctx.HID.PressKeyBinding(kb) // Set Tornado as active skill + if err := step.PrimaryAttack(currentTargetID, 1, true, attackOpts...); err == nil { + if !s.waitForCastComplete() { // Wait for cast to complete + continue + } + s.lastCastTime = time.Now() // Update last cast time + completedAttackLoops++ + } + } else { + return fmt.Errorf("tornado skill not bound") + } } } +// Helper for killing a specific monster by NPC ID and type func (s WindDruid) killMonster(npc npc.ID, t data.MonsterType) error { return s.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { m, found := d.Monsters.FindOne(npc, t) if !found { return 0, false } - return m.UnitID, true }, nil) } +// Reapplies active buffs if they’ve expired func (s WindDruid) RecastBuffs() { + ctx := context.Get() skills := []skill.ID{skill.Hurricane, skill.OakSage, skill.CycloneArmor} states := []state.State{state.Hurricane, state.Oaksage, state.Cyclonearmor} for i, druSkill := range skills { - if kb, found := s.Data.KeyBindings.KeyBindingForSkill(druSkill); found { - if !s.Data.PlayerUnit.States.HasState(states[i]) { - s.HID.PressKeyBinding(kb) - utils.Sleep(180) - s.HID.Click(game.RightButton, 640, 340) - utils.Sleep(100) + if kb, found := ctx.Data.KeyBindings.KeyBindingForSkill(druSkill); found { + if !ctx.Data.PlayerUnit.States.HasState(states[i]) { // Check if buff is missing + ctx.HID.PressKeyBinding(kb) // Activate skill + utils.Sleep(180) // Small delay + s.HID.Click(game.RightButton, 640, 340) // Cast skill at center screen + utils.Sleep(100) // Delay to ensure cast completes } } } } -func (s WindDruid) BuffSkills() (buffs []skill.ID) { +// Return a list of available buff skills +func (s WindDruid) BuffSkills() []skill.ID { + buffs := make([]skill.ID, 0) if _, found := s.Data.KeyBindings.KeyBindingForSkill(skill.CycloneArmor); found { buffs = append(buffs, skill.CycloneArmor) } - if _, ravenFound := s.Data.KeyBindings.KeyBindingForSkill(skill.Raven); ravenFound { - buffs = append(buffs, skill.Raven, skill.Raven, skill.Raven, skill.Raven, skill.Raven) + if _, found := s.Data.KeyBindings.KeyBindingForSkill(skill.Raven); found { + buffs = append(buffs, skill.Raven, skill.Raven, skill.Raven, skill.Raven, skill.Raven) // Summon 5 ravens } - if _, hurricaneFound := s.Data.KeyBindings.KeyBindingForSkill(skill.Hurricane); hurricaneFound { + if _, found := s.Data.KeyBindings.KeyBindingForSkill(skill.Hurricane); found { buffs = append(buffs, skill.Hurricane) } return buffs } -func (s WindDruid) PreCTABuffSkills() (skills []skill.ID) { +// Dynamically determines pre-combat buffs and summons +func (s WindDruid) PreCTABuffSkills() []skill.ID { needsBear := true wolves := 5 direWolves := 3 needsOak := true needsCreeper := true - for _, monster := range s.Data.Monsters { + for _, monster := range s.Data.Monsters { // Check existing pets if monster.IsPet() { - if monster.Name == npc.DruBear { + switch monster.Name { + case npc.DruBear: needsBear = false - } - if monster.Name == npc.DruFenris { + case npc.DruFenris: direWolves-- - } - if monster.Name == npc.DruSpiritWolf { + case npc.DruSpiritWolf: wolves-- - } - if monster.Name == npc.OakSage { + case npc.OakSage: needsOak = false - } - if monster.Name == npc.DruCycleOfLife { - needsCreeper = false - } - if monster.Name == npc.VineCreature { - needsCreeper = false - } - if monster.Name == npc.DruPlaguePoppy { + case npc.DruCycleOfLife, npc.VineCreature, npc.DruPlaguePoppy: needsCreeper = false } } } + skills := make([]skill.ID, 0) if s.Data.PlayerUnit.States.HasState(state.Oaksage) { needsOak = false } - _, foundDireWolf := s.Data.KeyBindings.KeyBindingForSkill(skill.SummonDireWolf) - _, foundWolf := s.Data.KeyBindings.KeyBindingForSkill(skill.SummonSpiritWolf) - _, foundBear := s.Data.KeyBindings.KeyBindingForSkill(skill.SummonGrizzly) - _, foundOak := s.Data.KeyBindings.KeyBindingForSkill(skill.OakSage) - _, foundSolarCreeper := s.Data.KeyBindings.KeyBindingForSkill(skill.SolarCreeper) - _, foundCarrionCreeper := s.Data.KeyBindings.KeyBindingForSkill(skill.CarrionVine) - _, foundPoisonCreeper := s.Data.KeyBindings.KeyBindingForSkill(skill.PoisonCreeper) - - if foundWolf { + // Add summoning skills based on need and key bindings + if _, found := s.Data.KeyBindings.KeyBindingForSkill(skill.SummonSpiritWolf); found { for i := 0; i < wolves; i++ { skills = append(skills, skill.SummonSpiritWolf) } } - if foundDireWolf { + if _, found := s.Data.KeyBindings.KeyBindingForSkill(skill.SummonDireWolf); found { for i := 0; i < direWolves; i++ { skills = append(skills, skill.SummonDireWolf) } } - if foundBear && needsBear { + if _, found := s.Data.KeyBindings.KeyBindingForSkill(skill.SummonGrizzly); found && needsBear { skills = append(skills, skill.SummonGrizzly) } - if foundOak && needsOak { + if _, found := s.Data.KeyBindings.KeyBindingForSkill(skill.OakSage); found && needsOak { skills = append(skills, skill.OakSage) } - if foundSolarCreeper && needsCreeper { + if _, found := s.Data.KeyBindings.KeyBindingForSkill(skill.SolarCreeper); found && needsCreeper { skills = append(skills, skill.SolarCreeper) } - if foundCarrionCreeper && needsCreeper { + if _, found := s.Data.KeyBindings.KeyBindingForSkill(skill.CarrionVine); found && needsCreeper { skills = append(skills, skill.CarrionVine) } - if foundPoisonCreeper && needsCreeper { + if _, found := s.Data.KeyBindings.KeyBindingForSkill(skill.PoisonCreeper); found && needsCreeper { skills = append(skills, skill.PoisonCreeper) } @@ -217,6 +246,7 @@ func (s WindDruid) KillCountess() error { func (s WindDruid) KillAndariel() error { return s.killMonster(npc.Andariel, data.MonsterTypeUnique) } + func (s WindDruid) KillSummoner() error { return s.killMonster(npc.Summoner, data.MonsterTypeUnique) } @@ -225,9 +255,9 @@ func (s WindDruid) KillDuriel() error { return s.killMonster(npc.Duriel, data.MonsterTypeUnique) } +// Targets multiple council members, sorted by distance func (s WindDruid) KillCouncil() error { return s.KillMonsterSequence(func(d game.Data) (data.UnitID, bool) { - // Exclude monsters that are not council members var councilMembers []data.Monster for _, m := range d.Monsters { if m.Name == npc.CouncilMember || m.Name == npc.CouncilMember2 || m.Name == npc.CouncilMember3 { @@ -235,12 +265,8 @@ func (s WindDruid) KillCouncil() error { } } - // Order council members by distance sort.Slice(councilMembers, func(i, j int) bool { - distanceI := s.PathFinder.DistanceFromMe(councilMembers[i].Position) - distanceJ := s.PathFinder.DistanceFromMe(councilMembers[j].Position) - - return distanceI < distanceJ + return s.PathFinder.DistanceFromMe(councilMembers[i].Position) < s.PathFinder.DistanceFromMe(councilMembers[j].Position) }) for _, m := range councilMembers { @@ -259,6 +285,7 @@ func (s WindDruid) KillIzual() error { return s.killMonster(npc.Izual, data.MonsterTypeUnique) } +// KillDiablo includes a timeout and detection logic func (s WindDruid) KillDiablo() error { timeout := time.Second * 20 startTime := time.Now() @@ -271,20 +298,18 @@ func (s WindDruid) KillDiablo() error { } diablo, found := s.Data.Monsters.FindOne(npc.Diablo, data.MonsterTypeUnique) - if !found || diablo.Stats[stat.Life] <= 0 { - // Already dead + if !found || diablo.Stats[stat.Life] <= 0 { // Check if Diablo is dead or missing + // Diablo is dead if diabloFound { return nil } - - // Keep waiting... - time.Sleep(200) + // Keep waiting.. + time.Sleep(200 * time.Millisecond) continue } diabloFound = true s.Logger.Info("Diablo detected, attacking") - return s.killMonster(npc.Diablo, data.MonsterTypeUnique) } } From 05224badb2216c784a224ed98e0fe8255dbb88d2 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Tue, 18 Mar 2025 16:50:19 +0200 Subject: [PATCH 543/548] update d2go (#747) --- go.mod | 2 +- go.sum | 2 ++ internal/bot/single_supervisor.go | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 5c0d2fe41..1781317b7 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/bwmarrin/discordgo v0.28.1 github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 github.com/gorilla/websocket v1.5.3 - github.com/hectorgimenez/d2go v0.0.0-20250227150416-4204d68f233f + github.com/hectorgimenez/d2go v0.0.0-20250314185000-169a76515285 github.com/inkeliz/gowebview v1.0.1 github.com/lxn/win v0.0.0-20210218163916-a377121e959e github.com/otiai10/copy v1.14.0 diff --git a/go.sum b/go.sum index 5300e6b90..25e9672e0 100644 --- a/go.sum +++ b/go.sum @@ -31,6 +31,8 @@ github.com/hectorgimenez/d2go v0.0.0-20250221161127-5455fd977276 h1:A4LnLo5dsLmU github.com/hectorgimenez/d2go v0.0.0-20250221161127-5455fd977276/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= github.com/hectorgimenez/d2go v0.0.0-20250227150416-4204d68f233f h1:Qp4gJANcIkJJdnImJ9G1LRLqZh0gXnONm9awBEMEjPk= github.com/hectorgimenez/d2go v0.0.0-20250227150416-4204d68f233f/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= +github.com/hectorgimenez/d2go v0.0.0-20250314185000-169a76515285 h1:UOpB9azve0kdL5/E/qBT725Fft+fk33o0NUIP8GsFUo= +github.com/hectorgimenez/d2go v0.0.0-20250314185000-169a76515285/go.mod h1:EOVayMaK8D13wsZiZ6n8AK3+Qflm1wHZsCqnzlVIci0= github.com/inkeliz/gowebview v1.0.1 h1:4gpLE2qt4kV3DB+xHkHKUeLLiGPN5Xw3or9A3hVqYyA= github.com/inkeliz/gowebview v1.0.1/go.mod h1:4SNjXp/fogE11MwvJD67kMBmSObY2BBqinEgH8+8eM8= github.com/inkeliz/w32 v1.0.2 h1:Es8Bmw9ApOY0PVRpGs7wsqIKdK5C3xBkP5TOATfVmtU= diff --git a/internal/bot/single_supervisor.go b/internal/bot/single_supervisor.go index d0167ebb1..01e43a549 100644 --- a/internal/bot/single_supervisor.go +++ b/internal/bot/single_supervisor.go @@ -176,7 +176,7 @@ func (s *SinglePlayerSupervisor) HandleOutOfGameFlow() error { for !s.bot.ctx.GameReader.IsInLobby() { // Prevent an infinite loop - if retryCount >= 5 && !s.bot.ctx.Data.IsInLobby { + if retryCount >= 5 && !s.bot.ctx.GameReader.IsInLobby() { return fmt.Errorf("failed to enter bnet lobby after 5 retries") } @@ -255,7 +255,7 @@ func (s *SinglePlayerSupervisor) HandleOutOfGameFlow() error { utils.Sleep(1000) for range 5 { - if s.bot.ctx.Data.IsInCharSelectionScreen && s.bot.ctx.GameReader.IsOnline() { + if s.bot.ctx.GameReader.IsInCharacterSelectionScreen() && s.bot.ctx.GameReader.IsOnline() { break } @@ -266,7 +266,7 @@ func (s *SinglePlayerSupervisor) HandleOutOfGameFlow() error { } } - if !s.bot.ctx.Data.IsInCharSelectionScreen { + if !s.bot.ctx.GameReader.IsInCharacterSelectionScreen() { return fmt.Errorf("failed to leave lobby or an unknown case occurred") } From 94bc91f8673f1642626f9247a7fdc9ac37f9668a Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Wed, 19 Mar 2025 13:05:59 +0200 Subject: [PATCH 544/548] Revert "Potential fix for losing Magefist/gloves/weapon." (#752) --- internal/action/horadric_cube.go | 34 ++------------------------------ internal/action/stash.go | 29 ++++++--------------------- 2 files changed, 8 insertions(+), 55 deletions(-) diff --git a/internal/action/horadric_cube.go b/internal/action/horadric_cube.go index 77a9039a3..c280c6ece 100644 --- a/internal/action/horadric_cube.go +++ b/internal/action/horadric_cube.go @@ -22,20 +22,10 @@ func CubeAddItems(items ...data.Item) error { // Ensure stash is open if !ctx.Data.OpenMenus.Stash { - - utils.Sleep(300) - bank, found := ctx.Data.Objects.FindOne(object.Bank) - if !found { - return fmt.Errorf("stash not found") - } - - // Clear any popups first - ClearMessages() - + bank, _ := ctx.Data.Objects.FindOne(object.Bank) err := InteractObject(bank, func() bool { return ctx.Data.OpenMenus.Stash }) - if err != nil { return err } @@ -46,21 +36,6 @@ func CubeAddItems(items ...data.Item) error { // If items are on the Stash, pickup them to the inventory for _, itm := range items { - - ctx.Logger.Info("Processing item", - slog.String("Name", string(itm.Name)), - slog.String("Location", fmt.Sprintf("%v", itm.Location.LocationType)), - ) - - // Add check to skip equipped items - if itm.Location.LocationType == item.LocationEquipped { - ctx.Logger.Warn("Skipping equipped item", - slog.String("Item", string(itm.Name)), - slog.Any("Location", itm.Location), - ) - continue - } - nwIt := itm if nwIt.Location.LocationType != item.LocationStash && nwIt.Location.LocationType != item.LocationSharedStash { continue @@ -177,13 +152,8 @@ func ensureCubeIsOpen() error { ctx := context.Get() ctx.Logger.Debug("Opening Horadric Cube...") - // Force a refresh to sync menu states - ctx.RefreshGameData() - if ctx.Data.OpenMenus.Cube { - ctx.Logger.Info("Horadric Cube window already open, moving cursor to avoid Gloves/Weapon loss") - // Move cursor to the center-right of the screen to avoid Magefist/Weapon loss - ctx.HID.MovePointer(1245, 355) // X=1245, Y=355 (center | right side) + ctx.Logger.Debug("Horadric Cube window already open") return nil } diff --git a/internal/action/stash.go b/internal/action/stash.go index 3b1c33cbb..4a1eff294 100644 --- a/internal/action/stash.go +++ b/internal/action/stash.go @@ -382,30 +382,13 @@ func OpenStash() error { if !found { return errors.New("stash not found") } + InteractObject(bank, + func() bool { + return ctx.Data.OpenMenus.Stash + }, + ) - // Clear any UI popups first - ClearMessages() - - // Open the stash - err := InteractObject(bank, func() bool { - return ctx.Data.OpenMenus.Stash - }) - if err != nil { - return err - } - - // Force a refresh to ensure menu state is updated - ctx.RefreshGameData() - utils.Sleep(300) // Short delay for menu rendering - - if ctx.Data.OpenMenus.Stash { - // Move cursor to the center-right of the screen to avoid Magefist/Weapon loss - ctx.HID.MovePointer(1245, 355) // X=1245, Y=355 (center | right side) - ctx.Logger.Info("Stash opened - cursor moved to safe position") - return nil - } - - return errors.New("stash window not detected after interaction") + return nil } func CloseStash() error { From a79163908a387eac8a115428bbd727f067731ff0 Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Fri, 21 Mar 2025 19:33:21 +0200 Subject: [PATCH 545/548] fix area sync errors (#753) --- internal/action/move.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/internal/action/move.go b/internal/action/move.go index 9fe6b760a..4aa801736 100644 --- a/internal/action/move.go +++ b/internal/action/move.go @@ -27,9 +27,7 @@ const ( func ensureAreaSync(ctx *context.Status, expectedArea area.ID) error { // Skip sync check if we're already in the expected area and have valid area data if ctx.Data.PlayerUnit.Area == expectedArea { - if areaData, ok := ctx.Data.Areas[expectedArea]; ok && areaData.IsInside(ctx.Data.PlayerUnit.Position) { - return nil - } + return nil } // Wait for area data to sync @@ -37,11 +35,7 @@ func ensureAreaSync(ctx *context.Status, expectedArea area.ID) error { ctx.RefreshGameData() if ctx.Data.PlayerUnit.Area == expectedArea { - if areaData, ok := ctx.Data.Areas[expectedArea]; ok { - if areaData.IsInside(ctx.Data.PlayerUnit.Position) { - return nil - } - } + return nil } time.Sleep(areaSyncDelay) From 99b0d3aef4a7afeda299329c5d84d68c6c283dba Mon Sep 17 00:00:00 2001 From: Arto Simonyan Date: Mon, 24 Mar 2025 18:38:43 +0200 Subject: [PATCH 546/548] Discord message settings ++ (#759) --- cmd/koolo/log/logger.go | 25 ++++++---- cmd/koolo/main.go | 46 +++++++++++++------ internal/bot/single_supervisor.go | 2 +- internal/config/config.go | 1 + .../remote/discord/discord_event_handler.go | 12 ++++- internal/server/http_server.go | 1 + internal/server/templates/config.gohtml | 4 ++ 7 files changed, 63 insertions(+), 28 deletions(-) diff --git a/cmd/koolo/log/logger.go b/cmd/koolo/log/logger.go index a75a2ddbd..cad28cdb3 100644 --- a/cmd/koolo/log/logger.go +++ b/cmd/koolo/log/logger.go @@ -11,6 +11,21 @@ import ( var logFileHandler *os.File +func FlushLog() { + if logFileHandler != nil { + logFileHandler.Sync() + } +} + +func FlushAndClose() error { + if logFileHandler != nil { + logFileHandler.Sync() + return logFileHandler.Close() + } + + return nil +} + func NewLogger(debug bool, logDir, supervisor string) (*slog.Logger, error) { if logDir == "" { logDir = "logs" @@ -52,17 +67,7 @@ func NewLogger(debug bool, logDir, supervisor string) (*slog.Logger, error) { return a }, } - handler := slog.NewTextHandler(io.MultiWriter(logFileHandler, os.Stdout), opts) return slog.New(handler), nil } - -func FlushLog() error { - if logFileHandler != nil { - logFileHandler.Sync() - return logFileHandler.Close() - } - - return nil -} diff --git a/cmd/koolo/main.go b/cmd/koolo/main.go index 7a8a17789..c4b77244b 100644 --- a/cmd/koolo/main.go +++ b/cmd/koolo/main.go @@ -21,6 +21,21 @@ import ( "golang.org/x/sync/errgroup" ) +// wrapWithRecover wraps a function with panic recovery logic +func wrapWithRecover(logger *slog.Logger, f func() error) func() error { + return func() error { + defer func() { + if r := recover(); r != nil { + stackTrace := debug.Stack() + errMsg := fmt.Sprintf("panic recovered: %v\nStacktrace: %s", r, stackTrace) + logger.Error(errMsg) + sloggger.FlushLog() + } + }() + return f() + } +} + func main() { err := config.Load() if err != nil { @@ -33,13 +48,13 @@ func main() { if err != nil { log.Fatalf("Error starting logger: %s", err.Error()) } - defer sloggger.FlushLog() + defer sloggger.FlushAndClose() defer func() { if r := recover(); r != nil { err = fmt.Errorf("fatal error detected, Koolo will close with the following error: %v\n Stacktrace: %s", r, debug.Stack()) logger.Error(err.Error()) - sloggger.FlushLog() + sloggger.FlushAndClose() utils.ShowDialog("Koolo error :(", fmt.Sprintf("Koolo will close due to an expected error, please check the latest log file for more info!\n %s", err.Error())) } }() @@ -60,7 +75,8 @@ func main() { log.Fatalf("Error starting local server: %s", err.Error()) } - g.Go(func() error { + // Use wrapWithRecover for all goroutines to handle panics + g.Go(wrapWithRecover(logger, func() error { defer cancel() displayScale := config.GetCurrentDisplayScale() w, err := gowebview.New(&gowebview.Config{URL: "http://localhost:8087", WindowConfig: &gowebview.WindowConfig{ @@ -84,7 +100,7 @@ func main() { w.Run() return nil - }) + })) // Discord Bot initialization if config.Koolo.Discord.Enabled { @@ -95,9 +111,9 @@ func main() { } eventListener.Register(discordBot.Handle) - g.Go(func() error { + g.Go(wrapWithRecover(logger, func() error { return discordBot.Start(ctx) - }) + })) } // Telegram Bot initialization @@ -109,22 +125,22 @@ func main() { } eventListener.Register(telegramBot.Handle) - g.Go(func() error { + g.Go(wrapWithRecover(logger, func() error { return telegramBot.Start(ctx) - }) + })) } - g.Go(func() error { + g.Go(wrapWithRecover(logger, func() error { defer cancel() return srv.Listen(8087) - }) + })) - g.Go(func() error { + g.Go(wrapWithRecover(logger, func() error { defer cancel() return eventListener.Listen(ctx) - }) + })) - g.Go(func() error { + g.Go(wrapWithRecover(logger, func() error { <-ctx.Done() logger.Info("Koolo shutting down...") cancel() @@ -136,7 +152,7 @@ func main() { } return err - }) + })) err = g.Wait() if err != nil { @@ -145,5 +161,5 @@ func main() { return } - sloggger.FlushLog() + sloggger.FlushAndClose() } diff --git a/internal/bot/single_supervisor.go b/internal/bot/single_supervisor.go index 01e43a549..b76030cda 100644 --- a/internal/bot/single_supervisor.go +++ b/internal/bot/single_supervisor.go @@ -84,7 +84,7 @@ func (s *SinglePlayerSupervisor) Start() error { if config.Characters[s.name].Game.RandomizeRuns { rand.Shuffle(len(runs), func(i, j int) { runs[i], runs[j] = runs[j], runs[i] }) } - event.Send(event.GameCreated(event.Text(s.name, "New game created"), "", "")) + event.Send(event.GameCreated(event.Text(s.name, "New game created"), s.bot.ctx.GameReader.LastGameName(), s.bot.ctx.GameReader.LastGamePass())) s.bot.ctx.LastBuffAt = time.Time{} s.logGameStart(runs) diff --git a/internal/config/config.go b/internal/config/config.go index 7afa7b5ab..bed53b663 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -48,6 +48,7 @@ type KooloCfg struct { EnableNewRunMessages bool `yaml:"enableNewRunMessages"` EnableRunFinishMessages bool `yaml:"enableRunFinishMessages"` EnableDiscordChickenMessages bool `yaml:"enableDiscordChickenMessages"` + EnableDiscordErrorMessages bool `yaml:"enableDiscordErrorMessages"` BotAdmins []string `yaml:"botAdmins"` ChannelID string `yaml:"channelId"` Token string `yaml:"token"` diff --git a/internal/remote/discord/discord_event_handler.go b/internal/remote/discord/discord_event_handler.go index a2d6b3c49..ad4324f9d 100644 --- a/internal/remote/discord/discord_event_handler.go +++ b/internal/remote/discord/discord_event_handler.go @@ -3,6 +3,7 @@ package discord import ( "bytes" "context" + "fmt" "image/jpeg" "github.com/bwmarrin/discordgo" @@ -13,8 +14,12 @@ import ( func (b *Bot) Handle(_ context.Context, e event.Event) error { if b.shouldPublish(e) { - switch e.(type) { - case event.GameCreatedEvent, event.GameFinishedEvent, event.RunStartedEvent, event.RunFinishedEvent: + switch evt := e.(type) { + case event.GameCreatedEvent: + message := fmt.Sprintf("%s\nGame: %s\nPassword: %s", evt.Message(), evt.Name, evt.Password) + _, err := b.discordSession.ChannelMessageSend(b.channelID, message) + return err + case event.GameFinishedEvent, event.RunStartedEvent, event.RunFinishedEvent: _, err := b.discordSession.ChannelMessageSend(b.channelID, e.Message()) return err default: @@ -42,6 +47,9 @@ func (b *Bot) shouldPublish(e event.Event) bool { switch evt := e.(type) { case event.GameFinishedEvent: + if evt.Reason == event.FinishedError { + return config.Koolo.Discord.EnableDiscordErrorMessages + } if evt.Reason == event.FinishedChicken || evt.Reason == event.FinishedMercChicken || evt.Reason == event.FinishedDied { return config.Koolo.Discord.EnableDiscordChickenMessages } diff --git a/internal/server/http_server.go b/internal/server/http_server.go index 7ec51428e..00f605ede 100644 --- a/internal/server/http_server.go +++ b/internal/server/http_server.go @@ -653,6 +653,7 @@ func (s *HttpServer) config(w http.ResponseWriter, r *http.Request) { newConfig.Discord.EnableNewRunMessages = r.Form.Has("enable_new_run_messages") newConfig.Discord.EnableRunFinishMessages = r.Form.Has("enable_run_finish_messages") newConfig.Discord.EnableDiscordChickenMessages = r.Form.Has("enable_discord_chicken_messages") + newConfig.Discord.EnableDiscordErrorMessages = r.Form.Has("enable_discord_error_messages") // Discord admins who can use bot commands discordAdmins := r.Form.Get("discord_admins") diff --git a/internal/server/templates/config.gohtml b/internal/server/templates/config.gohtml index bbe602645..7f92e394d 100644 --- a/internal/server/templates/config.gohtml +++ b/internal/server/templates/config.gohtml @@ -140,6 +140,10 @@ Enable Chicken/Death Messages +

    Telegram integration

    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