From ac34361d98854061f4af607fcdd3f84a8dd0b15f Mon Sep 17 00:00:00 2001 From: Alex Goth <64845621+GAlexIHU@users.noreply.github.com> Date: Tue, 20 Oct 2026 11:38:38 +0200 Subject: [PATCH 1/2] feat(credits): filter grants by feature spendability --- .../src/models/schemas.ts | 2 + .../aip-client-javascript/src/models/types.ts | 7 + .../aip/src/customers/credits/operations.tsp | 8 + api/v3/api.gen.go | 872 +++++++++--------- api/v3/client/customers_credits_grants.go | 6 + .../customers/credits/feature_filter.go | 40 + .../handlers/customers/credits/list_grants.go | 4 + .../customers/credits/list_grants_test.go | 79 ++ api/v3/openapi.yaml | 8 + openmeter/billing/charges/README.md | 5 + .../billing/charges/creditpurchase/adapter.go | 12 + .../charges/creditpurchase/adapter/charge.go | 13 + openmeter/billing/creditgrant/service.go | 10 + .../billing/creditgrant/service/service.go | 1 + .../ledger/account/adapter/subaccount.go | 10 +- .../filters.go | 2 +- openmeter/ledger/historical/adapter/ledger.go | 14 +- .../historical/adapter/sumentries_query.go | 10 +- .../internal/routequery/subaccount_ids.go | 7 +- test/credits/creditgrant_test.go | 69 ++ 20 files changed, 728 insertions(+), 451 deletions(-) create mode 100644 api/v3/handlers/customers/credits/list_grants_test.go rename openmeter/ledger/{internal/routequery => creditfilterquery}/filters.go (98%) diff --git a/api/spec/packages/aip-client-javascript/src/models/schemas.ts b/api/spec/packages/aip-client-javascript/src/models/schemas.ts index cdba25f470..be26662e80 100644 --- a/api/spec/packages/aip-client-javascript/src/models/schemas.ts +++ b/api/spec/packages/aip-client-javascript/src/models/schemas.ts @@ -3404,6 +3404,7 @@ export const listCreditGrantsParamsFilter = z status: creditGrantStatus.optional(), currency: currencyCode.optional(), key: stringFieldFilter.optional(), + featureKey: stringFieldFilter.optional(), }) .describe('Filter options for listing credit grants.') @@ -13168,6 +13169,7 @@ export const listCreditGrantsParamsFilterWire = z status: creditGrantStatusWire.optional(), currency: currencyCodeWire.optional(), key: stringFieldFilterWire.optional(), + feature_key: stringFieldFilterWire.optional(), }) .describe('Filter options for listing credit grants.') diff --git a/api/spec/packages/aip-client-javascript/src/models/types.ts b/api/spec/packages/aip-client-javascript/src/models/types.ts index 9e3fd140c6..1528d998e2 100644 --- a/api/spec/packages/aip-client-javascript/src/models/types.ts +++ b/api/spec/packages/aip-client-javascript/src/models/types.ts @@ -2199,6 +2199,13 @@ export interface ListCreditGrantsParamsFilter { currency?: string /** Filter credit grants by key. */ key?: StringFieldFilter + /** + * Select grants spendable on any requested feature, including grants without + * feature restrictions. Keys are case-sensitive. Supports `eq` (or shorthand) and + * `oeq` with comma-separated keys. Omit to include all features; use + * `exists=false` for grants without feature restrictions. + */ + featureKey?: StringFieldFilter } /** A validation issue found while processing a billing resource. */ diff --git a/api/spec/packages/aip/src/customers/credits/operations.tsp b/api/spec/packages/aip/src/customers/credits/operations.tsp index 2b272e94c8..b03e5d2343 100644 --- a/api/spec/packages/aip/src/customers/credits/operations.tsp +++ b/api/spec/packages/aip/src/customers/credits/operations.tsp @@ -34,6 +34,14 @@ model ListCreditGrantsParamsFilter { * Filter credit grants by key. */ key?: Common.StringFieldFilter; + + /** + * Select grants spendable on any requested feature, including grants without + * feature restrictions. Keys are case-sensitive. Supports `eq` (or shorthand) and + * `oeq` with comma-separated keys. Omit to include all features; use + * `exists=false` for grants without feature restrictions. + */ + feature_key?: Common.StringFieldFilter; } namespace Credits.Grants { diff --git a/api/v3/api.gen.go b/api/v3/api.gen.go index d7a75271e5..5de8d23692 100644 --- a/api/v3/api.gen.go +++ b/api/v3/api.gen.go @@ -9774,6 +9774,12 @@ type ListCreditGrantsParamsFilter struct { // Currency Filter credit grants by currency. Currency *CurrencyCode `json:"currency,omitempty"` + // FeatureKey Select grants spendable on any requested feature, including grants without + // feature restrictions. Keys are case-sensitive. Supports `eq` (or shorthand) and + // `oeq` with comma-separated keys. Omit to include all features; use + // `exists=false` for grants without feature restrictions. + FeatureKey *StringFieldFilter `json:"feature_key,omitempty"` + // Key Filter credit grants by key. Key *StringFieldFilter `json:"key,omitempty"` @@ -23575,438 +23581,440 @@ var swaggerSpec = []string{ "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", - "APjFRELxTGpT3x0z+PTh0/83AA==", + "7tyOso7jvnYEZ6AKpOYG1OJVx36atlrOd59hBe9EIiI/rUmFItUxlmEO8xVaCIY2yTjslO0E8r0u8oma", + "+VggihrAyFBMGowUEHEjRkYoI1EfxSzxGXYqfjtlj+AVMtcZON3Fj8nGcarhC4wPMcQLPnJhFzFwYVOG", + "O7jk6mFu57+xgjJnV0IcMIKlAjdrBTuQnvcVw1EeNYRubMMEm7VN39EI/ae2zHAdwQV1QPdLdnkw0T4L", + "Wa/anRCGlpgiyjHrS4liOgWWiZxTHL/MJqoZQBSoR28uSqi+kFWhQkA61G2iwn6UUmSDQKHWQcJ3yha4", + "HaDfexhl04XD1Ktw3IeD7Qm3K9XIayht79eNn419nn017Ke9694FEvRv4sHTImwcXhaHl8XhZXGTLwtL", + "7408886Z8aV1Oty0OItPZttSlcGn1W8vW9ydvshlE28fs0jy/imNmskZsSDdilIMqwpedKYH6tjjvd0x", + "zU2/aTYbTh3KG69e3hxP7YLBydibSSHXnR1mY49Obc6W0yE7pWx2mK/+1Lprnz7uQaV7RpsWVLHq2alV", + "z07vhwUiTbiabjtrmskFz5ZTsbDh5xuPQMmDg8IDU5tOaUuYutBi/wxlNR/Zrzq6TkaeudU4yYGL3RMu", + "9s3F/hBV2mh4Ji5uBVcv/DbNRSi215FWxtc4sT7zu3nsfmzlgLPFkjEVGvwDf8ayMg6E8WALn6St1k6T", + "0Hy5zm519QQAwULMf9+Lp1lwxtwWS9/rwmmtMNUuuFGvrV6twfE5vvbBYJxGubU231ZSAnLS6V2wbu/T", + "ktJtQtknPy512xVVT1hijOdMX9pEmMFdt3/Rogu2AIgvgpx8nadmQ/v2dqHS6Lt1NO+1QWdLN3uZst6z", + "mf3iTYuYKY0p9rzayhXilo5XKM7dplhDTdz+IKqq0EjvdyOKtODs11qlQlfbPVFB1SvX7CW93RpsrJid", + "wOWV/S9y5PzVffvwq/jtw99/eveyHmK0D4BwfKCNKixuWoIFw22bcUr7gwdmaIUIPnz4NdIq51IZhGyw", + "lYP+ZlC58WswuZ9pl8gves/ScSkWV0GhHwkQ607eSWiYcmxPFEaZDjqlqp3vB80XGtz3hp3lVIie3fv7", + "g87lTEZ4072Yc6VEsqfdVsFMLLJTrbviN75YhoNYGvAgWSvbfk1qg1rvm3W9vY7rbD3QZeOt6oMS+9Sb", + "VBCiU3dCiLI3kYs7VHSi8LlQIqNo66xIxJhRcVPj3oKXc20EfmI5GN5yw3g+UZS+yVaADUoPODxnYM8h", + "TyNMa4+eRTwTzKcIIRHz2tgvEgmVXqc3IC25uVBcatspkYmyUa7LNFewT3ZrJkoaJlVz63DQ3hu312eT", + "lZOlz75vZwv0LpmYUbr2MfvmQoTuXbyslqzEBfBm2KYhhcPDQqEhO1Xit9Ob0+82LP57XdJWTBVIbDsV", + "hbN43Awu2Nl6bpwvA91r42q2m5vChX0uaR/RIuGNhRmubuDCAvS8jftKMW6MPFcidhy0ZLwIE+mXLNtt", + "cF064Ym6revpIJxdTzh7k3C1zwhCMF93hxFymHk7pkxdt1VYU++tj3IriNGSv3Xg5DV9AVad/x6Pfi+h", + "o59JFOi74szv5J6OwIRTrDVcbIjP2xPB9j23OXqPN7s/xtdi8+M6sQWMMGVrpdqlu2lnUgnD5voSblsU", + "f/AS9ZW4gsdtEE7uPtMspqhle3g+eHr89MvR8ZPR8ZP3x0+e4//Gx8dP/j1oQPiKUXKQn2yZrWrRNpv7", + "ZPBfY/qX35f/GuM/Pg0HCODU/pxmepHmA0KYwfGT7/701b///NVXJ9/+cvLPf3zz5OkP//v4xb/++u0/", + "bOnJ5wNMImSmWOjDZTWw+UoMe29/De/DVUvD8iBlPk+EEkeyutPwNgp3sK+whShwEvRsT+8SjE3uJ7lm", + "hSkrndmqWw2Z6FBY+R4WVt5JkUNIFBKz/3734w9veD6HLEmZMLbgoWbiKgeQSL+R6SIFYR5x3ZTVbumt", + "hZ7JjYwXthY6ZrfQyqA3ssLcVOmcK8p7iF8LFYvMRDoTtX0IeE+DATQ4ZcgR2tyhCVRHGS7+zVYSDYin", + "MnHJWtbUMSaGOd1pBUdAQGYk1v5zBAwRf1AK08FvGTWEHM2KBFZmPsqU6cQ7d7FXs4mq1YsGj/igxhO1", + "xNeTHTce36fy3XeklPVdr9XcvKrqW9bCC+qswJbPdAyg6kr4hYG5uS9tvcR9fh+2K8tvmmIxZPzifMgW", + "UlEWnAW/CknRkAhDCbeZzhh3BZgqOXtSnhkRU31MaovTfqszy4OmEVaZDUYesrwJlGNcnNEkYwZDYN+J", + "qlyvbh/8VgKg8lyRF1vIP7wssAZ9tq6jPawIFRU2+KFLnjypiiFbyxJlsi0rDMJW+XTuU/cnvzin5RNN", + "DYDAc2Hy1pRcCODdzRSO4N1OgnCcOqjHarZ6xVULtLqCsl210XuJGTddP5aAReJcUXp5olDaEL8VPDHs", + "0WQgfqOsWVJNBo+xfjfPpNGKLr5AbdhemLZ6HJ9WHhD4CBYJz2S+bCew87JBpT4yClrIeuBWYK4GnQXR", + "XeAgtbgabRNl69MF1Pjm/ZPXgyH8B548b568xP9/3U1vtto+Zi7Y8rGJh+KyH9SEN5KK4A31zL2hjp/j", + "/+D9dB5uloUWNgOLF0C+zPcvBlSUuhzhaTDCp1Ulj/u/sCqU9elDX/S0lLPX6t3WsQz+STWspfE1+Cnt", + "4afaNm6+8hBlO0CSv4uWYt64JfRACABUYHh5NWM1wRM1+X4Ntcrf3rEzq4Sj4tjTs+W0yo1WF2wPQbLR", + "juxsWcHLXwcV7cKHIBayrVCWK15yfNxk/gG6AmAzXiS5x9wmoL70OUAXiqe4rTAO48aqaWL3RHl18sMJ", + "cYV/QwMINT3jkK8DK2A+Pzq6vLwcS674WGfnRzDSCEYyj8fsfWVoaSjLYa5ZLHKRLaQSZcAypV1vr9tu", + "Oo6U/fT+BbbD8X1qddNRoX8/9eVXEUmux+tYto1l3Yz5va6wPhigxvlItvi1fpNW1KKrFVZOF4ZegqO8", + "yM70ICjXlRZ5yXu6OGw377RPgsHzwZOnYygCi/u87Wif+gcn0xHBd4tT+G9kClS/JhFDzLy5SPMlQ0IL", + "awr3jlwODlhftsltt8y1b48WekVkV7dvU8kg05eOexF1AHwNkTMkl3tDJdtJymsUcvVLLLwqanfleJXo", + "yzg4umTCiOxCxMGQ47YUr/ujgODqWL2Y/VHCRiDYU75+7ZbwDe3UC02qo+nsAeAGVBS7nfQImRjglb/N", + "ZYVxytCZzXSS6EtXX+FFoovYOsq4+glNdWjJ0SsEpwdDpyh9PviHSBI9ZJc6S+L/Hy4L9R8VwclTJFL2", + "V9GT4xmPxehJ9Fcx+jL+UzT6y9M/fzWKvnoaPfvTn589iZ9FZcrx5y66Y2T1IwDuhcgMrfLJ+HgQRBF6", + "JjJClQrF+lU4QM2aUzUpdd5oHRTeStK03ylfJprHY+YsBEMmZ8xq85jMA/UTqOGYthGKzXprDawAoCKt", + "cqHydv33C/pIuhw9a5w43r2EpeRXU5LKZADPHYsMR/8xWk0GTJqJ4oA+TnL/x/v3b8IXaL3P4EOARc2v", + "nWsMOCXPORHeyhTxKMdiM2vrhJXxeC4ygc5gYaH2IpMNtdxaOGS8dn487wrd9EXxNRpmsz5FPtVKUbm4", + "yuHqvZxLtO1aHJzzNBWqrqOs0VO4P6OwJuE66EI6DJ9BRJItzyBq3IaQFRZkV1HamwqbfLNcAk2xDsAy", + "tLhmKcC/zhz6UDMHFk0pVWVrK9/STMdFJLKJeuSz1sVlLMnjKqhVhrQG5O1ik9tuJG9B0LOy/ImOrK+M", + "KFGDvQY+RCQDb8S3375gz549+2t1FSs46FoS6uZRXIKqy3Ie+nzmbijHu5x7Z4JXq9XC6EyialWq84kq", + "V1Xbeb0Y27/GRi8EjrSNYt4XvwhR3vYs0exDmV/fX73f2Ck7L/ZX1iSxzQV/okqLxqJ62aNLK30EgnJ1", + "EGqXu0NNl0h8lcztbJ6+7Y3c4lMyeWxxjVdyPKzqGSRDaGn2lJp96nJ02iTJLfV46zlsuxzpRgZpIeBH", + "JkycgcfLq4nH/elsoAn0kmU7KJbKEs8Tg5wV18qhscoADq+bFQkz8LvMDXDhSGAhXXqEiPi6uS22gIpm", + "c7dFbHV07nEhY7zPpiLLdNahxCybMWrm7pqqpXUzBUidsfzsJ/kG5mjqRWpcz3HK8JDDrQ1YnZtnQ1ZX", + "h2gzzodDNLeuxR3YppkSZhMh/sS3Y+UA47by53YTTsppWjbAJTBtHv6CR3OpqLArJpWGpl7YgDWtmhVT", + "9bbVPxQG3exap5xDAcRywhavpbXzvrbjr7s7I4LPgdP2vv1B59/qQsUlEvRLfcuNcJj8R/3FJnKbmqyU", + "BH7Q8P4tVEycy+Rc1QvOQ/Gd53nGI/H8yVPQ+fz5L389rvp4+sZfHn/5yW9HfZ5v3TxO7Ck/g+LePD86", + "wv/isMKMI704+vL4yzZ99QfaoXr4652vq90C8+2Y0FsAKa/fzTasZSjmH0vb1mVpEzfXrQN5371CASti", + "3DYCQNzVvdo3APiWts1qOpu15uhD6ZZmMN4rO5N5xjNI7SAiiY9865g1qNR6m0xG/+vX49FfP/zPR5PJ", + "mP7VUdXtx+ycK/k7bsRLUi2851dw5W3qBxOONErEhUiY1VWwnF/Rlesp2eYmznVmtQP1pgbdAciwUlae", + "dYWarL7A1acGvZkOph9T/UDYIBEzXuR6wXMZ8SRZBo/0oAOWKu2sP71bv+6KysB5bbfXtc1ELPMp5mqa", + "5vxqwxIo9hxXPYRe1g9opn3q+jJplheEgg++C131kC0HUrTeHJR+zhDCV+7HCng79iCtHGDgH9qjFGhz", + "n7pOebOCn8ArX4ucr1D/WE4KyE6G9ZRn3GYHwVfXXDAM3PB+oTOrK6+ah6u0QW0r4lep67Efh4OrkUkF", + "/yi4WY5ykWUcdKEjcuz02A5+MNWBjrccCZdRG2q7sWrn57sirG6ijgMJ7oXGqdCGEucLDkZapzPSe1V3", + "OrVPjTW3kWi9iFL3MLB0UgWvDn/PbfYRqJte7K5f/XqzihfYiTPrQ85tHKqKmQ9HHSL7zzReBRNldfH4", + "iRz6vKsDMoq0yKI5NwK1OdIN2RHS2p9B4ArWKZkIqoZKCY/dAuHfttj0EEf0WcQRgel5inGPKaBe/32q", + "RGy0olSQnQFJAyegwIHSnmPxztWJbyeIEPu+hf7leLuLUtk05mTBr6a/FRzPukuZQwdTXlOINeG6XQCD", + "XWjsHeyR6MDDeaJAo5mIkdNSeAaC1cVnUiRxWWOYKl5gR7Yoklw2ugEbEqqsjVGoRC4kELxbTAOoMZlI", + "YC10aTq1D7/ynUJnm1ycV6OhD2E568Ny1qmGv7fFPFp1nL0elG/QSpm/4DlP9HmLBrhLvfdzfcrBGm1x", + "v+AVusaaLKhVSnE38d19r3sQb+eFDtPfeWUGAHlL25PJ6A4re8LkrLe1Qau4w2Z71GAYNsMnPHdJGy/i", + "NrEGE/juwWZj8qyI8iITsdPH7Np285rsNiNvRsF128qsmxts8FZvFypSns+d0wM2q7o4IFM1R2mmjzKe", + "i4hnsTlCD7wjmwDtn2K5AiJMSrGRDekfYD8a3Yb9yO1TGzo3ws429l0m3QOFEqFY5qJCSxMguPKJjOc6", + "o+fcosgLVN2JqygpjLwQQ4x4h0g0wbRti6Z76zvHc8Zttu4G1qu4TUmyOMPUHSgjIlGJ2AJpnBdAos8x", + "qvvkh5e9hYPmftWCXlDMcn81GZTLGdyOtH7HmGtXXYD1j21BO/HbuhFtfF/P8aRaN540YWLH6pBVYWtd", + "kNDKDVN9dyzWwmDIje3Qd6VK/NZ7aNzD3gP32kMY9ib2UWdNYDaikh/f3hCRlBZi4k6MxmA04KAPE3Ox", + "s9fnZYrBihlqmSxbW/B0PWubqBpvYwfWdkdYG9UbXjsmtgoGsLWoDszxwBzvIHN8zVMGfVZwybciKjJo", + "/AaD3jZkjr63i5mjHQBNfjTXmVPoS5WL7IInbcwM2u1GtYQaohG6Fdrpc83OuBFWSVYDtZ6raJU7rHvc", + "2GERgOHALas/+K/e/Qiqr5c2MUGH7teN6xMYhBkLWJCwwMP+5snrAMxXrn/YzY9F/RvPA3sSwao+rEeX", + "VxiJdE2cwXAmCrO25waM0irw/0ZG/EsFHZyi0+fgw4B461MwBB93a/2XuanX8zlg3l3FvDUIZ4SKu9yg", + "tku6YXuxMx0vUaBD5TMqWHhLlYLOpM8dF6z7CkhAIwduzpDY4ZfAhsB0RlHaw6p7OnbMJyrX8Fu2ZEJh", + "IuV6+QKqWeAqeeDdSGUKKIbGNWFgC3HJmG0Vb9jiDWLBV3r/tblAt55lW4VqTGO5w6PMcxf1QuHbZdi0", + "iKv11+oHK2YzgdXRd+nx7h3dETaW84/CMJppzKzTi3FaKYq9oVqHlPyPY/q5MyDOiYImswKrtbH3WaGi", + "MIxnIRU8Pii8gsKXp/pCZK2ap1/mIp+LjNkGLOJZJoXBvzEBCQ6pxKXdRJtSpA7wRFVryelLxewJtIvJ", + "mci5VNOS/fpIt9YDdmCWp2mZaHlVfBRpbomKhsDG9vtCX2Do4kSdhod72gZcB856S21jD0/QTItZ1my6", + "xjC/WpApxAa2QfkRb6yrsFH3q43QCYx0f/qybqMLPAB/5aPfyQHwfz2f+j8e/4//CniyWwEj3WVDJH6n", + "sxylxnZudspNdMpMMZvJq/BiZrzq0Wd0ljOdxTZzromIo44pgd1pLKrDFCb0+YONiYXrQ8OMJ+o1GGHT", + "RNDgpSabLfiSnQUC+IXkmKx3seDMiJRnSBaJNPl4onxaPqWtgdF2b8JgirORn4Y9EufP2RczrcdnPEP4", + "vng8nqjKwZUWOmwQ7Hu5r22b3khjjSLJ0nKbevs1PLF2O3U+/37GyMDKU9vVXkG0pcjBR7Pi99+XlNj4", + "ce/HN40NbaK8TBzWPsVGL3AkbFR5l2p7b7N3AeCPlFYjCJ18/Ddy/Qw4QaXHRPEz2wNat/Oo87xrfdKw", + "czxx4EhcdW5hIq5kpM8zns5lZLOlifbNPM9F39l05t7Tut/ME7Vy6mTVOhNhzM4WmeSi11Qbr3D1tKob", + "U1s0FD0RVXcT2Fvr8Id3onS1OZCeRi5RuPfrQXY1ioVzIUnnGTfC2PC3ibIaR5q4HRLxW18YBCRJZzuH", + "oSXKpiv1m25BJCJNOlco8yzxridYdcYCRjRmJ0niM6PCsngmgleivQqor1WsBqzdrtXmLByj7+O5HlnY", + "aZVmXFHABE1GcpFqqoEKFsTB88G5zOfFGUYb6VQoihfW5b+PeCqPLp4dzVxGvDaeT4nrd8f498KW90NC", + "nxvilkAiorIqnk7UNRDVyxPO4AEzE2yMMGg9Mjfa7Qijg/IV27gIY5/Af8/qT8OqGC2KG5Lhd5Z3qa9L", + "Gp4MjzHdQyVPUyjRN5zTLLS5vjVYg3ROqyG9Wcfo+iEfHKTvv4N0w0WlPf3PTTsb34on7dq9WO3+7L46", + "yIiS4HK55EvDnlAOeHRuZnUv5S6X43+tcjd2E940OpM3e6qlTRPklGV+Ay65wWx8Ormw+RdbUCLjuZii", + "v1b7dsJ3ht9rG9pX+9m46t7yXLzgWbzK9/etn3XQnvU2kaojsYD7Wj9/XIyN07KqMJveGtNvu3ohuVSF", + "Lqppnn6t3Z1gd/iqJZNjcGWVTaoJHUvcfYIyavuwT9cP+6xj2OMVwz7rBOXDtof53u72O3G+sNHVXWfq", + "mrac6J33lW/zNO92Mbc+6M7TPAhWCHnFsHJMAVpXiLLNtNM4hbvrYdwA9XbcjLuZ0Ma5ZR1ncs6ZwcgB", + "a6xJ3qhAF/E0bD2FDZzKLsb76qUJqsyWc+C20wsPQ3FKgM5EotW5SzfY63hIVFjhlGwBb4IA8LVQssfc", + "DZKokImyvBZaBWK/zFDk9ddEAyFKOIbrdr8XvtT53KZo04ImXTbSwzNtP8+0bcRGHxhHOgxXHWBYieb2", + "EuNxNyGtkCBrmFu9FDzQ67D0x6ySUaa6wLAhQ1tvkDBGK9GfSsORUMu2YZ/w3VtbwZ0PI6qt/RauMZsL", + "4gXW1txwa95jwoewKCddYJAyBEMoKk+4E0wuAvZZn1QCkyDwK3Ym5vxCkqtOmWIdNGyUvkEwFL9xZ8m6", + "bOvAidwamCkN71lS2kCtXfM5fndJTNJMz2RSSX0yUZUl4Hgt2UrqyVKa5+8WsfE19Z5ffe36ttxUwf7Y", + "GmTSMKGKRZvp9tKZ6Dladl0NPOYdSmEzdUZxHbGIJ8rXP8NvXWUx6hvYVXljosLzbI7mAKmNNwx9OLMv", + "jNvuifKoYWcM7+pwa8KIpp1lQXnvEbVMjEMJDGtYWYcKIfn0qfljlV4G3QR551mXhfNWuda2Gc9s95vL", + "coZtG3co/Moe/aTkhcgM+kr+RJ4r34dWVfwADgzI3nyC7KyWjHllUYnQTeV49OcPkJ/qZPSP//7n6x/e", + "jN7/PPr3hz+efvUp9FRBiFs0ZfVi0xWLWY93wRZGtA1VlJvZ3PAMXFUDb2HbwZSdBrnajLs3v8EEzvhm", + "3eFdsckdGt9wGbdgesN5Q8PbSpObReMd29p+UrzI5zqTv4t95/d8pTBPAmYIA2zgpEbfRabPJ+2ZPsPF", + "bZzs80lXss+fUJt1EseZMGZz0yT2ajhXtT69Xsh8WUmhVnkjlZwMa3pmG1SYe0Ed6NZrEIn9Sre8VOxX", + "8Ll+9uRPfxo9+fDI7RgWNjMa65pJo0f43QIygp5mPM8XyWOoSZHO+ehp4Oft12PhBuOLVOJJcwe+lZnJ", + "WU1jDTsYDvM9fH7S6h8klXja8uITkVZxr2Gftg2bzrUS0zJ7WU1Wga9BakU3Hv3+g8sC1hxVm5wn0/Zg", + "9jf40cvrfkz6uStmHVC67cULPzOdEetSUWVI/NiHuXpKSNNvrnKRKZ74DHpblq1sGcnpnoMilnVWc+sJ", + "m8iJfhpnfJZPzVJF07nWH5vQfKPoXQftGLSbZ9o/y6ALgoKeiTRkPHQCuqEKfikvjGCcyibZcXKX+vyS", + "y9zpZCYKVSj2MZtrBsJX2MvPLrCwIFnKzsRMZ/h6Oc9s2nbnjy2NKWwa9xy8xOcurJREEGHPjZmlycUC", + "utmsOARbmomUZ8KBhmsqS9Tjkl0cQbDmavJNBxbL55kuzueNTThDdw9tHdrd+wTcA3T2cZboS5bLRacL", + "uT1Fu9Ae5+i35NonWdncDc6yCcEGpyniymEKZYpM1E7T55x05zrnhpkiioQxswJjj62lB6GeScUTBCJ8", + "W1o4JGoyFjz7CK0NIxiue/7NrUPxTC4WIpY8F8myOWXr8d/P+vbtZVvekyIJy7OEFaDcuU79ubaUH66n", + "rSR7na2j0sHqVlDPh1UXxzuu4jN9tfV1Yfvfh0viIeCXoePYDKlWI0ieyVRsjx/Y/YAe+0IPI6JM5FOe", + "SgwxakUUewbUlJ28eYXhTU7nCi80oYDF5wI/2kMylapwKTfmUmetWZA2RFGEZlcYajWIJK2KX6yYsSGe", + "2t427blRPDVz7Q2MXnap6FvxMH16Zu3KA9oYOatlwSQhgiupzmdF4pKM8CQTPF6O3MVtb9vnTi6D29Tq", + "oguKtU/5ciFU7kcfsxc6SURE9tpEniv87GwgqU5ktJwomP6c53ORURDzkdORjy4l6Y8jkSnjLm1UMTk1", + "f5NGyyurv1ZrxRn5B8Y7u6iWh/CrUvpx++pSxrtda88fbvyYw4HdvC2hduC+oVFWAPumdkgrQa03XvW+", + "67t/10F62dg6MrSha4BAWqhtSGN+5pSGuSZlXkkEExVQQQpV/uyOlLLxhZg6Q440PoqaGyu18ioiT5TD", + "ZFeqgAoqNLEWJNgpjy+4Nz3bsFSygHdEpeqa5Itya0Wm5rPchq+SKGbDV0E8B17ZJeSGjSvgDN4cv2yt", + "B2kHdqZ+N3+u2ZnAGFkmVfAIKwjvFlyBqjgTF1Jcmnps/8uQtdsUAptoHLor2Owo3BvlhZbAfRslP2YE", + "h2GZSBMe0dHYj1+YiVoUZOKgR0nGbawxV2whsnNEsvw5O4XlnQ7ZKdw1p0MqGV1kySlFFXLyyYXgQheR", + "Sm0QO2GQU/dkgkFIgDgdMp25wtPTueCxyMwpxYjj226BUcv5XMjMmSYNe+QfqUozGgj/ScMwO8xjqG8t", + "zxXK93ibnwJt4INSK3g1RgK39HkJoszZRyFSU90hH49uh3PCgVQmFzxmejZRUSJ45iLuS51xk8Sqa71G", + "pW/KIYBlc92SAc/tlcTIKSlbsktxBi8bFotE4g9WZBmCYIMJEiaK+qMc1lrf253cZqHqdgNh190AY/bS", + "/st9NSzWeJdmIhLyQlRQeKLQscp8Tm/gKk62qnsBubyDgTxXTBf5uQbscodpK0EbZjRsnEwlrBnzbl+I", + "zBpyZDZRXmAF5Tx4BbjLAvgDilRDxj1CG3YulKDA8SpPP1u6PDMWi5zPgNXH4K1jhDIylxchBZSO2lJ5", + "S7hhjwqVyI9w12mT2/nN47JoL8xpNIuScmGZyDMpLgROlF2IbFQCS5YwruKJsut3OwX7h1lLzd/YnKs4", + "QdVOGYEDpx5hJQVDtj1E3yoFdwrxG7mbtFwA72GcjoQZQZ1tz8hfLRyvphu1LKkDntdZ0v6w+Ont9yRc", + "uD1ppnch93l7uD7CYBNVC8y+9uXxhmf50lqVNi66dMKiUo7XM2cEEaZMeQ/DtzgI0eRTHhjBNpBtLbwt", + "52RXVZpj6ltUn7nfBr3nV+RtkC833CLXjYqIutwUOZeJYQ6uaioO5TzncQ/hOVRkqbZBpHyiHEEyayxr", + "udA2cv4pnVicQ4UliHbj3g8gd1kdLXhWVfqQyc/M9aVyJnJfXla6nYh1VFCem/UiWu358mLOs3NxEvLB", + "LZ8Pra8d7p2x/KPZF+wKMH0h8rmOsWoXwoM8vYSo7UBc3yn17cjQ1JiiJjWHegiaelqZeb1WognJhw2P", + "4J1QsX173erWGwFXS7Ax+99ymNJqvtsUQMNBXIgpXgO1p9Gz1W8j7BLUT7FToJRWiDH7Ba5GoxeiVKTo", + "pIBxDJOY3QjzUQeen8ETqrHC2mPq2XHv19SuEanEnq0QBBYSS+i4kIrn5Hqy4GlqdTytFLKFzmQV0xlW", + "kWIrjUyTnspC5MsfUEJu2e5PfX3Lt13ap+H247YuqhtBXiTaiHirVJ8nlRSflIAxthEW8DgQKsawM2Md", + "hj3RSeMeyPg+Aw2Os6YGva9qn4Rq0SzuLJjk/bwWHGJDIpqgt8O8cf7Gd9ALxWe9swUEESOd4Hft60bA", + "f6OakUku2k+vYEdUSPK7jKvceYsAklKuuF0rgCrW8FAPTtM5nRfmAqRajBOFxRibaFZ6rm0k2NFy39hs", + "FgHzJQje0ajtZ6nEZTfQTeHaQrhi622WRUyt6GpyyI0TdLwmJo96TjuI8JkUKR2fz1tIE47Zj6r8Cx+v", + "c34h2O8i0xMFt6XOMBQQ4DVDdlZQMmf7C3ZAIwmFAcLwOhiw5bCoI1i1OkIQ3WSlqcWvJW6C/4Lqd2FO", + "TpKMlKalWo1MOR4O1ZLaIgS2X/xi7ZTe0QxYHS7gIfQr5PFbW0SqsivdaPJSGnzcbCpZun6toTiVGMfq", + "YaUii4TKWxNSvvHfWOyGr8VAUCjJo+P/+3/+nyfHx4+tBsrmObD5vH0MW7UOKCgJXAmWflTtqja3vMx8", + "SToigULJ3FC9XBGzWSa8J42TpPDSMEAbydIuipJS4gAjcodKpALtkNI5myU8ZzMhQJOLyIHqW+e/Y5Ca", + "WKFymZDhiC9wu6SBCgNzXhhM7Lri1fctlbPZvRbe1skZsxekOE6Wpc0T9mkaaZNbH24qlTdR2L3Nkug7", + "bMyL7fp+UjKH0lAth+idBcDMBBMxhKxqu2U/GcEmA5LwJwOL4DN5JeJqvyEm2J0MkmQxGQC6JqBsKlIa", + "1Mc7ff/9a/ol5jmHU/eecMRV2Xmmi3QEeulyJ8bsnchhzFNVJMkp/AtV7vbKkwa33oPyN9RzIgwCOC9c", + "dIUCPdo57TGMAo+XenDnT26EVYhjhU13v2yIOe9qJnPHKb8wYVFcJ6v4XCDunXZZ8Qy7IU3X+yB0zA5e", + "Bx/xJPZ6JBBoW+tWO6WZn2zYO+ZnOLBuG/0W5eSt1YVGPQ14wclnWAfPD/dC98sE+fJHq0QvlQb2K56O", + "c1WAu1AXOeMw0Jj9hBpvpqs9JspPJ3MjkhmF5Nmcuj7R7FwAJxUR+mGG6OAdMBYcCUbE1lsaCUDm4ztU", + "RhOY+JTXBLEN8LNToPv04fpCm8sUXpFvKgEw2KsybbtGXK5ST1je8X1r0psTluvUWul9jCNgDNaPwI54", + "MN/waE4NwrLSLhUSqSLCUgB1AY2HuS8yvZioWsI59tIV2XsUzWUSP7YXMzq+CAMDFSoWGeQ0poZTbHCK", + "JDFRFqh1ShOTcxXzjDqvPnv3wLc9cP+amgvc9A2VFa0j9zrALTOP+FQXNcnRkzLdsKFYFAa+tjgEViTY", + "DQiqFH2bFNQl3rprvDWLRzDgcGDFoOlGTHt9VWg7LLLI5stDGtykL0w7gN+WnQl9ZCQ23TVbY7MVOByQ", + "NEOIDt6OG/EkKhKeO/IMPJ7coXp3J1/Dk19NozJBwAYgVrMLdAVYdyJfK1hln2bN/ayqpO6gmUDSrgXk", + "trRqcYPtw0o2onUH0F4YiR987b5UWM+mGsnP78a4c97OW2VsrFlmXzqwkKxQiHSwA5dAdHjuXy0kQjKO", + "OjHogY5SpkhT+4yk8bjyb5+JwtPNNRMxCX7sG/vJnoTz/EAOzt2cXxh2ag8CtSjkgWjTelb8RV/eX5+b", + "LVJZdV/2a5JadfFVdxHQDeE5bCONRZAIazgARxcZicAHciN5ObR0tINtJ3Da8kiT/wfKwqUz7pCZlCvl", + "Vcw8S6Rwoa5kQ7B+egyuOPdFqJjxKNMGg+/goGVOqyYDybe2jqR72UqsT0ENApU+6vCpPBCZLReCK8NO", + "AZFPKT4NNCg+Z/5prk8rMaKVNa52wnduN8QRa8cU8M6qk34oxX4IbkxyjdnEjaZ24CHq9r5GtlNo1QZZ", + "G4UShdqPzUnKK08+fdirgsRHb/v5hvcxgAZpogns9w41bZKIwH8ePdLJ5uhd8LSyN/7IrYR99837v4VO", + "gYk0uQ/KNKxQiTCoUQVzv8RUHlcpVxD0wL6JJXmjQekZd4WJ6q2DUR08j+bEVU5lfDqku8qUChKFv2Nb", + "qzwh32FqZmnOaU58oGaRO8CDbEpVtHVubXiZrRJRrHUWzqDAAatlp0SMzvqxzARkzehv1Gi8+T9VQ/bb", + "Ei/iNS83p6x3rt96knJTgHOzVjmP8r6k5aJxKwzWT9zFWl+GkrvVfDsnNLpVsF4SlhK2/KfNJcZ+W89j", + "h4PLMLppc/bkXAxWhLD80hrqVF74EU9zjOfmud/ARj1Gtww3WIsRy+7tsOS4/rbwi1x7NzTWcz2ddcN9", + "qroHq5bevEm2PaqOcLZ2QacDUvKLBczDXI2lRje8TSxPIqndGXJqUTth6JolnyB2h9ELDdq5mLGOCLZH", + "vMj1yMbgDG2sCkkDj1vD2ybqUcPrasjighIgPx6zN2EYm+vFTBHNgeLKvhPlg+OGYaiRO+xhLWQOV2MZ", + "cBsqdykLeiDta5GLbDsxBrvehxDaWC6EMlKr6wSBgLYiZr64m7hK8dC0wlgQcZUDSAg4GtXgBqYK0aUe", + "j/TdPrkFGNZ9ZTFb0M/mUzfS5GTIxCQ5imzD+BWf9ibSmajtg/ex8Uv5r7HTrTQO/z4+LruthD8GaSxt", + "wUirljPbofaKAddL6+iXM0X7/JT0ijvO2fiylqgTFYk0LbkFVNIVvQg++C6UYMvyxBuEstVOWcbH5pXE", + "ku2H/cYpkmv+HJkVYVapLsHRoYfG+dsEM83PMiH6tIZmw8F5xuMCLq8eXb7zbYfoddCjC5jLB8PBhU6K", + "RR+ofqaGu9G3luv8NOzfHnZxg/a4wg3al5u4QSe3LR9W4xfCvhnPgC42w2wz2hcdZnbhDITpC3A0x3Bn", + "lXl9DnqasZcGpkyNG7wAkFQ21bBYYdkud90eI3lttseZEF17vO06AYqt1rlmeSV6brZG34/lEjWEBLI3", + "LeT0mEQtqPPtIp8nHZQthge/tEI39ADhlHhsxCleGeNbDIuKBRjL5IXriVpEYbAXO9MFvAOlMGU+JvJy", + "AoGTyYbKwBarDMvnD+tDTdSjIp1C/DviyWMUb61ARdGLkYbgQiwqbp8/6PTWcujShva2nDp8csfumbPd", + "TXaSs0RwQ96gCJ8sA7c2VDrgcb+3r/KFVK+oa1AK6T2C2VKUZzucLa+aLQmUtm0NAr+XGztcnTidO2xo", + "YQ+z3HsQAukCw3ZUr3miKmdBA/i9Zo+AEU19Vm/00cO/HnvZ2YjcpUzfHDdDTCQX9hIPJ6o3IpZQbmXj", + "pruy3Qjv+XuwKxYziLIp2iNmWkXBs9ohtVDoilMxzbcMiW5DSl5nEXSBty4CRu63iFRklb0uOZltOai5", + "ELatIzjTXVy6P6Xo3aRiq1LwerSyahiZRhyKlVngaXGvZvhuwyCW4US5D+R3JtRIqBh0pWTVMcSxH1dW", + "ihC46daKx3gSm5FuuZeUQsi6Tjj3U7xu6mczZusvBIJvOFFhR9IEW5q0BGYXJ8EpWYzPx+y7r4O8D+xs", + "mYN/8o2KViXW7lS0gmH3K1pZKXczDKBOTakD1mP93kOER6rkznDoSyR4c+IooHl0s0oSOvuJcoJJEEd0", + "byWL4D6772IFLWVfMoVzN7s/FQ2qpp7rqfEDM9CGllWgjnd5VkR5kZHDEMsEhzpLyTJIg3Ua5jU4pbsE", + "TztId6tttepaaZLHQ2bo7eAtKiYHGx1qqStVdEm1x04/iuUpxn84e6ZzmKa0WErnmCLCr96OS0XRaCdI", + "Edrk55WcFZvbKGqJL1qqZdE35EmX6OwdHoiZ6yKJSapUOZMzpoTAvHPeO6lxb4LiVvqiFc0cGc0i563a", + "1O/FOU+sLjXrKN/VPSbo8GR8nU0Lk2F0hYDCxy8MSxDUWo6IIgxKcMktsIQopNpdUmAeJn2ZKAqTsgF5", + "l+KLTNAbVqKwanInQGkjKF90c+BVQtCh5NOh5NPDLPnUddfejcpPP6VGZLmt5b5V6l7oygoc5k7bHF31", + "kulmCaxwfa9s3xU5q8Im1eKLxscUTwbkgTQZAG1MBgvgPin8XTnRHYx2/71V91XHu1GmtVe17o5gpwpK", + "ra13bGktTZ0/3kue860TZoeDrKW/lnTym14ftSkb5T/atDT4xKs6MmLiUw68DDL9t5Qv4GlKEnY95jUT", + "C30huqoegOxad5r0kbAT5UJhWa9I2G8a47fxTpug+pobSUm3t9o96tprx2zTlbu0abywhbyxM586cd8J", + "t3Qbb4f61TF63Dw2OdQfndk6KYUj5YvDxk5c6MjMe0hBvx1v39y3M3wMddy7CLx10mn4crqHn5uZDrsm", + "FE5U6dq+nfdkLTXTmhhyN35L/m8LUdd9E/hDeiCHHsO7rxzHbiyc2187LQOtJUCeplNX6/M6fLJNcZCm", + "JWd0yguvFK5/hP1wSQLcRm+MiY5zrZDiW54xrYH09s1SZowOOVB9BGfOqL9Nvq62W8V83WZe7+jXnvfW", + "eRhuKwMDZbiONinKZ3t0VeWzn1fA6N1KVwLrBjrcOte4ddJMLni2nIqFrXPZGrgMTRg26cSwapQydvgG", + "x9xtugeXTOw+5HvovnLeJFxdQ6vgu98HzQKotqZpwtU0nXMjdhnvD3H+Fl6YgOEE5L9cZjGlFzAo/PVC", + "GMYvuEx8ctLUpqOreBtA/3K8bWh7wa+m3vjdSlTOQKl8sqxcLoQJIab8Tx7EMiUswDZm3+psomzMlntq", + "266G5CUKpnFeJ84fHzoy1IY0uk0UemPYlkNWKFeLxC2mAdR4EKQVC0x9r/mV71SyAKz/RwbCO+Kh3SJH", + "1hF2NRlvT8GOeB+Rh/ZjT8XstMxxOF3oWJySVXYUiyjhGeU48/l/wNgFingnHKFxjPtTtAnw8fFqPPp8", + "YcpovHIyBpPVnreHAmO7uWcBlTq0diWvMTZzrDcFwPlkfJFam041r8IJdWLmUubRfKJ0FBWZda4s85lS", + "Tk8vMZMLQ9XwT8NsY/l3gn/C1RvHLFtN/2/KNbY4AKSZnmaYI29qK7j0rjGUZnpEXcl5DHsHb0bglRXZ", + "xDd3M7VpMWoEuLF8UuY1fd0uBb+rEl2Nt/9SYcOVRHY1akWjNr7Ps4ta6GXZ8LWzgLRwO3sm3UzOh05s", + "w+ds517PYBv30EIkToTTM18KD6OYnBnQbIqvFqyTNLVDDz5Vn8YwRTgD88A1kffAE3d4+VYQoRUpu5PB", + "Ngvm0DdMsjdYy6J/FpmRWn0rk3xzR2LFrGzDLmgY9PDkmTTAqb+54hHl+hQMRsJYZyeYORVHkyrEb220", + "kEc2m5WAUd18lTKTUuXPntYls4YIdp6LleO7lcBhJzwv12a2mCzZYDLKInKt6XT33mlfLd+IyhSegzTm", + "ao6/4FfukrOZdYM7r24cayDxz1rGQfrvHeWZvdAypjSzYXBdE61snPCUx/8pTL5ZUcdKMm8EHtZis3mf", + "lAPSjWfv74HSSjQqT/xDX5YgY09ThjBTwTmR8CALNS0HvX2r2XNPYXwUkkEHrLNcxM/90LEW5OBFc/ii", + "3EM3GZXC0pl1MhkGV6xvg9StcjMktw1r/wqiq20F8leziXJdiGRgDxORw3zVMjQERuxceMHjyOTeLRsH", + "7shS/Ant9TPddtsIRWHOWHUrSnQRMxVGy6DiA3dclS6lNrUM+j5h7VoqiD9RS11Q5bhzQDSqBzVkvxVQ", + "5gtHolEp/nvBFT8vb4xKUGcJGLT8p1YK+PJrB8ykOD5++ifm1Y9vXkHoIJHm4PngeHw8foJUnQrFUzl4", + "Png2Ph4fA2bzfI5IfQTfEKYjHsc2dvq8rYza9xKLEibeZWCAA5MXyKt48HyQSJOP7CgwRcZxYNNJHWWT", + "ozf8XLzhcMYw3L9gqzDer3Yz6Sz3j/WwDpq9c1OtjBizdw6dmcEOTn+F/ujPgRJGmB8F/ws+jvgPLMOI", + "/7LpCaY8P2WPLDk+xi82qTR8cT7Tp9xEp8wUs5m8qmSY5VXzH4Kis9himYmEAkIj7DmFdZ5OVDlM3TmK", + "oyhEfWgYigZPExS0LauTsEuIaAMnrgxg4sFwQKxonbADO+x2f2DyJaIhMPaW06Arf/15DNrhmmH33pAB", + "/qH2zrwBtDE0ewhmLET6oyX2D8OBmx9R+unx8QDrCiFDsrJzYn0aj/5jSAjtBwlCESCsiN/aqYjJ1Mvh", + "nAuWupbBrnwaDr48Pu6azEN/9DUP0yp+efxkfZefPG/GsNnBl8fP1nf6VmdnMo4FqWVNsQBttCd8OuTB", + "cJBzeGv8GvCmN5mOiyhnL3jOE30++ABPU92WlvJFmIWv9LGpshGiPmIkA5J2hcm/1vFyZydIcFRUyZ+q", + "kjW8nT81cOjJbnGoDV3wg894ff+wxR0xHm5PdPk0bN5DR3/gf1/FnwiNEtEmCb/Ts9ymo/Ia6yWTcROr", + "qJHHqtrthPwJLsWSPdnpB3Ws6MuvbAxCkxF92fKERODuyXFDjy/X9/hB59/qQsU1/GieWG+e0iqWfCfy", + "NSd/LvK7cOzHN8U7Pk8kGg6+fNJjKd9pJWoYV2JI/9ur6MypDDaC1fhGMuItodzu78oWZ+5ed+WN4btX", + "kh7QPkR7h667u4iPeBbN5QVew+3y3Qk1CGgkULNVqcSO9aA4s309PoRr3mNCBQ36oeFwcDXK0mjkkqZa", + "DrMGOdPiLJFm3o2cb6hBH+S0Yx2Q8/NETo8Je0PONB1FtsdqfZp3q+Fp2qlSC0bbiV5tr1iWpnavQLP/", + "0LQk4B7sT6qJTSdpagiFCmXyMvyhG32O0NkoSbrZ2itqgGwtTcs0lHaAJk7ZEQGt9qRe8XlkcaKTNL0l", + "JUsLHN0Y2Gx1j7UwHilaMGINZjaZ20b4+gdPUwgw/NTJ+PA9pkJaoVoA4D66TEXHA76cYgSt+13KBMrW", + "l3IZM4DD7Pd6DgIUSv7Zel1XWjyE+xoxpgNdrsln19i7LK8U8Zr7eb8GrzTdmbWrw7R1MGWRKWvlTuM2", + "aTYL2p5Ztx8ex9h2psEEDOtCyBke+HPb5Vdo+uHvi6W9endlFEvT2zeJpenDE/XMCt7Twmnwalxjz/hJ", + "yao4d7Zkr1626BhVVYrrdRcejBm7vpiC40rTFdjQchMNVwpHlXunUyK6zYPfh+DTIe08IBFnFUdZa5ZY", + "gzTOLnHjeLO3B6Ytsr3h+/ImMfcBKdUcHm7KCLsvyiMeOe/wdtXHN1ciKgj3vXsw9fEFO0OKQPHUfnde", + "xCDAe1FvoniaQv1GamRO/0aJzC6lrRFucZliPv5jXQ3rdCYIKnyy2hV8JvR2kqYnuKADvd0+vXnkT1Pm", + "0WwV3WHSPcWTUqmTZvKC56L8YQvdj3WGPXL+wavf07a19ybGN9VbfHAZxuFVgE7m/jP7jgMBhl1sAdwL", + "kfkMcRgDz07p7XQ6UblmimeZvgTx2eQ8L8zQhykPsYwTuSTXinVi4U07mNFZfopZfgB1M53QS9UG07do", + "AfwG7FET4PdgC22A1wRgvlHyYF3p61qtnDnFzTl4vTpVwfqjwFIOVK3Jb75VBBBOfvhVi98+/B0rkg3p", + "WE7DVg5jpzL+8PfjJ/988/Lrv/xzPB5XGvnj/PDreS4+/P3p8dMvR8dPRsdP3h8fP8f//ft0d8oGWxvu", + "1hUOFo4HpnSos89Wju/CAXxlwg9rWPbRH/Zfa5QTL63XXh2MsoxfvdakAaJA/LZs2AXCBxVEE5FTYEVQ", + "tjhJoHae0d5RMEnCAuplQlWMi2ivRNjpAmqn6SWU+Y05aE52K7104VJfjF6lPqmPaZVooaiButoi8fFE", + "PvwmKP1QYtnQYS9V2jdDluucJ2Y4Ud3457Nht6tv7ggWHu/e2ErrarWw+r1+EOqc7XF7paKnm/0CVi8K", + "qiBtq6naeGSH5pb9UvXl52F09ZBRNPQQxDHKCBfKzI38crZ4qU5HVImVitCz99UfQFifqFq56r+xntWq", + "a5Wvq7WpT/HH020LUrOyHvVE+S0pC1KzHylR+ep7zL43O5Vtt0fl+3AEDsof364GoAeTeYCat235TX/p", + "8MiWUV7hAUwNOriU/WoqPMmGKStxlQdshgKD37sP+De8EH3GdmAnExUMBKXXKcDZEekK4bCDvCcKs7XD", + "k6pG6XblLaRuvzzEG/39vCQ0d5x8RkGhsCk2gVxeOcXP2evZYn8N978w5fKLvo+2Xo6mq4k1hRwZq4iV", + "GnQQK9ZqiDgKySbnmDfACBW3Uq9PAlgYKpsWVqRplKLx2aWDOYytACIVyy+1H5/2zGtQkEqfV4vo2Oh/", + "A5RfA2dYaUlMxKa0myiicxh1wVXBkyltGE+mVAxmy2kmqjKPZSdNtkGbf2AbIdswVtVX29/POR5SqHgV", + "Qd0Yt8hEni27ecVb+OzPp51jUJuA9c9F7Xw5m5F8zvNcLNLcV56zZjl72UZktPNFLks+SuyAxHzzhe3m", + "cjba2nEkFUwGuKLJwDZqXtz4/UB/4fnglrijc/v22dLe5vh6Y9TolEejsl5mN236KnRlY8xshFlmRmeY", + "BTUoQlW9ePFec9PhFtRGgUY4EquP5M3mHWKDTaro73W8vMeXXGLKwpnOprVUQGCno2JtOGzw1VroLH8w", + "H2WaYh5iX6O1i8hbNvJA8k6icfX+VuFPcOoTRQj0Gd/GPXeC8H+X3CCiSryrzee2UUOVbX8HbR8Yxpel", + "OI4FWHkmykKDlAdXSEwDilWnZ0IwyIocsgs3U7ut237dp6nbLWmleXVb1/cW+/YYlIr0wddzCD7cEatz", + "iAClK7rbq7Pg4Fd7pE9Um5H5VzBHQ1KxZ5GM8b/ilOms1SBNtutq42GtbzeYTkHTE8iKvdypiIHjX4jT", + "zjlmgudFJoasKJ1DfrU/9l0B0kW970exrHT+KJaV3v5v2oB3gpzH6g4ViFcObhJgZ5gmDwjVkJRtu4yo", + "y0RdShXrS9qlHebVsmXA+xj1h00nvBT0bGhNo1R7xDJ9Ad+YCopKYWo0iym2K6SaCZ5Mc7kQU+RFp8+Z", + "Hb1kcl8AS+DJCFoRW/4bkzkzIidWeEo9yTKHP5Ctbgy9oNMp7bUZE1OwKN0xVclH7avMpiW0NVJpDIsX", + "HUPYrytHCBNUdwwTNlk5FqzT5mQc25u+HFLwaM6CFlinuPrutGNOVNegtJ/dY7KsgHHtvp82B4itkWZK", + "Fpy1A9Xa9/UAEjhqhQ42SXZsaYJgG3yq5yetc+x9incEygPzdSlljL4y1ko/RVuQR64VsXy7Miuqq2zi", + "E38ujS2Y2iYblRPtUzwqwbxmZGCElRKqrn82FebB1Y9kih57XZNCyh42TLVnhCA0/fB3unV2eL17cK5z", + "w5NWsvdWWOdcr0m6oIp6AFdcgEol0uDRxo1EOfA5I379d/h5ij/fEJ+39bDuBKO3sDw0Vh+yzCa3L9F3", + "Iz5/ZMmoU23ms5FSQwfGEjgW8jnL221eZyoyApS71EXG9KWyHSfK9QzLsAUl7DsynFJvd2Es95rr1FeX", + "wzlvNx9HFZY2tK62uP/ZUGsItgcsP/rDDW6deFe4R9bRvdU/sYmc63WlJQj3QFm6MRbeP+yD475h1DuC", + "6xt1iOvkbHv7OyNDwH2h0loVbGnrAGTeg9HXpVfBQKjQjuUMFQ85OxWzmUDJw+paMPCnS2wv4b5ZVO+U", + "Ost19ZU6yx6g/pLc36xLqsazTt3m9FyS51Po8OHvP717uUMxVJv8a256S6F3LbWZhV+az1o8u54BpUbb", + "27Cbtcnjg4dDjXV0SlqWuKW5jXtsbzKdw8dbFuccGK13qPv4GQhxHu12cYmSXjm8JFt1Sa7ZXlVJdpJd", + "5ZhC7VFNo1Qxvh30SlZLtHbj62ol1+FsiVV8+ymVwF4FWafis5GMd6lVstDcdiyoA+TBaU1K5tDGjtzX", + "sBzLCj0Env4+FRA0yW2rHuxSW5979O1zUTd0+I6GiNFxKR394f7ZiAhujagN5usjXLmhDzG1e4mp7X36", + "w3bJo9T+3IETPb4VDvBAIlQ3wJS0aMEUqrxxq8iyr3onW11Xt4Osh/onHfVPcFt2ehc6n+3OV1vIO0eu", + "8WfLQ1/ynK9CTdscmj00luqtgDHs0db8NQ7l89tEqH3z2QBV7gbL3QS3Dxx4VQWq7UhiE3aMBQhw1Od/", + "bERJI9/xMyIpqA8QIPGt52pcR1G1Jgdq2oyaeJrugaJMnslUHEVzEX3URT4ywmDB/x7eNL++w77she3L", + "3lHfD4/meZ6a50dHsY7MmGYYR3pxZEu/Gz/d44kCy04lBBgL2OMchvHG4GgJcvFi4HxDQ7KFyOca9Kqg", + "iiVvnllGLjt2/aRHtuuzTj+UEWIyMCIv0smALXQsIDJNRnM3SVl03yaFmiiXzwY9V30UvDsvuViIWPJc", + "JEua0g4k4jqwZOKGeBxBIQGzAj3IKy7g9qBwW8BgPteYyNbtoFuQGbJMUFKbQH1sfb292vmnt9+j2X2i", + "xOJMxLGIg/6FTX4bJVKofGpElImc6tvLXIK3tmB05OP/4L6Be9REBaxjjQeUyEaEDKM6un0ebLkmWdBe", + "Wa2oXbDF4ttVjp6k6UrYTJHkrSIRNrdd2zrdL43qDfJ0yzM7GOZeOHqqs5wn/fm5g82xsTfY34GI7Ocn", + "I2ZFAhzBs5oK57PcpmOkXLMFV2CRyedCZhNV5YZmCPxUuc/ltRfHmTCU44dHEfyTGrh4lrk0uc4gfgVT", + "/WQ2XPKnt98zOasCWM9OIg0EeX4kOyJntHOUaFnF5dXRm61V9/zzZ2rOHofLvpOsrR3CXgyuu+uBzfVi", + "c57siCyY2SW36xdG7SDojKe2Db4wrsm+Aqkdp9h1RPVeWcohYnuHEduHUOi7FQptqeQQEn0IiT6ERB9C", + "ou+3I3ZN0FknY23ujV2bYf2TqFPQuY+PIKcogSXdsmMbwtD6eMEvn49Tm8W0LVC53wMiE7HMzRGP/1OY", + "HNXSKxKoMmrOytY+M7h1Q17wj8LmFw1aGdIslO+MibIjnfGEq6guLBdGjCJepkH9CfNRRTrLhCv91E52", + "OOionPizojtc3Ilf2y1TYA2aDkVCpc1nrjFoI2PeJJl9k7IlqXVRsVX6WxEUC7cY0ZUb+WaJatiSm7XI", + "6LFdXQXjtgKENCyXC2FyvqDEyy8puMKU6WYpczq0GrN/oO5URjzxmOne9VB34UKcwsi/i0xDlmNeGDFR", + "8LPlzUwuUg6PHp4JSgHJL7hMqC6FzvxkFkrTV3z1S+j9onvJc/FeLkTre30HL8bvRE40/TUt5bZDISq8", + "yMJkujmRa/FwSrKEmr0KqeybCZ1n3IoSK/SSBBE17dIYEuexw90449lJ2JlTjYXL7VYb7lC3gxN+h/Pd", + "etBSCcvhFbvmFRviye6fsJwpcVmZZMxOKn+XOn+DdfmTRNOZw+WaZiLlMnYCfE2yH6+RzHH8z08oR7y+", + "C/I4AtJ9AeLnz99ud/zX9R1eaDVLZJTXKLCTSG7mwjz6IyoPqkdqm5CK20X426O7DrNcuL774Pzfn64e", + "jlR563RxZESeJ2IhVH4krlyh7y69lfUlBTHLeduU/Z1FUs/gsnODJUs2K1Qs4iqNWf8femK6BOcYfr9U", + "0TzTSv5emwdr41TH9h/Bg5Kqd1CKTWY0Gd4zcSFUIVgmIn2uJGVlUx4W+7yUicyXWPELLfNXaUeFfucN", + "HrCCkYNlVG7EZ8oe9lUZMKD8b+xmvvN7ectBHf151sOrG1iRdD1JNvjBLfG1Cy3jbkb2s5Zxjf8OQcU0", + "E1hjxD4kF5zyNhbkUh2q2GEA+CQN1HrR2SXP4lGi9UepzodMZsB4MiNBc+V5yJi9sKI+TzLBY8iupUyx", + "wEJnS1srgmZlheKYhEzE7P/+n/+XlGFVoCw0TBoHuIjJQRyXM1EwhQGGdgp7IeJT7zIyywUCbMbsTYW9", + "SsOUdipWW0hpok4tm52WqtdTaHqqtBKnQ2C21vI9OuMRuD/qzCNEsiwd1r2PpmELDh4sUELGfsXV6UzC", + "IzVhfKELeE+hC+apdVNxL37n507L+hu7sGfBWUrpWobAw4FRDBl6wSdJudX+ZUZeW5xFVn4d2zpUNJIp", + "0DcU/FNheDxnxWQsFqnOccOoQfOSgOYPQVrc/XUANNX+DDyw+vvy7EPGuqlY2yxyc91LIc+4MrbIWy/d", + "adjBZ4cLIoiclycwgYWtlQ0e5plWOtHn1uQR6SwGGdUOutAXeBOa51UZ2JBLlWdJ9tcxex9CQU6jpXKT", + "rhRRm1Rnscjw/rB5r1brfysbc9e0wC+KzOhsUz1w5ehuTBscHtXd0AkHEPXSCtNuP1y9cI0U9iKkouMf", + "icMjijbpl7hv1NLx80kHEfrLflMu9ATX6VC2K+wXj7DmbG/rBFj/UAruoagebqW0B+KvF6AN82jTxOxg", + "03tHSDQx8sjt99Ef9l//FMvVmtbGuVEAFkZLSXWe+DNc40dx6+TRLmWX27D1+G+F0UUW4Rg3opdtECCG", + "E3YHNa1q/+CytWxFb7u7TNop8AijATahw3AZ2NmKwHZQxkFZTSpaqayvzy8UtQ6irOO/wTBDJ30BVsRC", + "SeGpHZizXkgbZACu4BsQO0I3OluOLGijj2L5eZJ+V3QIdCxyEZexF6sDQfCXaiSEUx3ZDASoVWe4fS7C", + "hHa7Eg4yUXYomviGQgca3KZvEEFj+0AzVkFhuHYELMmZNCrEnI/ZSl+3nsvn+Q58zm72FviWMPlnOOxe", + "10Czw4O+B4iBltFzjFjUDdwKa1QdNRy3Lp6ipeivq7tFfZBYqC1olfGQbLUNuPpBYdq8B8v8H81v3uBn", + "oAS4yQWP18W5VlZ5P73XMNi1sv/XrcBXhrnWsqZbDeUha3qgLeq389VQ2EqfKkX3DrwNQ14hm7r9+3T3", + "oachP7ltlVQAy8FNcXfq9c7X/pbvjnUujqrCvVtza52U8IBhbs4vrO++VqLlYcBSkflHPjIV+wdbFFAn", + "AyszLVKeo+0UKzPVLxF8MlTWBjMrnWOBJx3LmRQxWTnRuxLxd0hAUebxeH28YTDh5+RmGeza7bpZBoCs", + "ES8Pbpbr3SzbWMINyZxHfwR/NfL+tyXVN02xUMHpXuiPItQJytyUnKLOZnQST1RPPoMuCgt5DuSO1n37", + "O7NYbyYKIXaeH2kmLqQuqnqRmcxMbmOgoK1WQaYEy1ZQFPPRRszKtiA7Z2KhL2B8l16KnXhtyERZxwwQ", + "BaQtbCd4lkhMdiOBwbk3K/lM5HDqzV10ivDhRBntNpKyYJE5UYEJkWUizzS1bPLBWmmGW+SD7XqWCrId", + "KkHcMvuplY64PvsZrvDSrgoj9cfr2ZK9etnvWUquoqvepazzWdqlmXwIxHF8i0LAgfqa1Nelgrqlm79X", + "rGLuHBQNk8YUNlPtatoeM4q9IxFeXME4M51NVIvO2gzJ+VswUCCBikIs0txW2NY6EZw8wOHKlVGlZ3m5", + "OzdBujXFFVakj1mhEmEMO7Ul6qf21kdnSCPyMfsZPRJxfOuBOFHBQDy55EvjKtzHQ6t7WeLHlGd+4U5B", + "74SF/sqxWwvw3Dc32qkWbl3o6E71b6OwoLD/BdHDHDR0MM8rIgj3OPf8oenC1QfMGnVWILY2I8sIbtbS", + "EjDgQ/juTenFVkX/bq0dewUXF+M0tjWVt1xFzWvs68YFNFFBB6/HQiUaQe6vM6sTApLOxH8oNMAq5BZ4", + "c31XXjTeRZWYAnnTQ0+OOdpzXbllZple1HjUcKJs1nqvWHMP0nzOiS5NHtxYzjZKQQw2n+YmSrY75Cu/", + "eyl6b2mU6zyF1EF3RrPX6U5fb3PQ8W2n41vhY38D8r4VT9d6GvmsQiq2DML27PQ8Ib5F+rCYZaDBmiiM", + "GUq5YosiyWWaiAq3IfH9lNK7inhqp4CoIV2kxraVKteM2nj7t6VPETMjfycoM5HqDMzTFfDzKt/DJJs0", + "1pidnhUZ/EuVE4OQTqKbhZBJ5fiqFXEuRSbKOACpQDcprzCCKhbZkOX6XGCeaG8IoWXk/KNwFUkEd+Nt", + "4Eflju5zfCc0/X4qV1UFq5pePgk3qG2A99z7rFAR8iX6OFELqYrcXqs4APNYyXO20CZnT46Pjx2K9ZVZ", + "4SR3k5yquXih4p5Lrybz6lq8ewZLlCi2dYzK9b7Wi0RsF+wovaQcaYghILnlui+4NNAUxt4aQ5v3I+VL", + "W/6Cg7+Tv/dd4quTH07IHvC7VqKyUtIzyHOF57ZJhrQpjFU5FPvihJDf9y8G3uPO5JlU57ftpmb3bo10", + "YVsd5IoN1IesvBxuRazQFyLLZCyCqnzV8/3RNlhnEsBLkzLQaGV9e+aikU7d9hYq9pEjrg/dHMZf/Xwh", + "0DSA8eJGT5QzsmmVS1UIw1wxL87OeQovvnzuPBsSrc4tL6WRvHHTZcKg8mVFep7x2IaxgEhBf1LJLnTY", + "lU5waV1IrAXFcaOmdAgsz+pCMB4ag7wZACOg3FaHHdAdwkMydhycLg5OF30Yp+c/d8n4giJrd8aLt/A5", + "kINWv7xwMM/8kBuGb63ntlYNk5TN1do8nFpdQ/0K8DTgUaSzWHq2JzP8iN+MyMHhwthUQHY0mpgXuV6A", + "egzzR3hXh9i/uipqJs8+y1QbE5VrO5bMnepqaIuD8AW8HXNNclLDjcI/tcIs277Ul53y/bz6+mRcRXOd", + "uSzeEPkdV24NJxtXuSyC2P5Cw9EPjLZ/7Ixoc4RFxFqZSeLg8bER7yM+0io2Ooztw/52l/JhJVPcOBLO", + "lwTMdHE+L8NSK6FtzjIHxmgbQATEPlH1ILkN49oegDbmEMR2CGK7Ce1A/+i1Q9haELa2C+HVao3MUc6v", + "RpGORXfOC2CHOjvnypapGtm+o7LrHrHmx2BmSybv+dULnLYFZ1Y0fyiIE56V90fJ+RVzZ9VEHsd/ugzs", + "RQta2DybPTBjXzkpV5z1LWWk3CGyFqkRWf6AMlXuGm2r/K4lLQPdn51vcfSLKpMrYB/rRoJOi3rmWbTx", + "WkufJDcTRicXwtBLOM30BTodyhgAmUmqsFimL7P2TF+k1ussbdCBC+oqraAWMDNkaVIEfmjVwhcTFWbP", + "RTCnL4Vxlgd4BcPzXcRMl2bNTMwyYeZMqlxkF+DbZqU53DGPkkxiZHAuVBwMFs1FPJ42ZGrs2isjzHbp", + "x/b0Ym0IhTjdLXGXLmC6ndLelyjD5txQPkwRQ2jdfSkQR2S4dQqX5hO2mzH0cIpuhjDRmyZJPCmbMXvl", + "iALZRbyQSpociOECS8eNMXo56Yr2989ZN2IZpd8aVDpRboHmb0CGGFixdbB/hxvz6tD+Q+j9IfQeYntK", + "jO0beO96QKHqvx8/+eeXv5z86/i///rXf//7+PXLP3/1j///2ydPnv7jLzsMxD8E4N8yR0dmev2o+G42", + "3hbs2jdgzQaovd+QjU5UnY+uDk7b1Ex7iBm776/yHRsfxcV6gUWqc3orUOOOmx3Hk+p8ZIfckUDeec1c", + "bHTBXLirxRTIj9deLPZesc0//Cp++/B3r8x/ssNr5KLvBdIh6FzsQsShAv9V4cYduw9jMrnOSmHnl7lQ", + "mNoPXU0sGDwTOA0UUFjSsCionLJH6C6ZiciH1z8eMxyDYw/YcZFg7n3/yi3da0gQGqJ2X2e5CaSfMTtJ", + "U2FflqH0hWZhWrNriy4xuRewbEPm2gWD3rAwtU9W+sqeI2LaZ5wsuikcOJbEPEty/PK1+0LkN/jQHf6D", + "u4e54HEUwKAznkdzdE8grC95CODWi0QXtNnGiuv23JqMk0ishXX200FEMBP1+Z+b4YRbP4KJW9cx7gjX", + "2jJ6L5NYbZq6Baw2bXMSrpY/zjovj65ZdgPch15amadNjEH9HR0/hnadCaHKOxR0YMAlzwR6mGQ6Egbe", + "dtzVwtKFSZb3h9CIPjYitaoE4hSQq2UQ0Iy4lh0CiB9oj2oFN8d179uPYkl3Ktwjpwctw8ZahvUHURUA", + "ffuzJeHqVMZ9ZUDX/sOvGqTASXF8/CySMf5X7E4StJlVb1uX4MF4UHqEgHk031Tfuo8f1pcJ7kxpb8Nh", + "7ffBPl2QLby35H5sZ2/DFfvpfvkbt4Vnlqe4Elvabzqfv71XArUSp4B3ybgzi1cJ03o9kAfgkFRrtyoa", + "e2Y98WNVAqx1pw7qvzty5Mc3yTs+Wz/dJz2W8p1WokUp2BvdUnjNdZb6reMce0H+g8myrElZKJlPIw1X", + "JuprrA+8lVE7y+jeHqbuy2tom0v2Rgnl4RWp3dmtfAQI3s+xB83pmvx4Vkh/5LdiP4+gw2dBCri3dV+W", + "G8D7F9rkdtour9/76bNyPTqo+ppZLFtFC2vtQxtm+av7sFB2vDDtHgtdVoJeE9UWfLHKYcX1dqbS+5bR", + "ryt53yHz3eetulp3KlXFlW19T5xiKC3ZVtbMQ17AB6Bmu06CvraL6eiPc6pyvlKRgnWqXQY/o8GK7JMi", + "ADGZWpI8CDKG7XaV+2MRF5SCD3Mw+ZsL+M5HkeYddeH7J7k7302p9tYIMgocC0GmUvq4mGrImNKXGEBX", + "5gG01DcrQF6YKLB9ipnORP+cgH2IlQCa7iny7GErpBD3d5Y4LkkW+HjxaVuqomGaCUwi5bC3RVhMRTaC", + "YzcpjwRLMxkJ5gfrkJTcrKNy1naquv4F9v33r+Ft8Qbg6nuPbSOw7fOOQeAf2MXy/fev7TM8QJEmukMz", + "ON+1GWBXY7K39qzC5k4TUAOd92QMsrjsEpgQ0DdtDQoJqhX9cM/uvUGogX+bo986Tnv0B+JXi6yzGlm9", + "GWkzZLVWpTZkXS/QWEgP1qW9WJf2h2x4bhvf6eeJPuNJCRaNMmZvbSAi/U25djw6M+Qp8P6dMa6W665+", + "C1kD+Vqf2BaA3b1rtxELWhQydiOuqZCRMSlXrJ9sNnY/LHQsEvirpqcp9TIg89d1Nbl+kLqZg9R2h6Q2", + "T927ZGPVC7MnQyPbu/PbrUHownrelhHW9kMnb5uoVuYG1vsqb7vde/X4xgS+h2iXAaSqYtJ1Ud2hySq7", + "DLVZFa6zV+sD9diDpyw/P8/EOQJwcJ3d3P6w7lyq9gfb+mzZow627fOrq36NfUdUEX9HghgSyq3H2yIU", + "D+yu9gyj4tjfyycWu3aqQ/DrXv1hEdJb8obFuduwAj/cf8WHO70GVrTdV0d/4H/7+r124I3VTLiZ10tN", + "dtKDNmIv2ohODFjp3Yq9rDzdKh3fgeM9viku8EBi11dgSmvqf++W2sEIrG/p7WDKvvxKN7+sbgxNH55H", + "6Za3Wz/XUccEsQwEmM0pM67I2Snk5Urz56x+lKfsUfBGeQwPjnNSWORZEeVFJmL23+9+/CGU5isD5uIq", + "P4rMxSl0hXITieZxmbg85jnH0vLsxbufQZwXzBQSn6FUhNekmeCxmQuBvnwQ7vzuZxbppFgoM4S3hC1m", + "5Z5wp6ByHLJcD5lLpjD8wELXpKH3bJp+FMvgLyDa4QdG8XaxXAhlpFZmPB7jT2JIaUzLl50d/9TCQ/WA", + "MUEB+a9fzoUKWknvXYTHBZnfT7Fc0PRsOS3nO6V15vNMCHbqofsfbhrrZWgn8kW8YMaJoimD1bZMy9pn", + "7fAh/ly4Xavr8I0zu6oT8XDg6AM62+IBOPF3toxU4IdHFVv8geHE5XW3vv1wYBOWY0GwYa6HIVFUaKJK", + "EqjmH+bLVAxxhIl6evz02ej4yej4yfvj4+f4v38Paz8+wR+Pn3z3p6/+/eevvjr59peTf/7jmydPf/jf", + "xy/+9ddv/zHk0UKMpIqGJ9FCsFcqGg/P03z05SgvsjM9lCot8uGTpxPVOnDtx6c7me3p8US1Dlz78Vl1", + "tq+f/e9/P/nn25O//vKXn//85t3Tl0OwUImr4Xf4H/ZCZ2llNl3kMN2XcGv8oKlm2Ohs2Xm6HW2aJ7rx", + "+Wy2v5vtz5d0x9X9IF2Fr4OqtnSh73nvK5377B5H0ZwrJZIeiQzCbsx169DThm1Hfoo9qm1bgdtGiztR", + "VZtlTTUL2NdQ3x6Uth1K2w1PparDbe98tmRwBn2zIEDbD3+/FGdzrT/uTqH7QwDbCwvabat3W2B6YMre", + "VoxptVmFe7VZYXWvHm6brFNb3MYP96o8bkGG263r1gJQGyK2NLv/2uY2VNkSLXvc5Ed/qOYm9lVet4G6", + "JoNDB26vf+m1gnlQd+9F3b1DFFypIN8Ef0BffteR5/gO8cEHom/fKaqu1tBvgq1WbX8HEXZfOv1ujL0l", + "3df1SejztgVcr2yipYqbEVb6ZHBuKB1WZnKuEOaW2Zy3VThsn864om7o9ghzvtJW/XDb6gX2i89xfAqj", + "nzK/iS6pMi6s3BElLoWxKZTvpHaiT2bub6xq3Z1XRccg1YWWkRjbQzwNW8QikRciW06poNGHv8+4TGpt", + "rIFnim5oZc7u0/0oLfon8L4plYVL9PxgFRaNHLQrWS2Wp1I8KSvTppm84LnoWaq2hRtXH454HmvrR7Qs", + "obe4j603lp0sXPdM1Hcpq1dKKdjoQYr5DhXuFurDQoSKV1esV3E7Fbhitk5xbTMOZEUCVnmes3OhgDzg", + "rvFZgPCWoFu6TKz9PCx+xxY8+0j3uxGJwAQPfg7wyciEu20giKOsqycXCxFLnotkOWZOZ80u59oI5nrA", + "zCaXScJSf9+7fBITRcm/cU9y9B5IxCxnhcp1gXXvWkvHq/iuEf1+KruruIvqN3ostWRmJyeYh6GtsgS1", + "V96wRV33CscACt705YJ9+jxcaPCberfgbDsI7DwYSXf1DFlzImtfIZWsdS4xUD7PhJnrpPYokQYQPobX", + "SGJE5Zu9UWwKrpO3/372w8tv/vn+3c9fvn377bf/+tNfv/vq25Of9/Q2eQt7cJeeJgDQQ36ZOKa0J+ls", + "M1MrANPPzgot92RkbbnrAUnujokVoFn33IA2n5lx1R75zT8jkESqrwjY3q3MrjDWJjZXu+jNJGqC7mBt", + "3b+1db842d8auwqtGrqZO4VTx3eCUz5Evcy+cXcD8+wq9G2zzd42Bt9NoeNukNLBDLuZGfYOijVHuSCZ", + "vV12fy9M5wVkFZ/wEPf1KTETjcGHrQ3nUrFTS0p1PlHSa1RhmC9M6YFOcU4wHw0lDUtFZqQvXJjQPxP5", + "UUDOLqbzucgmCls3eQmMdIfvwid3xEpxr94N17sVEZf3SY9baCTThKseSkhs1qF3pCH2qGrECXaVNs5n", + "1LkA2t4oh84d0fOt2Y7d6dLewES3rT8DIB6YzswRVJMtvMl0XEQ5e8FznujzPtlnlLjEATtVXfBxryEE", + "cIK3q9ACCFrRJeHq/iuu7AH2wZYW3n/0B/ynr34J2q5RKVlwemTzw3kPmqO9aI42QIqVmp9VBw7Knls/", + "7eMbZRaH8otNRc9GqLZaUbMK26xu5jYQbh+O8UZk+cY3480ie4FAHnC+XbGyo2v3iMexXvsEi+ORVoZx", + "Y3QkUVxBRQfvEO38u2xkR785ghnu+uXnF79z95KDU0m/x+b6E9jtm/MEcfYuPDwRks/69Xk9YbPCnGY6", + "24ApbuC/cRKD/tXOA2TD179oifHdf0GhfEIjLt7SO9rP3yUr4MeHpMtFnPQIeS207yEd0N+4yWte6m/F", + "Ql+IgFxmmV50EkzwZL9xghl2jm3XedAM7NonmlAjwItrsutuvYFHPyexSphSZ52Y6HQJDwENj2+aLz8Q", + "j5MOlLuuTLJKY7ExngdajM8U1fepLNlcBrpxWvuslSZtepB9UN1qkSiL5vJCdPuMnFADp0+0ht4mLdqB", + "HpoO+wHlsXaYEOJBf6RsulOsRsy0OEukmXcj5htqsBYx7UAHxPxsEdNhwr4QM9OQvXyNVvmMzoS51h16", + "ZNts5Afdo6tPHaRdef2U5bM6PH0O6l5U9/bf/2qO1Ua/syUDkPumV4W2WDTLDrA7hbJjPBaw29YqV8F5", + "YI5NdSxp5Xh2h9g7kYNrr+nr5FQbHBH06zpawhlyi8rGToDiquvNVYyNMp0YZlPxTJTzNNZqzE4U09k5", + "V/J3/IFFXLE5vxBsUSS5BL/jBjHEYiaViMfsZKJqH4E9JFJ9JAYRlN7kaQrsRJqKZC0NEygpSzMX8UTF", + "BXg143JqA4NncyaoF6VvWHBJ6RsKGKA79rHG7/fqG1Ylh1v2ErPrbSG/aov77zLWSjF9qbFd1Dj6Q/b0", + "IWsj1B+hQIkponmTeIC+zjC1CCpqMeVJecMrnVduZtvNfUqlUpa0VFCLojAwhf/TV66FblgrBQl6JhVP", + "YNsdIzBdCvQmyayX2eVBwb0f1ze+LWKvdISrY22rBvuu4MHx7fHGh6Jr3h7JVrvArcUzq0G+RVTbl4b3", + "GsLALSL8wysLx3cjOZjizG9rqKloUUFUm+5R/1CZaFfKBx7l8kJMweJad0Gzn3J98DhzKojKEezQs+xd", + "OO5tqwFCYA7+Zav9y+rE32Q1laOt6AtaH7jhgPvN6xMCRk+vW3rbhoC0oVb4/TN347peVL19QNdQaD1K", + "rrj6jv4I/6xmym0+MWozrxf6qoPfg7fGRrj6QJ4be8W3XiEI+dyZ+jEFLa+A1GE5CptsEomwW5Qd7ktA", + "ZLSkXVQH7B+E/uDkxJsSww6+/hvKYsxT9Fp2tKmzf+Dpv5rNtEh0G7jV7eFq3JehpIGpt2QracCx7oZ+", + "CJEBOxEpySZTJ7CRVn0JrJkgZqVXXS+ZoPp7GICwle/3amKui7e3RsnDtXPcA9/wLSn1YfuKbypnt19s", + "PI/mK1T8LTQ+ZmgBBcHtt4KrXOZYQ8Ga6v+GH3K5QKul9U6YqMu5IIETGIfvlvOPwjAxm4koH7MT/ChU", + "bstBpKlQMYl4pUT/hZmoXC5EIlW3weEBUuaN6IUQYMKNm7Z1bMkiDlkX12ZdbMrJ29/im6VdXHOtR1xF", + "Iul2UX6B321dmPC2Zr9AOZdMGHhUSgVsLJqLuEgsT8LNYBKL02SC8UxMFCZIrNlUbC/7ysw5PItnsBcw", + "I0FH7BgYUovAjy3uhBbsZrTGdF63YwTdSBN34AorRHw8xT1r8aI5V+crwmJeJNoIwzjLCqWAaqtMSsVE", + "jsa+RLQSjEeRzlD1Q/LCRDn/ROsM+YKcs1BrBPJTkZ5nPBZmyGJ9qdy/YWz0dCcQWxzN6cMDIms6q9sn", + "awJklabrfVAzbM4NeOlFQsQiPhB4QOC4jXsmcBHLFZmSv4ll3kndZ0sQ/ZOlzZWMilwRszN4qYA6n1wh", + "rUuzmahHPHZl2zIIG4d/y1wsgJjxy9D/PoRGJs9EHs2hWTrnBoheZxNVqEBI4L4YHCzkMWmgLUdgC04v", + "F/twCavMwfg8J/ajxFXpRh4towSV7KF8gf6h6L7prBURV0rnwKZg3rb6cvD7w+E9gCgHgeJ+8xs4wz1z", + "m4U8z3i+Qp54TQ0M6ekTDjPaUDZXpDIqskwoyuNFxZ5JxpDqfIp8gumFzG1+dR8bMeUqmuvMfwO5QhGj", + "iIeM4IJJ+EKouPlUgddJmvAI7Gu+H3EvlgkX/iEzZkR2ISPBUpFJHRsUU850PvcYh3oTKQzxE5J/+EKw", + "Vy/H7JsraSj1PBkBF4XJbZAFg5PkuTxLBKVpAwhznp3bZInjiXqlgja0E04BY1gQjuJjVMjGCLxbZJnO", + "xhAYeCFjTGlf31LQtMZyNhO497VNBdOdjGSeLN2tDoPjfi2EyoegVpIR7oHIaXOr8A2RV6cYl1hGnfD4", + "P4XJYQQr78VaGKZ0PlF5xpWZiczu1Ji9wMum9i4subRFvBY+bb88HFZtSewOcGsLyUFQvCbjtvu4laJ5", + "i/T+a3h8JkyuM7GyMDE0aGGyZ0sKySGJckn8f1Rqd/D0jQEpsEroLsJOqoJC16TBt6ZUGCYnqbAwRr5J", + "mlcquFYEup1M1KzIi0yMSDYg7j5kxLPc7Ibxcv4xs4uA4YDF8AsuE47MeS7URGHc3qh6gxgmFDRpL0YM", + "ox0csQ7SWl+idwh4N4jeP8pW0D2FUplSy4sUHRy3fWYRRS0FXNyRXghGDu3D8NVIsl0mjE4uHLdo1R3n", + "7JIbBvVlrYMSsYAYBa0ox5RlE0UaYKnOn1t1MUMpsP3hC5xBZIIbVnmKInSwvIlSOh8tRT4iwIETWVtc", + "+8J9PGK5i/Hf6g9dxdxovur5CIW0+i5KwzLxHyy+3mJ38zPcPV7zsAMNf/Inc+dIehSYULrJu1xAy80e", + "jLASKcOZDvff4f5bYRRtpxdWxaBN9Rc5vxpFOhZrYsfKZvuJG3uloqSIgwB1fsVwvrYs2X0cZyUNOLUD", + "VnxooTj74PngTOtEcHWzzrLv+dULHT+0nCX+OFsx9D2/Wh9v5DBwr5k07OncbgoNC0SrdoA+3f/cGQ4h", + "VuBDB586+iOnTWjkcG5NKhGgzfrL1Y98kPX2klSix6kPu4O27spRHt8CwT8Qh9JeCJIWLQhCGWNvE0f2", + "ldBhmzvpNlD0UOioo9ARbkufCw/6iezCYWwtflBHPBkMB0WWDJ4P5nmePj86SuDHuTb58z9SneWfjngq", + "jy6eDYaDC55JeAgber9m9v2K4WyD54O//OUvf8HDbGRXpVSZFBV6Tm+Kckrz/OjoD/r905incvxRq/P5", + "b+NIL1qmtQNUJi7MYDgQqljADtAfxWA44PB/C5ux8EMbYOVuvUh0ETfA8qLCOILvbic+ffAb/seKMspY", + "RNi4Yti1gt9Ym9oMKbUWN0yoXOYJWvrYGU/g/cXyeSYMaN1YlGljwNxIJrzKSK5MtiumDU+bBcs1E1fk", + "sMrM0uRiYcYll+qqZ9yyRUFGvVEiLkTiAxhBPyjPi8wrJBqDv6SWbeNanGARpU9lC674uTBUYnXoXERo", + "uWQUDiICTCMkYHTGjYid0bMVmHrC1iZM33//mkXa5CzmOYcBWepsuUzpbGFzjqWZjOAnaIWAJFydF/xc", + "sIWO4SA4HpftLDIDNmEZUQoSZpYqEjFVefCJCcuj0kWGLVXMeJHrEW5ythAxc0EFS8bPMyFa1wgreKFN", + "3rK4bwXPi0ygTTkTBo3//gxSfiYTmUth2BmPPsJOLhlddEOylPso1lRko0LJnHZqPQ64eVtAeu8f5DwT", + "PsA14klUJFagF3TULiFcOw4Dq2uO/gJdHCIpnGXLAGWZXiOWfVsG/rruAuBwtyXZI83tstT1mLmRnKc5", + "/0maOisYW+rCkbqiWvjOYUxUMmcWBvDzUmcfZ4m+xCywUuXi3FbpxyOu8wvsaF0xzJjhtBFXiJcLKrIQ", + "M6HmyKuWuiidI0SkaQyYx1CoNfxeQTTH+YAg5plW8ndoQoAiaVkPDZnFo5Rn+RJ4Qw7aFDP0SAJdEE2G", + "js+6FVtuCH+67R+yOVcxHQ9fIquNdJKIiAwS0Isc410Kr0wknDRH5mP7ccGmtBzRNyU3ryE3xQgxjjZQ", + "+GXm6HI9boSjtoXBV625wax5xqOPdmv1jM7KEb/27jZ1hz1rT5EqlhcyLnhioHGYYtU69UFDy4zPhKu6", + "ROhD/n6NxbYurzJ7K0HbzdlqbWXvm16Xn7llTdgCSeaigSt9V/ZN2TXNNIAkYsYdWenCJEugQ+BOjqUb", + "TTcJOAxZ557Qr7M0xANSoha0eqt6sGnuroUZn61gri9hSfz8PBPnPBduvfUMv1zxZJnLyLC0yFJtgPHY", + "oeyxuRvHVdr0d6gbW2oF65w7x7HzTBcpsNIxe+3aLqpDWs0XAAO7hK5kCCADte6QmC2AOEvElTxzA8Av", + "JhKKZ1Kb+u6YwacPn/6/AQA=", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/api/v3/client/customers_credits_grants.go b/api/v3/client/customers_credits_grants.go index 23097e0626..664eef5b48 100644 --- a/api/v3/client/customers_credits_grants.go +++ b/api/v3/client/customers_credits_grants.go @@ -21,6 +21,11 @@ type CreditGrantFilter struct { Currency *string // Filter credit grants by key. Key *StringFilter + // Select grants spendable on any requested feature, including grants without + // feature restrictions. Keys are case-sensitive. Supports `eq` (or shorthand) and + // `oeq` with comma-separated keys. Omit to include all features; use + // `exists=false` for grants without feature restrictions. + FeatureKey *StringFilter } type CreditGrantListParams struct { @@ -41,6 +46,7 @@ func (p CreditGrantListParams) values() url.Values { q.Set("filter[currency]", *p.Filter.Currency) } addStringFilter(q, "filter[key]", p.Filter.Key) + addStringFilter(q, "filter[feature_key]", p.Filter.FeatureKey) } return q diff --git a/api/v3/handlers/customers/credits/feature_filter.go b/api/v3/handlers/customers/credits/feature_filter.go index 006a3e2b35..69bd758734 100644 --- a/api/v3/handlers/customers/credits/feature_filter.go +++ b/api/v3/handlers/customers/credits/feature_filter.go @@ -81,3 +81,43 @@ func newFeatureKeyFilterBadRequest(ctx context.Context, err error) error { }}, ) } + +// Grant listings can select multiple features because they return grants, not an +// additive balance that would double-count credit shared between features. +func fromAPICreditGrantFeatureFilters(f *api.StringFieldFilter) (mo.Option[creditpurchase.FeatureFilters], error) { + if f == nil { + return customerbalance.AllFeatureFilter(), nil + } + + if op := unsupportedCustomerCreditFeatureKeyOperator(f); op != "" { + return customerbalance.AllFeatureFilter(), fmt.Errorf("%s operator is not supported", op) + } + + if f.Exists != nil { + if *f.Exists || f.Eq != nil || len(f.Oeq) > 0 { + return customerbalance.AllFeatureFilter(), errors.New("only exists=false without other operators is supported") + } + + return customerbalance.NewUnrestrictedFeatureFilter(), nil + } + + if f.Eq != nil && len(f.Oeq) > 0 { + return customerbalance.AllFeatureFilter(), errors.New("eq and oeq cannot be combined") + } + + features := append(creditpurchase.FeatureFilters(nil), f.Oeq...) + if f.Eq != nil { + features = append(features, *f.Eq) + } + + if len(features) == 0 { + return customerbalance.AllFeatureFilter(), nil + } + + features = features.Normalize() + if err := features.Validate(); err != nil { + return customerbalance.AllFeatureFilter(), err + } + + return mo.Some(features), nil +} diff --git a/api/v3/handlers/customers/credits/list_grants.go b/api/v3/handlers/customers/credits/list_grants.go index a38ed99d7c..ecd40ad48d 100644 --- a/api/v3/handlers/customers/credits/list_grants.go +++ b/api/v3/handlers/customers/credits/list_grants.go @@ -95,6 +95,10 @@ func (h *handler) ListCreditGrants() ListCreditGrantsHandler { } req.Key = key + req.FeatureFilters, err = fromAPICreditGrantFeatureFilters(args.Params.Filter.FeatureKey) + if err != nil { + return ListCreditGrantsRequest{}, newFeatureKeyFilterBadRequest(ctx, err) + } } return req, nil diff --git a/api/v3/handlers/customers/credits/list_grants_test.go b/api/v3/handlers/customers/credits/list_grants_test.go new file mode 100644 index 0000000000..e9dfce0737 --- /dev/null +++ b/api/v3/handlers/customers/credits/list_grants_test.go @@ -0,0 +1,79 @@ +package customerscredits + +import ( + "context" + "net/http" + "net/http/httptest" + "testing" + + "github.com/samber/mo" + "github.com/stretchr/testify/require" + + api "github.com/openmeterio/openmeter/api/v3" + "github.com/openmeterio/openmeter/openmeter/billing/charges/creditpurchase" + "github.com/openmeterio/openmeter/openmeter/billing/creditgrant" + "github.com/openmeterio/openmeter/openmeter/ledger" + "github.com/openmeterio/openmeter/pkg/pagination" +) + +type grantListService struct { + creditgrant.Service + input *creditgrant.ListInput +} + +func (s *grantListService) List(_ context.Context, input creditgrant.ListInput) (pagination.Result[creditpurchase.Charge], error) { + s.input = &input + return pagination.Result[creditpurchase.Charge]{}, input.Validate() +} + +type grantListServer struct { + api.ServerInterface + handler *handler +} + +func (s grantListServer) ListCreditGrants(w http.ResponseWriter, r *http.Request, customerID api.ULID, params api.ListCreditGrantsParams) { + s.handler.ListCreditGrants().With(ListCreditGrantsParams{CustomerID: customerID, Params: params}).ServeHTTP(w, r) +} + +func TestListCreditGrantsSpendabilityQuery(t *testing.T) { + for _, tc := range []struct { + query string + features mo.Option[ledger.FeatureFilters] + invalid bool + }{ + {}, + {query: "filter[feature_key]=a", features: mo.Some(ledger.FeatureFilters{"a"})}, + {query: "filter[feature_key][eq]=a", features: mo.Some(ledger.FeatureFilters{"a"})}, + {query: "filter[feature_key][oeq]=b,a,b", features: mo.Some(ledger.FeatureFilters{"a", "b"})}, + {query: "filter[feature_key][exists]=false", features: mo.Some[ledger.FeatureFilters](nil)}, + {query: "filter[unknown]=a", invalid: true}, + {query: "filter[feature_key][eq]=", invalid: true}, + {query: "filter[feature_key][contains]=a", invalid: true}, + {query: "filter[feature_key][neq]=a", invalid: true}, + {query: "filter[feature_key][exists]=true", invalid: true}, + {query: "filter[feature_key][eq]=a&filter[feature_key][oeq]=b", invalid: true}, + {query: "filter[feature_key][eq]=a&filter[feature_key][exists]=false", invalid: true}, + } { + t.Run(tc.query, func(t *testing.T) { + // Given the generated HTTP binding and the real grant list handler. + service := &grantListService{} + h := &handler{resolveNamespace: func(context.Context) (string, error) { return "ns", nil }, creditGrantService: service} + router := api.Handler(grantListServer{handler: h}) + // When a deep-object query reaches the endpoint. + req := httptest.NewRequest(http.MethodGet, "/openmeter/customers/01ARZ3NDEKTSV4RRFFQ69G5FAV/credits/grants?"+tc.query, nil) + rec := httptest.NewRecorder() + router.ServeHTTP(rec, req) + // Then invalid queries fail before listing and valid filters reach the service. + if tc.invalid { + require.Equal(t, http.StatusBadRequest, rec.Code, rec.Body.String()) + require.Nil(t, service.input) + + return + } + + require.Equal(t, http.StatusOK, rec.Code, rec.Body.String()) + require.NotNil(t, service.input) + require.Equal(t, tc.features, service.input.FeatureFilters) + }) + } +} diff --git a/api/v3/openapi.yaml b/api/v3/openapi.yaml index 000c03f48b..175df1cd6a 100644 --- a/api/v3/openapi.yaml +++ b/api/v3/openapi.yaml @@ -17212,6 +17212,14 @@ components: allOf: - $ref: '#/components/schemas/StringFieldFilter' description: Filter credit grants by key. + feature_key: + allOf: + - $ref: '#/components/schemas/StringFieldFilter' + description: |- + Select grants spendable on any requested feature, including grants without + feature restrictions. Keys are case-sensitive. Supports `eq` (or shorthand) and + `oeq` with comma-separated keys. Omit to include all features; use + `exists=false` for grants without feature restrictions. additionalProperties: false description: Filter options for listing credit grants. ListCreditTransactionsParamsFilter: diff --git a/openmeter/billing/charges/README.md b/openmeter/billing/charges/README.md index d83ba613f8..79608a2349 100644 --- a/openmeter/billing/charges/README.md +++ b/openmeter/billing/charges/README.md @@ -360,6 +360,11 @@ booked for each uncovered segment, and lineage persists that same allocation. The purchase's lifecycle transaction rolls back if a selected segment changed before persistence. Ledger account locks precede lineage locks. +Credit grant feature filters select spendability: a requested feature includes +grants without feature restrictions. Feature `oeq` matches any requested key +without duplicating shared grants. Matching precedes pagination. These filters do not require an +active or funded grant; lifecycle status remains a separate filter. + A credit grant, payment authorization, and payment settlement are separate durable facts. A later state cannot be inferred from the presence of an earlier one. diff --git a/openmeter/billing/charges/creditpurchase/adapter.go b/openmeter/billing/charges/creditpurchase/adapter.go index 9d6693f9e3..715b61755a 100644 --- a/openmeter/billing/charges/creditpurchase/adapter.go +++ b/openmeter/billing/charges/creditpurchase/adapter.go @@ -6,10 +6,13 @@ import ( "fmt" "time" + "github.com/samber/mo" + "github.com/openmeterio/openmeter/openmeter/billing/charges/meta" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/costbasis" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/ledgertransaction" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/payment" + "github.com/openmeterio/openmeter/openmeter/ledger" "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/filter" "github.com/openmeterio/openmeter/pkg/framework/entutils" @@ -222,6 +225,9 @@ type ListChargesInput struct { IncludeDeleted bool Expands meta.Expands + // FeatureFilters selects any requested feature plus unrestricted grants. + // None selects all; Some(nil) selects only grants without feature restrictions. + FeatureFilters mo.Option[ledger.FeatureFilters] } type ListChargesExpirationFilter struct { @@ -278,6 +284,12 @@ func (i ListChargesInput) Validate() error { errs = append(errs, fmt.Errorf("expands: %w", err)) } + if features, ok := i.FeatureFilters.Get(); ok { + if err := features.Validate(); err != nil { + errs = append(errs, fmt.Errorf("feature filters: %w", err)) + } + } + return models.NewNillableGenericValidationError(errors.Join(errs...)) } diff --git a/openmeter/billing/charges/creditpurchase/adapter/charge.go b/openmeter/billing/charges/creditpurchase/adapter/charge.go index 4702664abc..2317950594 100644 --- a/openmeter/billing/charges/creditpurchase/adapter/charge.go +++ b/openmeter/billing/charges/creditpurchase/adapter/charge.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" + "entgo.io/ent/dialect/sql" "github.com/oklog/ulid/v2" "github.com/samber/lo" @@ -15,6 +16,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/billing/charges/models/costbasis" "github.com/openmeterio/openmeter/openmeter/ent/db" dbchargecreditpurchase "github.com/openmeterio/openmeter/openmeter/ent/db/chargecreditpurchase" + "github.com/openmeterio/openmeter/openmeter/ledger/creditfilterquery" "github.com/openmeterio/openmeter/pkg/filter" "github.com/openmeterio/openmeter/pkg/framework/entutils" "github.com/openmeterio/openmeter/pkg/models" @@ -338,6 +340,17 @@ func (a *adapter) ListCharges(ctx context.Context, input creditpurchase.ListChar } } + if features, ok := input.FeatureFilters.Get(); ok { + query = query.Where(func(s *sql.Selector) { + predicates := []*sql.Predicate{creditfilterquery.ExactFeaturesPredicate(s.C, nil)} + for _, feature := range features { + predicates = append(predicates, creditfilterquery.MatchFeaturePredicate(s.C, feature)) + } + + s.Where(sql.Or(predicates...)) + }) + } + query = filter.ApplyToQuery(query, input.Key, dbchargecreditpurchase.FieldKey) query = withExpands(query, input.Expands) diff --git a/openmeter/billing/creditgrant/service.go b/openmeter/billing/creditgrant/service.go index 0b5bdd0594..0f02c0ca51 100644 --- a/openmeter/billing/creditgrant/service.go +++ b/openmeter/billing/creditgrant/service.go @@ -7,6 +7,7 @@ import ( "time" "github.com/alpacahq/alpacadecimal" + "github.com/samber/mo" "github.com/openmeterio/openmeter/openmeter/billing/charges/creditpurchase" "github.com/openmeterio/openmeter/openmeter/billing/charges/models/payment" @@ -253,6 +254,9 @@ type ListInput struct { Status *GrantStatus Currency *currencyx.Code Key *filter.FilterString + // FeatureFilters selects any requested feature plus unrestricted grants. + // None selects all; Some(nil) selects only grants without feature restrictions. + FeatureFilters mo.Option[ledger.FeatureFilters] } func (i ListInput) Validate() error { @@ -284,6 +288,12 @@ func (i ListInput) Validate() error { } } + if features, ok := i.FeatureFilters.Get(); ok { + if err := features.Validate(); err != nil { + errs = append(errs, fmt.Errorf("feature filters: %w", err)) + } + } + return models.NewNillableGenericValidationError(errors.Join(errs...)) } diff --git a/openmeter/billing/creditgrant/service/service.go b/openmeter/billing/creditgrant/service/service.go index 3ed374bb52..eba70b7900 100644 --- a/openmeter/billing/creditgrant/service/service.go +++ b/openmeter/billing/creditgrant/service/service.go @@ -246,6 +246,7 @@ func (s *service) List(ctx context.Context, input creditgrant.ListInput) (pagina } listInput.Key = input.Key + listInput.FeatureFilters = input.FeatureFilters return s.creditPurchaseService.List(ctx, listInput) } diff --git a/openmeter/ledger/account/adapter/subaccount.go b/openmeter/ledger/account/adapter/subaccount.go index 8405cd647d..d71488ae28 100644 --- a/openmeter/ledger/account/adapter/subaccount.go +++ b/openmeter/ledger/account/adapter/subaccount.go @@ -14,7 +14,7 @@ import ( "github.com/openmeterio/openmeter/openmeter/ent/db/predicate" "github.com/openmeterio/openmeter/openmeter/ledger" ledgeraccount "github.com/openmeterio/openmeter/openmeter/ledger/account" - "github.com/openmeterio/openmeter/openmeter/ledger/internal/routequery" + "github.com/openmeterio/openmeter/openmeter/ledger/creditfilterquery" "github.com/openmeterio/openmeter/pkg/framework/entutils" "github.com/openmeterio/openmeter/pkg/models" ) @@ -206,15 +206,17 @@ func (r *repo) ListSubAccounts(ctx context.Context, input ledgeraccount.ListSubA } if exact, ok := normalizedRoute.CreditFilters.Get(); ok { - routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(routequery.ExactFiltersPredicate(s.C, exact)) }) + routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(creditfilterquery.ExactFiltersPredicate(s.C, exact)) }) } if features, ok := normalizedRoute.Features.Get(); ok { - routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(routequery.ExactFeaturesPredicate(s.C, features)) }) + routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(creditfilterquery.ExactFeaturesPredicate(s.C, features)) }) } if normalizedRoute.MatchFeature != "" { - routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(routequery.MatchFeaturePredicate(s.C, normalizedRoute.MatchFeature)) }) + routePredicates = append(routePredicates, func(s *sql.Selector) { + s.Where(creditfilterquery.MatchFeaturePredicate(s.C, normalizedRoute.MatchFeature)) + }) } if normalizedRoute.CostBasis.IsPresent() { diff --git a/openmeter/ledger/internal/routequery/filters.go b/openmeter/ledger/creditfilterquery/filters.go similarity index 98% rename from openmeter/ledger/internal/routequery/filters.go rename to openmeter/ledger/creditfilterquery/filters.go index b8bf462be8..bf4de52b32 100644 --- a/openmeter/ledger/internal/routequery/filters.go +++ b/openmeter/ledger/creditfilterquery/filters.go @@ -1,4 +1,4 @@ -package routequery +package creditfilterquery import ( "encoding/json" diff --git a/openmeter/ledger/historical/adapter/ledger.go b/openmeter/ledger/historical/adapter/ledger.go index 0ec73eab28..051f97de39 100644 --- a/openmeter/ledger/historical/adapter/ledger.go +++ b/openmeter/ledger/historical/adapter/ledger.go @@ -21,8 +21,8 @@ import ( ledgertransactiongroupdb "github.com/openmeterio/openmeter/openmeter/ent/db/ledgertransactiongroup" "github.com/openmeterio/openmeter/openmeter/ent/db/predicate" "github.com/openmeterio/openmeter/openmeter/ledger" + "github.com/openmeterio/openmeter/openmeter/ledger/creditfilterquery" ledgerhistorical "github.com/openmeterio/openmeter/openmeter/ledger/historical" - "github.com/openmeterio/openmeter/openmeter/ledger/internal/routequery" "github.com/openmeterio/openmeter/pkg/currencyx" "github.com/openmeterio/openmeter/pkg/framework/entutils" "github.com/openmeterio/openmeter/pkg/models" @@ -537,15 +537,15 @@ func listTransactionsRoutePredicates(currency *currencyx.Code, route ledger.Rout } if exact, ok := route.CreditFilters.Get(); ok { - routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(routequery.ExactFiltersPredicate(s.C, exact)) }) + routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(creditfilterquery.ExactFiltersPredicate(s.C, exact)) }) } if features, ok := route.Features.Get(); ok { - routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(routequery.ExactFeaturesPredicate(s.C, features)) }) + routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(creditfilterquery.ExactFeaturesPredicate(s.C, features)) }) } if route.MatchFeature != "" { - routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(routequery.MatchFeaturePredicate(s.C, route.MatchFeature)) }) + routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(creditfilterquery.MatchFeaturePredicate(s.C, route.MatchFeature)) }) } return routePredicates, nil @@ -734,15 +734,15 @@ func scopedRouteSelectorPredicates(input scopedRouteSelectorPredicatesInput) ([] } if exact, ok := route.CreditFilters.Get(); ok { - predicates = append(predicates, routequery.ExactFiltersPredicate(routeColumn, exact)) + predicates = append(predicates, creditfilterquery.ExactFiltersPredicate(routeColumn, exact)) } if features, ok := route.Features.Get(); ok { - predicates = append(predicates, routequery.ExactFeaturesPredicate(routeColumn, features)) + predicates = append(predicates, creditfilterquery.ExactFeaturesPredicate(routeColumn, features)) } if route.MatchFeature != "" { - predicates = append(predicates, routequery.MatchFeaturePredicate(routeColumn, route.MatchFeature)) + predicates = append(predicates, creditfilterquery.MatchFeaturePredicate(routeColumn, route.MatchFeature)) } return predicates, nil diff --git a/openmeter/ledger/historical/adapter/sumentries_query.go b/openmeter/ledger/historical/adapter/sumentries_query.go index 522fd6cd99..b734a0b73f 100644 --- a/openmeter/ledger/historical/adapter/sumentries_query.go +++ b/openmeter/ledger/historical/adapter/sumentries_query.go @@ -13,7 +13,7 @@ import ( ledgertransactiondb "github.com/openmeterio/openmeter/openmeter/ent/db/ledgertransaction" "github.com/openmeterio/openmeter/openmeter/ent/db/predicate" "github.com/openmeterio/openmeter/openmeter/ledger" - "github.com/openmeterio/openmeter/openmeter/ledger/internal/routequery" + "github.com/openmeterio/openmeter/openmeter/ledger/creditfilterquery" "github.com/openmeterio/openmeter/pkg/models" ) @@ -179,15 +179,17 @@ func (b *sumEntriesQuery) subAccountPredicates() ([]predicate.LedgerSubAccount, } if exact, ok := normalizedRoute.CreditFilters.Get(); ok { - routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(routequery.ExactFiltersPredicate(s.C, exact)) }) + routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(creditfilterquery.ExactFiltersPredicate(s.C, exact)) }) } if features, ok := normalizedRoute.Features.Get(); ok { - routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(routequery.ExactFeaturesPredicate(s.C, features)) }) + routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(creditfilterquery.ExactFeaturesPredicate(s.C, features)) }) } if normalizedRoute.MatchFeature != "" { - routePredicates = append(routePredicates, func(s *sql.Selector) { s.Where(routequery.MatchFeaturePredicate(s.C, normalizedRoute.MatchFeature)) }) + routePredicates = append(routePredicates, func(s *sql.Selector) { + s.Where(creditfilterquery.MatchFeaturePredicate(s.C, normalizedRoute.MatchFeature)) + }) } if normalizedRoute.CostBasis.IsPresent() { diff --git a/openmeter/ledger/internal/routequery/subaccount_ids.go b/openmeter/ledger/internal/routequery/subaccount_ids.go index 2ce179ee1c..a783f8bf36 100644 --- a/openmeter/ledger/internal/routequery/subaccount_ids.go +++ b/openmeter/ledger/internal/routequery/subaccount_ids.go @@ -9,6 +9,7 @@ import ( ledgersubaccountdb "github.com/openmeterio/openmeter/openmeter/ent/db/ledgersubaccount" ledgersubaccountroutedb "github.com/openmeterio/openmeter/openmeter/ent/db/ledgersubaccountroute" "github.com/openmeterio/openmeter/openmeter/ledger" + "github.com/openmeterio/openmeter/openmeter/ledger/creditfilterquery" ) // SubAccountIDsByRoute selects ledger subaccount IDs whose persisted route matches a filter. @@ -89,15 +90,15 @@ func (q SubAccountIDsByRoute) selectorPredicates(routeColumn func(string) string } if exact, ok := q.route.CreditFilters.Get(); ok { - predicates = append(predicates, ExactFiltersPredicate(routeColumn, exact)) + predicates = append(predicates, creditfilterquery.ExactFiltersPredicate(routeColumn, exact)) } if features, ok := q.route.Features.Get(); ok { - predicates = append(predicates, ExactFeaturesPredicate(routeColumn, features)) + predicates = append(predicates, creditfilterquery.ExactFeaturesPredicate(routeColumn, features)) } if q.route.MatchFeature != "" { - predicates = append(predicates, MatchFeaturePredicate(routeColumn, q.route.MatchFeature)) + predicates = append(predicates, creditfilterquery.MatchFeaturePredicate(routeColumn, q.route.MatchFeature)) } return predicates diff --git a/test/credits/creditgrant_test.go b/test/credits/creditgrant_test.go index 1b40645f60..ef4451539c 100644 --- a/test/credits/creditgrant_test.go +++ b/test/credits/creditgrant_test.go @@ -33,6 +33,7 @@ import ( omtestutils "github.com/openmeterio/openmeter/openmeter/testutils" "github.com/openmeterio/openmeter/pkg/clock" "github.com/openmeterio/openmeter/pkg/datetime" + "github.com/openmeterio/openmeter/pkg/pagination" billingtest "github.com/openmeterio/openmeter/test/billing" ) @@ -716,3 +717,71 @@ func (s *CreditGrantTestSuite) TestCreatePlanFilteredGrant() { s.Equal([]int{2, 3}, loaded.Intent.Filters.Plans[0].Version.In) s.NotNil(loaded.Realizations.CreditGrantRealization) } + +func (s *CreditGrantTestSuite) TestListCreditGrantsSpendabilityFilters() { + ctx := s.T().Context() + ns := s.GetUniqueNamespace("creditgrant-list-spendability") + s.ProvisionDefaultTaxCodes(ctx, ns) + cust := s.CreateLedgerBackedCustomer(ns, "test-subject") + sandboxApp := s.InstallSandboxApp(s.T(), ns) + _ = s.ProvisionBillingProfile(ctx, ns, sandboxApp.GetID()) + clock.FreezeTime(time.Date(2026, 4, 17, 12, 0, 0, 0, time.UTC)) + defer clock.UnFreeze() + + // Given grants with feature restrictions, including both stored formats. + specs := []struct { + name string + filters ledger.CreditFilters + }{ + {name: "unrestricted"}, + {name: "feature-a", filters: ledger.CreditFilters{Features: []string{"a"}}}, + {name: "feature-b", filters: ledger.CreditFilters{Features: []string{"b"}}}, + {name: "feature-ab", filters: ledger.CreditFilters{Features: []string{"a", "b"}}}, + {name: "plan-only", filters: ledger.CreditFilters{Plans: []ledger.PlanFilter{{Key: "pro"}}}}, + {name: "mixed", filters: ledger.CreditFilters{Features: []string{"a"}, Plans: []ledger.PlanFilter{{Key: "pro"}}}}, + } + ids := make(map[string]string, len(specs)) + all := make([]string, 0, len(specs)) + for _, spec := range specs { + grant, err := s.CreditGrantService.Create(ctx, creditgrant.CreateInput{ + Namespace: ns, CustomerID: cust.ID, Name: spec.name, Currency: USD, + Amount: alpacadecimal.NewFromInt(10), FundingMethod: creditgrant.FundingMethodNone, + Filters: &spec.filters, + }) + s.Require().NoError(err) + ids[spec.name] = grant.ID + all = append(all, spec.name) + } + + for _, tc := range []struct { + name string + features mo.Option[ledger.FeatureFilters] + want []string + }{ + {name: "omitted", want: all}, + {name: "feature", features: mo.Some(ledger.FeatureFilters{"a"}), want: []string{"unrestricted", "feature-a", "feature-ab", "plan-only", "mixed"}}, + {name: "multiple features without duplicate grants", features: mo.Some(ledger.FeatureFilters{"a", "b"}), want: all}, + {name: "unknown feature includes unrestricted", features: mo.Some(ledger.FeatureFilters{"missing"}), want: []string{"unrestricted", "plan-only"}}, + {name: "no feature restrictions", features: mo.Some[ledger.FeatureFilters](nil), want: []string{"unrestricted", "plan-only"}}, + } { + s.Run(tc.name, func() { + // When listing grants for the requested features. + input := creditgrant.ListInput{Namespace: ns, CustomerID: cust.ID, FeatureFilters: tc.features, Page: pagination.NewPage(1, 100)} + result, err := s.CreditGrantService.List(ctx, input) + s.Require().NoError(err) + // Then unrestricted grants are retained and restrictions match before pagination. + want := lo.Map(tc.want, func(name string, _ int) string { return ids[name] }) + got := lo.Map(result.Items, func(grant creditpurchase.Charge, _ int) string { return grant.ID }) + s.ElementsMatch(want, got) + s.Equal(len(want), result.TotalCount) + input.Page = pagination.NewPage(1, 2) + page, err := s.CreditGrantService.List(ctx, input) + s.Require().NoError(err) + s.Equal(len(want), page.TotalCount) + s.Len(page.Items, min(2, len(want))) + for _, grant := range page.Items { + s.Contains(want, grant.ID) + } + }) + } +} From 5fd4d58bd0d34b8ffd274530cc23e888796c4270 Mon Sep 17 00:00:00 2001 From: Alex Goth <64845621+GAlexIHU@users.noreply.github.com> Date: Tue, 20 Oct 2026 14:24:50 +0200 Subject: [PATCH 2/2] chore(ci): retrigger pull request checks