From da00d05543401201fde3e3f63f8345b08c588e33 Mon Sep 17 00:00:00 2001 From: MistEO Date: Sun, 31 Oct 2021 02:31:44 +0800 Subject: [PATCH] =?UTF-8?q?feat.=E5=AE=8C=E6=88=90=E5=AF=B9=E6=95=88?= =?UTF-8?q?=E7=8E=87=E6=AD=A3=E5=88=99=E5=92=8C=E5=9F=BA=E5=BB=BA=E7=BB=84?= =?UTF-8?q?=E5=90=88=E6=9D=A1=E4=BB=B6=E7=9A=84=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 3rdparty/include/calculator/calculator.hpp | 462 ++++++++++++++++++ resource/template/Reception.png | Bin 26888 -> 36781 bytes resource/template/ReceptionMini.png | Bin 17955 -> 29433 bytes src/MeoAssistance/Assistance.cpp | 6 +- src/MeoAssistance/AsstDef.h | 2 +- src/MeoAssistance/InfrastAbstractTask.cpp | 2 +- src/MeoAssistance/InfrastConfiger.h | 3 + .../InfrastFacilityImageAnalyzer.cpp | 17 +- .../InfrastFacilityImageAnalyzer.h | 12 +- src/MeoAssistance/InfrastInfoTask.cpp | 35 ++ src/MeoAssistance/InfrastInfoTask.h | 13 + src/MeoAssistance/InfrastProductionTask.cpp | 53 +- src/MeoAssistance/MeoAssistance.vcxproj | 4 + .../MeoAssistance.vcxproj.filters | 12 + src/MeoAssistance/RuntimeStatus.cpp | 1 + src/MeoAssistance/RuntimeStatus.h | 49 ++ 16 files changed, 647 insertions(+), 24 deletions(-) create mode 100644 3rdparty/include/calculator/calculator.hpp create mode 100644 src/MeoAssistance/InfrastInfoTask.cpp create mode 100644 src/MeoAssistance/InfrastInfoTask.h create mode 100644 src/MeoAssistance/RuntimeStatus.cpp create mode 100644 src/MeoAssistance/RuntimeStatus.h diff --git a/3rdparty/include/calculator/calculator.hpp b/3rdparty/include/calculator/calculator.hpp new file mode 100644 index 0000000000..ceb405f8c5 --- /dev/null +++ b/3rdparty/include/calculator/calculator.hpp @@ -0,0 +1,462 @@ +/// +/// @file calculator.hpp +/// @brief calculator::eval(const std::string&) evaluates an integer +/// arithmetic expression and returns the result. If an error +/// occurs a calculator::error exception is thrown. +/// +/// @author Kim Walisch, +/// @copyright Copyright (C) 2013-2018 Kim Walisch +/// @license BSD 2-Clause, https://opensource.org/licenses/BSD-2-Clause +/// @version 1.4 +/// +/// == Supported operators == +/// +/// OPERATOR NAME ASSOCIATIVITY PRECEDENCE +/// +/// | Bitwise Inclusive OR Left 4 +/// ^ Bitwise Exclusive OR Left 5 +/// & Bitwise AND Left 6 +/// << Shift Left Left 9 +/// >> Shift Right Left 9 +/// + Addition Left 10 +/// - Subtraction Left 10 +/// * Multiplication Left 20 +/// / Division Left 20 +/// % Modulo Left 20 +/// ** Raise to power Right 30 +/// e, E Scientific notation Right 40 +/// ~ Unary complement Left 99 +/// +/// The operator precedence has been set according to (uses the C and +/// C++ operator precedence): https://en.wikipedia.org/wiki/Order_of_operations +/// Operators with higher precedence are evaluated before operators +/// with relatively lower precedence. Unary operators are set to have +/// the highest precedence, this is not strictly correct for the power +/// operator e.g. "-3**2" = 9 but a lot of software tools (Bash shell, +/// Microsoft Excel, GNU bc, ...) use the same convention. +/// +/// == Examples of valid expressions == +/// +/// "65536 >> 15" = 2 +/// "2**16" = 65536 +/// "(0 + 0xDf234 - 1000)*3/2%999" = 828 +/// "-(2**2**2**2)" = -65536 +/// "(0 + ~(0xDF234 & 1000) *3) /-2" = 817 +/// "(2**16) + (1 << 16) >> 0X5" = 4096 +/// "5*-(2**(9+7))/3+5*(1 & 0xFf123)" = -109221 +/// +/// == About the algorithm used == +/// +/// calculator::eval(std::string&) relies on the ExpressionParser +/// class which is a simple C++ operator precedence parser with infix +/// notation for integer arithmetic expressions. +/// ExpressionParser has its roots in a JavaScript parser published +/// at: http://stackoverflow.com/questions/28256/equation-expression-parser-with-precedence/114961#114961 +/// The same author has also published an article about his operator +/// precedence algorithm at PerlMonks: +/// http://www.perlmonks.org/?node_id=554516 +/// + +#ifndef CALCULATOR_HPP +#define CALCULATOR_HPP + +#include +#include +#include +#include +#include +#include + +namespace calculator +{ + +/// calculator::eval() throws a calculator::error if it fails +/// to evaluate the expression string. +/// +class error : public std::runtime_error +{ +public: + error(const std::string& expr, const std::string& message) + : std::runtime_error(message), + expr_(expr) + { } +#if __cplusplus < 201103L + ~error() throw() { } +#endif + std::string expression() const + { + return expr_; + } +private: + std::string expr_; +}; + +template +class ExpressionParser +{ +public: + /// Evaluate an integer arithmetic expression and return its result. + /// @throw error if parsing fails. + /// + T eval(const std::string& expr) + { + T result = 0; + index_ = 0; + expr_ = expr; + try + { + result = parseExpr(); + if (!isEnd()) + unexpected(); + } + catch (const calculator::error&) + { + while(!stack_.empty()) + stack_.pop(); + throw; + } + return result; + } + + /// Get the integer value of a character. + T eval(char c) + { + std::string expr(1, c); + return eval(expr); + } + +private: + enum + { + OPERATOR_NULL, + OPERATOR_BITWISE_OR, /// | + OPERATOR_BITWISE_XOR, /// ^ + OPERATOR_BITWISE_AND, /// & + OPERATOR_BITWISE_SHL, /// << + OPERATOR_BITWISE_SHR, /// >> + OPERATOR_ADDITION, /// + + OPERATOR_SUBTRACTION, /// - + OPERATOR_MULTIPLICATION, /// * + OPERATOR_DIVISION, /// / + OPERATOR_MODULO, /// % + OPERATOR_POWER, /// ** + OPERATOR_EXPONENT /// e, E + }; + + struct Operator + { + /// Operator, one of the OPERATOR_* enum definitions + int op; + int precedence; + /// 'L' = left or 'R' = right + int associativity; + Operator(int opr, int prec, int assoc) : + op(opr), + precedence(prec), + associativity(assoc) + { } + }; + + struct OperatorValue + { + Operator op; + T value; + OperatorValue(const Operator& opr, T val) : + op(opr), + value(val) + { } + int getPrecedence() const + { + return op.precedence; + } + bool isNull() const + { + return op.op == OPERATOR_NULL; + } + }; + + /// Expression string + std::string expr_; + /// Current expression index, incremented whilst parsing + std::size_t index_; + /// The current operator and its left value + /// are pushed onto the stack if the operator on + /// top of the stack has lower precedence. + std::stack stack_; + + /// Exponentiation by squaring, x^n. + static T pow(T x, T n) + { + T res = 1; + + while (n > 0) + { + if (n % 2 != 0) + { + res *= x; + n -= 1; + } + n /= 2; + + if (n > 0) + x *= x; + } + + return res; + } + + + T checkZero(T value) const + { + if (value == 0) + { + std::string divOperators("/%"); + std::size_t division = expr_.find_last_of(divOperators, index_ - 2); + std::ostringstream msg; + msg << "Parser error: division by 0"; + if (division != std::string::npos) + msg << " (error token is \"" + << expr_.substr(division, expr_.size() - division) + << "\")"; + throw calculator::error(expr_, msg.str()); + } + return value; + } + + T calculate(T v1, T v2, const Operator& op) const + { + switch (op.op) + { + case OPERATOR_BITWISE_OR: return v1 | v2; + case OPERATOR_BITWISE_XOR: return v1 ^ v2; + case OPERATOR_BITWISE_AND: return v1 & v2; + case OPERATOR_BITWISE_SHL: return v1 << v2; + case OPERATOR_BITWISE_SHR: return v1 >> v2; + case OPERATOR_ADDITION: return v1 + v2; + case OPERATOR_SUBTRACTION: return v1 - v2; + case OPERATOR_MULTIPLICATION: return v1 * v2; + case OPERATOR_DIVISION: return v1 / checkZero(v2); + case OPERATOR_MODULO: return v1 % checkZero(v2); + case OPERATOR_POWER: return pow(v1, v2); + case OPERATOR_EXPONENT: return v1 * pow(10, v2); + default: return 0; + } + } + + bool isEnd() const + { + return index_ >= expr_.size(); + } + + /// Returns the character at the current expression index or + /// 0 if the end of the expression is reached. + /// + char getCharacter() const + { + if (!isEnd()) + return expr_[index_]; + return 0; + } + + /// Parse str at the current expression index. + /// @throw error if parsing fails. + /// + void expect(const std::string& str) + { + if (expr_.compare(index_, str.size(), str) != 0) + unexpected(); + index_ += str.size(); + } + + void unexpected() const + { + std::ostringstream msg; + msg << "Syntax error: unexpected token \"" + << expr_.substr(index_, expr_.size() - index_) + << "\" at index " + << index_; + throw calculator::error(expr_, msg.str()); + } + + /// Eat all white space characters at the + /// current expression index. + /// + void eatSpaces() + { + while (std::isspace(getCharacter()) != 0) + index_++; + } + + /// Parse a binary operator at the current expression index. + /// @return Operator with precedence and associativity. + /// + Operator parseOp() + { + eatSpaces(); + switch (getCharacter()) + { + case '|': index_++; return Operator(OPERATOR_BITWISE_OR, 4, 'L'); + case '^': index_++; return Operator(OPERATOR_BITWISE_XOR, 5, 'L'); + case '&': index_++; return Operator(OPERATOR_BITWISE_AND, 6, 'L'); + case '<': expect("<<"); return Operator(OPERATOR_BITWISE_SHL, 9, 'L'); + case '>': expect(">>"); return Operator(OPERATOR_BITWISE_SHR, 9, 'L'); + case '+': index_++; return Operator(OPERATOR_ADDITION, 10, 'L'); + case '-': index_++; return Operator(OPERATOR_SUBTRACTION, 10, 'L'); + case '/': index_++; return Operator(OPERATOR_DIVISION, 20, 'L'); + case '%': index_++; return Operator(OPERATOR_MODULO, 20, 'L'); + case '*': index_++; if (getCharacter() != '*') + return Operator(OPERATOR_MULTIPLICATION, 20, 'L'); + index_++; return Operator(OPERATOR_POWER, 30, 'R'); + case 'e': index_++; return Operator(OPERATOR_EXPONENT, 40, 'R'); + case 'E': index_++; return Operator(OPERATOR_EXPONENT, 40, 'R'); + default : return Operator(OPERATOR_NULL, 0, 'L'); + } + } + + static T toInteger(char c) + { + if (c >= '0' && c <= '9') return c -'0'; + if (c >= 'a' && c <= 'f') return c -'a' + 0xa; + if (c >= 'A' && c <= 'F') return c -'A' + 0xa; + T noDigit = 0xf + 1; + return noDigit; + } + + T getInteger() const + { + return toInteger(getCharacter()); + } + + T parseDecimal() + { + T value = 0; + for (T d; (d = getInteger()) <= 9; index_++) + value = value * 10 + d; + return value; + } + + T parseHex() + { + index_ = index_ + 2; + T value = 0; + for (T h; (h = getInteger()) <= 0xf; index_++) + value = value * 0x10 + h; + return value; + } + + bool isHex() const + { + if (index_ + 2 < expr_.size()) + { + char x = expr_[index_ + 1]; + char h = expr_[index_ + 2]; + return (std::tolower(x) == 'x' && toInteger(h) <= 0xf); + } + return false; + } + + /// Parse an integer value at the current expression index. + /// The unary `+', `-' and `~' operators and opening + /// parentheses `(' cause recursion. + /// + T parseValue() + { + T val = 0; + eatSpaces(); + switch (getCharacter()) + { + case '0': if (isHex()) + val = parseHex(); + else + val = parseDecimal(); + break; + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': + val = parseDecimal(); + break; + case '(': index_++; + val = parseExpr(); + eatSpaces(); + if (getCharacter() != ')') + { + if (!isEnd()) + unexpected(); + throw calculator::error(expr_, "Syntax error: `)' expected at end of expression"); + } + index_++; break; + case '~': index_++; val = ~parseValue(); break; + case '+': index_++; val = parseValue(); break; + case '-': index_++; val = parseValue() * static_cast(-1); + break; + default : if (!isEnd()) + unexpected(); + throw calculator::error(expr_, "Syntax error: value expected at end of expression"); + } + return val; + } + + /// Parse all operations of the current parenthesis + /// level and the levels above, when done + /// return the result (value). + /// + T parseExpr() + { + stack_.push(OperatorValue(Operator(OPERATOR_NULL, 0, 'L'), 0)); + // first parse value on the left + T value = parseValue(); + + while (!stack_.empty()) + { + // parse an operator (+, -, *, ...) + Operator op(parseOp()); + while (op.precedence < stack_.top().getPrecedence() || ( + op.precedence == stack_.top().getPrecedence() && + op.associativity == 'L')) + { + // end reached + if (stack_.top().isNull()) + { + stack_.pop(); + return value; + } + // do the calculation ("reduce"), producing a new value + value = calculate(stack_.top().value, value, stack_.top().op); + stack_.pop(); + } + + // store on stack_ and continue parsing ("shift") + stack_.push(OperatorValue(op, value)); + // parse value on the right + value = parseValue(); + } + return 0; + } +}; + +template +inline T eval(const std::string& expression) +{ + ExpressionParser parser; + return parser.eval(expression); +} + +template +inline T eval(char c) +{ + ExpressionParser parser; + return parser.eval(c); +} + +inline int eval(const std::string& expression) +{ + return eval(expression); +} + +inline int eval(char c) +{ + return eval(c); +} + +} // namespace calculator + +#endif diff --git a/resource/template/Reception.png b/resource/template/Reception.png index c16f98beda18d58c0f36b2872936927a3d7e3076..f98f8d9d5918c9247f06e29dc09bfebbd62c0378 100644 GIT binary patch literal 36781 zcmeFYbzD{7wl}=#GB(mB8ziMcx>MNnraLzw-5pYjARuf&8c78K0g>*K6p)ZkK^g?< zc-Q`&bI;+Nd+zml-p})=d=#g1jWOn$-#O-}Iaj2b%H!L(P6`4EFxYD9y6Y+{30XKfu$x&rnZwz=9h?Db z5J*Ja+u6**4(<*yhg;h^iqh`ZH`79FEk$W{c$GPoou%P6w(`ENa1CD-O$%Q;3qea- zaWPyGZy`W{1KiyV;_YDX=qBVXO8b{wA)t-y=AecAMdEHJN-K#R5TdKB29b7hg+qAR z`PeMDcmyE)g6v$pf&$!+SRve;Tznjyf*f3r*f_a_I0c0`xgdZ4p%udgS|YBNRzfft zxxWtw{7;nD#@*dnh=aq+%ZuHMhuz85nuAMFP>_R@n}eI14WM9i^Ko=H^Ja5&d+;|Q z|0PET?q=a?>+Ejp2OE_P0i z|HNcz@edwn4_EuYUd_^i18xs@fIGUo0eoElk-|q@a2YdqxEMDlHy0ZhCmRo^CKsO&51$aXAPc8}5GUsiA%CO% zHyO%KmbO+t|1N`@M~D{?!+%r84a$F)0qh@3Gk3H9BPlm&Z^*H<5VCS|bue=mvvn}D zhI2SOT8nV}v-1Y!KeS3n+R5I@6?iSU7>@|Yf9k%$^_QjzDLA^hn>kv*6=cMK4t85x zOCh)bT!72mk_&*2hlfpo=aCtk89!Wr%~Ft?lb45Ake|mKkpAD;|C?wTCkqecZuz@t z%l}K!H`xE1XjNBRz|xu7-=IOh{r~L{|3S=u8%o~R4bV@Y8+r?9?_ah|1Mc##z5n&V z-u5q>5e{G0q6?Emu^UN&&Y|7}D4P1Ijh|FaM`Co6X^Ggr8zHJ}s!Cwu*GQva3h-^Gh? zAg#Z>?Y}O>-+KRbef~>h|NDB1AdQ+3pbNlznfB|BYT3xu*6Wf6?=E za{@mcT*%*lXTACO-&ytkch;Ma|DE-poLY{y?qb}3AMM||Z*U$ecyB=`f@O*DSn{sY%lEuHQm* zli&|rH_`ZQ`wv{dh3F>1AGmI!@!R$vxPA-KO@cpg-9+QJ?LTn+7NVO3f8e@_#&6qy z;QB2@Hwpg0brX%>w*SEOTZnEF{DJEx8ozD-f$O&r-6Z$}*G)8j+x`RBZy~x#@CUA& zX#BSQ2d>{jbd%r@TsP79ZTk;gzlG=~!5_G8qVe1IAGm%C(M^IsaNR`Xx9vZ0{T8B| z1b^VViNn&%xf}$U5{X#w2A|7bU6!CQAJ4`Y%Pj%f~da zgGHqqJFn!-TQp+I!wQOvAF>?u9DC2L(SNyK^%>jz^}+Ah(eQoltYfZrF%35Ap|5C% z%PlDL)#%-PLTnm?tBed4tY5xV2-snQ*b^6rzA_CDd1jh?88CX#y+BiE#Mqt0NLP35(ymi$B#zL0iDddoRn;^lI#^1=`A!uM zh%PLc*i$W^5P|UN%h}856>0Z$d4)}5YHY8FTMoxVklPLFdk)kcH=_$!1SvJA15XHrz|J@2B1a(1qL+;@*YlZ8`J;M%#$6Fz& z*eIm%wA8&YFg8s#0;6<){2Ah&NS`}v4;l{jh4_mFYksrUr{~)Cq@JZ3P?|7_!mpBr zv-blA7f2SQvM08s3oyOqw$LEcu#X z7)0UTM+1jETh|_}*IW_4jWO@62+Y95@8R$8T{>vGH5dq1CqmvnON z4l2{TLrl!z5fFki@A6I_p($(dBTQ*6kytP)`M3nLG^wooS3=rtNd+#)h099<))!#j zG&LAx(>*(kbPBthoKToc1Qpc*g)RaBA zjCxpjI0iOz`NswkzALSZMlfoLHs0puCRoa!X@`vlJ(>$3Ij!~Ss6wH)jz2HgeinCc zR)vJ6n5EWB)8l<o1t9}xa%{Y?G2uLCYr9RO8A!9vnH4jO##G7yLD+7~M>MJv$3L%$G@bbF47jz0Of{&Bn)KB^& z-R>~cCnY6=(NR`cSHTf)Jo9@_4jd?}1ZUCVgtLw$87hVMI1^!jtzlHnXv>Wid%<*T zKb&Lc>AQFD(uM2CqT1>P5F-xCiu;q8o{mlXT`m`gh2rhyCgRUtzVrwNgYyqJ%Y#rC z?qRnJg?zwl{Z;o$&%}>S4FV0(T~ViVQn-gx>WlpVx0fk|b9A2Nq{g9RCvX8Z?x7qh zpQJ=fURXa2TMEy)$zn0lz?*@c5FKSnz_YwTC-7KUoLW)TN!0 zpyKDdbg?gqTw`ATy6xOLy!op|aGnp%K~SHVkkrD4FYWEb=7W;a96xbh-f##uSQfu- zmOY-13{@=cjq+DQM%DC=2eBd{$;SRTE|d!Y2#rqRldi;X38~ApDcFJZPdnZf>_5E3Cm5-Kw;e78cJUYqcH^Bj#%gX50u}( zXH9e*9AP++#~!4Q56mGTgh}lYwnZhxr0*hV@krwX@9HtcG2m1L234q`(m*7G9Y2E~ zZGdef-p@ZyqKlIao^GvoZTXs%(N;RC*FV@VA&=84n53Pw--<@WlIJV@!RQA~e(9HUkwxov6Fvwn(q8C5T});hBTmmv%iV-aTdob%SJd@??L z3PBca=z0^20s*D?6+=w(>FRjrFha^Sp5q?wNagzyt+}I+t3X(bSm<|4D?RNL$)s@B z2DhGeuo-126ep8Tu!Uus)BkR}FJ6`YZFKZmDO$hs`F@<7k(L{c{iei=z=C28 zgHW0l`XrkkLXfaNdkT}-Lxza)Gd}o?R81UjHdWHhCYZYusLfPjz*!7;erYtBDs-333CM1+L7j^-+4&Yz{>!n#-Ohx`+kRSyTtLrv2>ZSy^C zONz}a?V&|%C8!@bGGH$NV?CLo*HPuo`hn;jHZj7Wgjm01{4w#57mwrV1iW@ALm({| z7a}=KQY|5o+*6+R1*t+ulaAHH+n%rT_2`Fg>B(M^CTUvT(y|vokkV;K1h>XdN7kOWOj3r!>@yI&yLp0=?G z9F(ZmK3rYCrg0D&UGG&z#d684z&^d#58}(6|^5_z|wziH0M#l55rPss67hMRV zq|Ryop+2o`rrLK02T8YFC|t+9G*JwRbX9#XxxpoMP1O7u9Ti$c6b-xPPF5FDF1=Jk z6l)`O=)oz5--I^VO;HN03x@6aesw(TNa$*$92AVFlPn%{>y64Vm zpQ5Z!pxl3r*|fW2u?uBxJQc*zy^E58vVKrrGs?i9+B5qj;{ld;u+@)Zwu-Ii%t0xs zsZxZpZznd=v=M4Bj;pFF-ox_%4fFg@hgVyor*IDgvQ6{or(8*W@+#cx+iUM-r|tQ; zL`6l_l~kZO#GH@4jSUTDMpTEMR7b>BampPJz0 z=YQrDbUuBu5PFyIwtQ~PyLZep?q8KpHguX_RL}Y1F{);E)Vi$=+S%7GoOO5T+f}7% z$S|Yz1Y-yuR*aDY^MP!3xS%}lOy{E@=*2jB!*@G+JfkWpBkRY*7`OD${^mvu?s6%7;KsX>D>r;GTwF1gZ6VOv>QIbZ&ou$U+{N=)$kk|`?Sy$3nk znhf>ZZ6pEY=o%OlU(69Osw^C?e+4AH&dlse)G>~fes)KzYy3$Sxns>DCMAFn5dWH7 zpH1xV)bDE74FVZScPusaDH#pAZ)0Ze_isgnLH=YGiKVt+OdAzmntZAG%ER9Gp@sz> z=I+I|O2EeyIKCFWcu^1$oNtLneym?&<9kn5tt6ZX*{pchc7kUa zK)X^F_xT(jlMS$qsAo?&Rt>AV$7RA^P&n409M1=d@6;^c0sIw^d~BB1-|?FDAPL-$ zGBJh2;dzOcv+KyYWu0^|%7s*ZN4YQROQ>V$f+3Wl@_jAnq@CK_!-J^N_%06*PtErv zgS~u?0NXsFuEWER^;ze;&D15@#Xsi&prWWR7O(_>jOnv?4h+|fbm?f?sk`k0)i`L` zgO!c#HgSpOYlGMA!?}-9K+V^eyX6fHTcrk0qb`%*lNZl6%euR|Fk`5MS9k0veZ136 zrOEQK(S;%6)UrYyEU+aDC(UFc8Y+3_+X zH9y{&1$3xt!dSX_z6|{h=Pj4*stNPJ!24gs&fh;!c&r{K>UZ>)jsa@E2XJb_;Ko6h zzg{hW`tV`leaqzJWcj#r?r_Th|9tc_>Oj)-qwV(CpbLwO-Rmok!3@!7oVZ-#{IO|H zO=Kpgy*l6sn!vqK>V?|1%=W1%as;gA;%A@B`F8d4)%mVh)d(;wD-fSQBvBiL(V~y6 zvLdVor#c6F!}Oy>_)E(2z9)z6-%>cWGQgyr+Ro1$H?5WOBC}!62SGv5DypuxX}gKE zSs1;Mu8QUr=#qj1VZlS7FlVOcuS~UYD;OA>&^*&r^gq*t0~uVxAoEL09X%zK_Wr~E zAxFBfp|)fh1L{cmxO_7032h+bC5@;#+bE{`W&}(a=^O6{UATz+{QLm0R6ur6b1*2p zuM_l3N5FXjlM(*O_yWHa(AbHLP)Jr_$P&CU`YCwpcyZeK)!WJOhEA6+FwD4dRY zqBjlLapG6Y;^w}-b%)1*VsbR>p$7g;$XeNW%%KQAn#+GpcwUmS`{eLtR+moGPok~q>bnS-$l;JQpa1~EXf)_vb3Tka z&DVkb0|REjs$TEiy#`5P-}l=pe--6v%52*b2YL;IxPmJmZrZBT(T2i;xdwg_xT;+S z56hSZh+)WMOVO%1%eNVk(b2na8RkdZ!nYtp=2%e46gnfaXHKAzt}4FcFQ}McR260f z0)o&dy{|w`Yjse_iuvZ&i>UJNW_b%aUpdhuEtqH|+QBdzw!VypEuXHvPZzYT&Jt6b z$3yGxad0wHi^00nsOA&A8IK7gAUGHB*dPo%s?1t^EPjSRK0Ypi-P(M8-fZFEaNFc; zB-#0k=`mhFb%h)I% zN7B%|a>gklWI}oUW=QkhZ5B{GEX*vdOOrqfDgpo8r9@GHKofLv?(1w;c@R34lk56~7Yr%PIgy1SoC^1e|^B zTPiIrUD9bjBT`8hcnT!07hlCM6BOfguP7{TN!fJ5=X-HNT6z*$^7p3f$`(_sGh0)5 ztoOzZoL(kY3HhJw#SyujeotQh*~ftuJR;NE6mb6GL$>gUk>@1*Q~``$b2Mf545hTq zDmzT#X|Q^ZU&7~m!Rka@LhT87?O@KID&|sN{dKtrn2b6)Gl)iz@T3L*6}OjzEUpA* zFa$LhpDFkAJrop_6$t|D7fPh)`tvF%kD?{o$>~7k*n5s7FYYnDcol42QU&Ce=(l9l z=vurn?40bS$l$KX9>}p_Urr6W|4jS>rBF3Xu6f>zD-%H0&~1RXREnmL8`wR| ze)H#k$oJhHHvh_m%^J9j;iYG53ZJs9;df!wJI<9UId^27um+;Us%Q(svg> zzk2Yk+G*ZqA_8`Cu_oT_6nH>EDdta#3^)o33-D#2cUF^pObu?dXHUnkYML>f) zO|HJ1NHK>en*@@HUo75r+4{ycJ6LAi?NB`%0mNiLc^J9>y!SgvkSpw2FIsN8E&z|| zop*}2F+jg-_s(TdGM}<0k95|l&CB*pcKx_utCGY1%i^~mJgU@ixwmO~w5c?3UGGr| z?Owsh9~ZLp`zgJ2Rq!Y&zQhV>l9+OmqzOfTdJhMJj-8uC$^U6raeOzoZ@eWxOw(Tj z2a6s(UWH;4`V=ft0N8oq@mbH0dt1n&!$Pu%7spUC-E3{Y$t1I-b*mKsty$%9ZdprDYZm68P zwr%=JzUl`3h^4=%4O!u{LIZqKsY)QdS_%HtFU3~h1cTKt^nxoBAF&H{{Y0mFtN4^v z+5OeCdj!WetC9~3><4Q zbc}uIg);5{k$lr$ILE?4)^&qh@#ZffpbYQ4(1OxGI0ytD%@SP?SXo~7X3{q1A_StJMyKSUhkzMDLcMGp%O~r`;JUBL zkAB){Wg9WvP0V#5;u#_c$$VhrcgfAbw)|Bzg$TX3?~zyVt~6#tg%vMQ!{MKG*YLRe z1^+Q+H}>l!>_Vk#m#tsE-hlNO+V-5q+jSR4`VvwLAU}~#g1=5pZ38?BQ0ha?JJM~% z1q#tFz{|@s13|aQ_)pvr&;j1T$;_JA+L9+daE;=tbIU4VeGffd%MEz;9F2< z;LI_}@tcX=#pLFb{AH#oc9-OzLx&OmvA86M9EYWQezQ})v$Q`FpBgc@#Q*Fx(r#Vc z8AHPrcU%w6G$~qjQ!bf)XC#^8mU4OUI7#}>2pvJEPIux{tyc*wb_H)hdd86r7TW=z zgD18KH1}M9?Xk7RdWTvpI^g_haiKL7 z89pN2E|An9%_&f8O*Zl*L(X*hCI1rOz`B9$0F(V|qYS7u&zk*c1EiS;410@L({)Y8}G;nu$Qb?-fYH(}UU5>Gp{Qj?@EO7&U z?@PHO-RJdLLIwoPol@Fd)J5D8S{tEBK^)6VAw?1v`w8OkiRu^az0n#;@WcRJxk!;{ z)JB)AXOW9qI1IaQ^ZlO(PozJ&vwif5;iGOZFJS6s>%EZaCNf62zB~rZ)W*Hr(d8q2 zp?uR%N=l1M>u`ajs&!_Dl9-tIgY}pDTR@f#)OCQBZWrEd2u)yAMY5sEZIPP6)K_fs}WT0gV}kUeR6q@bw&EGZoJ zNug!1ZWIAy9QPG_Ipzi0HSgS8aW?gW!!hPBcf8z$ElRZ8ORDEyAl)yZ_)bly4EF;L z)q&8HT%FWxze3i~rIQHo7h98+wNlr>>I3UJQ~Xz=bkauh;ll^epddC4P^t!M?!W|3 zmZ`6w1LpM0uW=xeaB9BfL%@KCfJJrVstDfbm3T`9R`2>{u;2@#F((BFuX&!z-dC3-;pW%a?3gE@VV@Yz!#&U4BfF zYH{ZkyTdraz5`wS4?so5;E(yWdSmzV3F%e}Fhp1+cSTyJu(l4~DK>*qhNwgv98kUC z>^AkYU4Z%BHC6$mpNtlYg~~S%ce~g&;17-6nLp{`hcY@>Pj@2I;9VeFl5S2*O?Bmxz?&i2 z{J=XDI3}YP@LsE&7`C!xR2yz(xHN!1a_L5-SvqR3u@;Mc;&gNoX+BD%J*gc=>$&7Y zEsN)bUez8li_D_=gAVvl`mM#5myE=(_G91VwOuTUFy*rIeG0k`M7~SuSsUNMe%bL> z<(H-J$tHkO0%evOpl;y|II}l^QUVzog)J8wE9(LfJ^R`iH84`HKXXL|sg z3Wv2MsES1br)S9g3K@qYVBSA_7>!Po0wyz5y5aT#)%L*ZUL$h_^!O_mAba%(GF;b0X-SeOa5eaveJ_P30oM`G3f-7$hA2|VCjLpTc=jO zNXYl}dNsCcS4Al5m3@vA>rdKLG0=}&?@%juJv!PxU3x1@suCHxqrDHL3Bvc5n{9R) zo9y?*$BtS<)Nbbg)Ta+7VZxx7v7M-(YB`TXQGFq4*je{*Jp8PKQS2$Q?twhGR4<#@ zUy9;bnyGa=Sz#291geGo+o|narFuYVm_(y~tD+A$Un_0+2}MTo-@bio0rpB(pN)1c zq4uy3;jATWyvgCcML2HJdjmfsymaZPm|Nzr+uY+==7jNHNAX^D2VGzRK7FU@+!3gI zFCbA^dG&a2dj4vhUI+mj3=aaV=Kj~LE5fqIBXSU1hAcA@iD$q?fx@gn^7-?*;|O9! zE&HMxXENj=7<;W|;`0wgM5Goe(P&Apf8$JC;clw`^Hf_%Jvdel!%T8}$JnLINOY1ylrezEy)Xk@wS^#C=gIw{Yt z*E`*&+?Ad#r|BF9LPyA`x%atxH*mhtbTn4>($kiN1n^G9L2SarB*ZRUxm@PSlJ zWPxVwXVc+`BD?00Js%L&T%b4moqDl9xB@h*Ys@uM*y|3`I`8-Hnvm%cuZBviv{6mL z);|if|1dFp-H94#awUpIM=#3mI>AWa@&-4HO~Y5)hkA&Sd^#ursvX}yJ4M<{UL0u= zlyBiD>0O;0?iCpP*xhP+Lg*{Oq6k_I{S2cP&4h&kR)pD)Fo}tYi45T<-{;OR#e5s* zhQ7R!e&&oUb^$5z36NOCUSI8A-=F?r4MbvD=ND^oD&Vw_q`a@Jt*o8fZ}Tr`WSxzE z-Tu#LD6&y~Vk#j5j6@8zcnlC-pCcnB-~j!*d2kpQI2UWU zm`>iOI-}|z__Em1lkme`n4Nvxv1)%rkpr1jA{{6YB4ZsUTzy{ifS{mCMNa!8Mh~CA zTO}M}^=Ra|;BwhbN4?cg|KQ?2m^co)ri$Wz$@RuwME#q1GFOsf#J3pNq!${Uvz4Y$ z94bU7K5pB$ILx`4Cp3M_544}yRnpMrz(3hn7R0(ukHqFF8uY$|;R5>|sjtpJZUemH zM}0Qnk_>p*_=+zzDb}z%}Y1H!_u8%8+CAK2Upw*2&un<^Z<3gF)K;#6n5vzN`PepnS)h{7iCYk7 z1(Mj3sdrlLNP_M~K;$&Xz3gykASh^fQXt&XnvB`ArK?UJO-sg(B6^)&QOqn6j07Vx{Z5#S0~-#OXu^~O%Fh^Fon#Nlvbcl1<8NE z#Zmt06L8tX+st+Ni&R4?>6+ph4tHiPT_h1tm8tozS3GyVA#2}3li_|?73=%{TIR%f z*lJ%76#uS7w&ZQ8C+dn{5(mN`=aJCv&s+p^eP9ZUzc)jdW|j2P>DE$ zD?%Vfv6YUSpajT_0;H4u^iW-L=iX|T0tI~5!Aw!%;q6kOtnsbfB45&%I*%{c88#&Z z)_?Hf>o~iA7f*8SkzAlgYtqx!EjqkZ|_4<9RpwIsDn6 z5OplMzy=+HXBdQQae7JD(bqd{u@@DhGSuUBM288YZ7%_B6$4 z@h5$@$J2YA*z7A!)u{^xM*(_CX29`4i6>q(SF)%BU)uBK8p9+7X1YsspxP$&g!j8b zMKAl6)tS5mvxLpQ%Hw0w1PuBxDR8j!ogF=QwcasKjj!og^!Ya9V+4j0bdfBPumWmn zW|NYYT^P2d0e=YOwz}Gd3S7bYB}eu09cCD~bY9NIg|N9>-|-WIO=m?MrB*wrD>(lt zIh-{~pK=)}+;{_JKbBT*ogMo8LfHFNj#T&^LgPdj;wm_M!*7uL%z z5x38HyS;1&FJd6`YBmiDbi7}sZ`4FJrP(@7!TBqmgYXtPInlD;(3rX4^oPI+!9^+`^bbbgL8HXd?v#JSCY_66TM)1PGC%y{p~>t*)*64y zeNQed^d-veNWwGg*U%_)B3Z5XA8_p-cHenIo4=$!F}Zcx>(NEksJBI#25JE6P{09K zsdVm~vw4azTAjz^5mm#kluRs=K5?MVfco_)&Xjv`ph$NNyZ|vVG4L!!+ykOO6ljb| zA?LW_UgGo1+e!CQ6C$Yd3)cwVM5P@Hh>CrG>d4;1g}K!$(K8Pz>QF@akqNnuYP=G_ zg>gBi`2``iSu0>I56}^>m)v6|=ig4a{L<1{B$zPXL`ZqY;9)V;ld_K%rJ;kcc2qmp zI13gGUwTb$`6OjKu-s!6wc)9iZuZ)>`gQ24o%icxbd@h@z+OU=Sq;w_5gl+h4cEup z@vKH*rzU7x@aJO*+@2r`ei}rMahXNkWIvAd4&^k3S^(azzj>6F-k{5__$}#KwRiGg zzIA+bK_xiSw;U2*_Gg_{-o3JPO9QKaFJjW({_Y=3d+n?tq4Z-=iWI{exaN}X26$D= zf?=i9!&e13u&;iSJw2XxibLf_yW20TlpQ`{zKrPZ<$EKRbvqy15eB`?WL^B`-%Rhl zR^ult;_G{Yc|nUtv+8l)p530tqTt|cYIL|>sz8LtZfrH4fJ-AjYv$Uaj0 z7F0P?YuNd`vFY0WsD2${$cY|Ydr+mQkk=cDDKB&~m>zEE&8wm{sllu53c>rn`jS7e zwjA;#o0LttOsa zVpaRjMh1P0rXm&TcRwiea{gT@_6{cgk*5mSH6XFNC2q91v7e5XMv5m)$ zr5J%yWRue|Wz%aEGBb}Mohz>`${F(sPVyedP0s!4IC;JOVPJ9`Ve! z%-MRg>-t$oY22sU#oIFvg7}%Q^xSQkhw;KHVoR$?y35__FP?ycXmszSQe{<$lfl8T znrjBg55|DerBpY&8d9b<-JS<_FCz`Hjy!d2m$h+w9rFyMxl#U)s$PY zwE&@_5w6W?;1wljPT^>AR3bElnGan}Ecm<)|5NEyDRbNB?C}XERz;fG6D^#Q9ZCr` zr_ncI9q{B`uR3qNB9hPVyi}KCcN?~`^E>C>TxE^pewZ`{QJ;>U0M#a}X+h?T$cttz z2XuJQltAqEpe&Q5gu7m43H7HooLX|r>s`bO@vBQGR3laUcl4vWTYTl&D5*~(A3X5L zi}o!QYo2mt41;jvrG-EJb=tzz3EZ>R*3p^eE!j!0lvi5iyCtnm#g(Pe)mUv#4@b>m z&y#<>NO5ln0_v1#onjO@$3k=a0^Ale#h&Vq#^F7TQ&=quV2tMGaU`GF@?JAk0fXgS zk0nIZQQDZ8P#~BDMg1cOc11We*fyZJR$t4m7sq6vFtA!xLIV?qNaN;1;I=2Lq9ijK z4H*ywg_?+7J~9SQH^e7jx2P!)Gb>1d5sskcD^_iM%^8W>ADGV#{6p}nTefnvNDuem zn%C~-XME4`-NBU;Z>R}tm zFUxp;k^z&3J3kz(CjAR3v4p}Z!LPC2%Z}wT=BEWJRL5DdykcTMPPvz;`KA_-4_NSZpHp6wFfxxKg z*5v6Uqwd$K3r4mbn7lh5@&}(subnwWyD}ys7NGUr`gpN+Ms4^L{h|asy~ZIFP!- z43LmbrSdrG9jEUH1gK0HbE+TV8}!LtP6Df!ERi3lpZ++0gPl!>m9Os`bm+wdmZkBD z$a~Ow9&qqO2$NN@<}JIe_4RZ|L!~iEy4|qG>-}mRHgnU;_YY=)jCAc=!G1^E$|r@V zIfrVm@YdhrjeKO+?9dDPBp;-iFB@|Pse)C+jUaSh8gnLjJyy~leNxB#PAi#>#BuA_ zz`;WrEbT~T@94Mkd$M3eyc()$K}K*q>gc2IWEkXptvUId^qO6g*xCJ388Y2*0x7;I zot2UtxVLP?m)i(?4|6@V?pw8!d0flVVD#`X<##fCd?Z5VbGdZVqa+3434mdfl8Jkf z!P!Gg5_6Qj+g=zWhGO#Kv$JCqp|?2|-)L1xV!!pd8ZNUAoQNcBHAqI`HPBUX}PHj;lMtm(6ig`aY7z1RL&A zDx*mWyoGcUJSNP|?MrE*8Y{Vi%$kL7&(9xAUX1D|$yEes>ZMYs+Tq+Y5AO9pAY~K2 zo}CPb=3%NdQ_GY6K=jz-mkG2)h!*Y4PoS|Db?GY3{G{tEHQ@^kO=hI}aT;=0dN+1t z#I!sf_Ka5q^ZE4^mCGDfUr0nw)!??s0h>QOaMv2bUK7G@ccv9F%4#n?76c@ff)pb3!@P^2$xuxG_zi||Xz#^9UyQ1GKS z@sZ#0reB{#8&(Fb*5?q}l%*H2VAe&Gvnala9(#f`J$PH*(t+5kdT3hN$*nwWxw!8V z7+OvEXX!9Mhp%IUWu2a8x9A`140FKBp-CdQZj}!;l$+28(w?3d(tK zthh9S%Tw#+|8)R`syEoNKV(=g8TIxLpW$}G)%by70{6|h ztOOLiYSJnEGOK1h7afoM=@TE22^aqmDex;V^&Tmw@VX8p>OGB~XWIPM{Am~erlceex3>E9R39uikX-d9pU(J)d-NZ3RoYQdSMvv@(BHTk{VF?k5B+ z=#!!-(sal~4Vb+C#5b|?GtD7f&;1w2BLpYTg21*oZ{66+GZ)R5&D3(F737y^KD?~k zyY*|*YXtWC7gZ-2Vm7K3i)XvI6{)Ft_N1%k)UeMPIjd}-X5~&i_4~Dfzc6sBq-J;9Ma5u;T zLH?Ag{k0%y$iq~;l_bo$#-7!B@KJZ&YvLNY+GN{!q2uwwvK8`uP5T^ak!C5*bZ%UF z=-D_ivEBYv2KxeOrk=}1FZKs5QKzW1It{LU?Kq5A>N}Ugg^Vok=o4mwhDASqOjtAV z4>aiC1M1C5gAQ^j4@}Q@w4S@!dwLVOKN!pDIQF6Fse1yKFWt%UWDv;R;BwkYCi@(Sg_mg7Sk?NlpZTU>y~2vsPDkkI=t=) zHBx?zDr+no#$6E3At`}9hA|nDz#nOtSYb-g0SS}ZCsaedd=&l>@7vXDx4fud>Tw_t zJezei0bz-j{cyd|ZcOuS#ukY1BMgTIeP(AXcr}JQDeX{3km(U#gd}(H>w`#C$cgs` z`p-0U98{z4kni&OiIk?bPtZXqUuDEpfmHge>iRwrP4KH+TB+5|i~ymynLyfXmC6)# zrr2kZ_>EC+(60yy=IypNa8|%ix4Eih=`w~PYRzQOK^Mmga0o)DpcZBK_Ta3We3y0G z{H=~;`BRnQuk`3-gi{%JUNe<}Ke*Hze!)E`tZ3xGmW;zNRkt}@=&BckPMii~(6l*2 zlQHly@|g;(tm2?JMYYXT;p0rHW zH;iK00{SFUrLj2iL0E{la#QQaDI7d0wCA``1u*kt)GG;!SHTf9uZMGUapUxgHU%G} zpGNIagtR1TGt)rNbrH=$8J{Ih`EDhGq+WXbs_vsf`M}A!jD^zc8_Nxc9#Y)NUBh|-V7z(<19l7-VQdG3yh6Z3(}UH z0!W`}^|0|w2DG^0pwoPuhGK(l@KvosKFaQ-&yO-xFOssvq`HN&em#bSRsNLQ)%Rt* zlMDW(f7`Z;Mlc+Kdg*xgmQ0ixYPO7lVa%{afl!vF9w{2e&ak;a=6D2{XgKCl`#6_raurub)jNy~l#$%i!k-L@ZE-SjT;u z`4AE>Baz+($tQGSlQS${-?9Tfmf-7B?;4{=5t-$p@}g zOgh~4uH>nF%fFG(sf*aj2JXJMI2b&J(&V9&G(2)#wmza92m`aRs8mHUg$?!Ouu>GC za6M1sGRh())1z%g$$T^ZHh03-j)(}=@-lGU3*6PBXA`f98{)PX_(e376rZTP$f1e} zJ)Tg?*-`dgk_bW;RlC6!+5?%%tX_O?sZh7MlN$5K}tIK{dP^snjxc~)_ z>O&vn#wYEZ9T#m4ii)bVtq1C`+^ib(NDy!b0rcTh9i}{r!n-J=IH^X5N!`;@;x)<; zyuIkVQ?79e-tmOksC!BigQzmcro3Fb@G&0f;dgsCFEximD_e7O)})F&Ifgs_vILnf zU`3vN!}*_i%1xgV!5be(KQ3XT(V&t_3-^p+DmJR$BA)VIe-h*`NCKe?Rf8Io6Cglm z6uwFD)j4rrqh2Ny?n=XI0j%X9;_qfbbBuN%8FSffH~>>+CmdxIZKQ?=qT9==!!*c%Or!WBx& z;pcuD%mv&$ec4|joJsiwB1r9g;a%Y4`9f1=%A8M&E?_x?g(>@=b0AwtUZ< z*W623{ty{XDb>Nb=CF_@|CV1rpNKHxFODwa+$pkL?<$n*M`7HjBZ{-yIcV}95%_Sq z7wQeO!=7RbS{rt8baz^l<2TcNLg&(oQso z`1~`;ltgqCP|T+u=`VIwWHc$|DCjQ^w~?Mu*iBv>N8Y~-e5j&#Jk0YU^_EsJ#O!=H!JJV-~BpZ+uuK!J?m&;WhK`)oaX2T z0?yfhTUF6?3LmTA#Mylli!luB0hMVN+Y*Ha*9N{#paf18eBfkw2Y3X(sE8||9>{0jHE^=LaZ=om=nIUc& zN%r2v6(M9-_Q<+cq$o2bD+>AcJ3W5)@B7ESpU=7HzV3NHpRWt4kzZbFR^Qh>3wgaZ zIi5qZW+oi{yeVz-ccFmN4(@4~ZspE^lC)wQqsF9|`SMc-dH55F8Xpxt^ZQ4<{@f-= z{Q2LjF%BnLDzL)Ce*NeN^Y(m|04jh|s`SXbi!U1=8$&Q?0q$n8)_>iUIM9D0&9$=d ze|M~S`YU|2u|Y|+Li@#hFX@1!?b*gSeqH^;an$_RK>HiLJ#_vYv47ur=L(KCK1~~v zs)N(W0A(}>4AkmOWOCncqezQ!t68xpY5@x;94XK7iIl2Ne_oFCbEi@tZ1Dg-=!$Hn z^^OhE!+*_m!U>{5-=kAsqwX|Jg7yg&4$7EFzm_!$j4;od^4(Od33AIVDjHnxkRJRR zeC=N`0PyrdPCnrzApQ|!;1{;5x3|IHIvmT58d)jSO2)~T7NJ<+VAm$YX#n%KxD!;z zR!!F@fjU_Y+)KJ-`113xS6*$gee272alvX=r`rR;Me^sp#Lz>MsB0#TY+shtKY1J# zo>+1aq8#i{*&_p?e~$~Xsh%~{x5Q}{DC}A}r61jER_i$HVwXC4ju*dGPUr4!TU>Nn zoX3iI^IL+rd~-lSVzGQ%52fJU^UW%{P~*PZb$?n!Hn>D!)DO)6PZ7Hg-~jhqW5-7+ z067A?*bg>qg6(%`KJZU@_2oRcIYUW07Tqz;AF9&b*HMuRWIDh%ID3YAN{IbM@wroQ z7Sj;sgtK!B|8eC$&AG{_$MxGJdCaSM@!CAe?We|a-rtTwuZ0BXJEIqZ&xCIu|9QGY zu75(cGFnP+6M01vv9vkzW@yd-v+F~}zn>IY&G@Yh)uv7;ZR&Tf*~FL9fOVq-crC!D z%6g5L9~8zh#y`GecfL0y+_0y->E+u5)syW(@;2^$*RGcu11!*@**tbD<997rz$|uRSx%;YH0wCff$$v07$tah*gWPwsPMX>c3w znnQa0BF!nu8WwTBZH2!Qxhm0F;;+su-H2treVNCkP9;P~&`r(y?(xTed;_>|U}`@V zFqHVJeI!20#V?WxFyc^6FFLjv?NvY_C>46j*Kd@gU(NRi$`pL4s4;&6ZUTU|Gd(~v z1At_0QNekv4_`5Tr>asS9-7NK2-K5dV8y1l*0{IGR2NpC1p6;d%j;~L>Jxlqj3X+G zk}A*|MaWfnVp7!l7Fos)$SEXAJ;-h9lpYy-P z8l*6NtgvMmdX;?q73#kKOYYm3UkyMEaFxiGiJM(WPC%b8DoZgnag zlAY0d`((j}PgRY|qBv`FVSUyC=8|@}c5^Akxje&iZs8rZT8DES$xWGd>%@7JctvLD zli#Zc_=JDZBNo*O5MKT1z)76G!F=}-V4LHh6o8ce$HoJ!ifZ3>BH?cH7azE1xIroh z$4}rqf{5}&IT;Z!G>gC0Lx$4jzJ?gCkHEfPLi}TMl z3IZ|#5Q8hf4ce#-EW2#=t*UmZ4^=j;9UOF0h5T4k(>Lsg1Qq%Oc1xR!YXulBfz>B2 zE{?+@n7%}3P~?W)Vlt|-y!rG>cF4!tgpaMfTi>F|lipMp6&z7Q!}krdx|)COdP5eC zZp%_-zx?zL_V~`%bK^>*yKP<`r;n%3uOn?mk59{fo)S}eA_d(#e18BBOpAB$-xS`K zr;@{^QkQ|1FhW{8p!Iu^T*{LJ zk+;Fs2Dadja~U}5P7g-2{5!H019D{#>Xki;!D*24=(z7q$Fr+6jPF~nS3NoItD2=N z^RU!)dfH+W1dF+6!PGZm!KJbr`Y)2$b0w0#7ym2u zO@;$U-umx(0ZQA|dyyZ8D=N}mK@SKu6Ym?KegT5be#sGoV9*3?Cp8c_Ks&(zPz-l_ z>_d4`H2W-CEhGBZDmP*F@A^ko^Z*eIltHkNE7I7q)pbm`bovA(q@=*cU(!59eAgb4 zjvgy2w)j%W0YK;hb2mDFNhkqRg!tAWeo>eucobLXBRVh`bl+&h0Qse#eBmYKBB6Xoui!6zPV-MvlGivkP$+dWOXl^LbASQPMC#|sJ zF6qLTkazhuB!guNb1~34xUk-$6|~L?6A#nE7$)NgGIecXhBOy4Xpvl&KF74o*fPhoeOe@Qi|`f=b@mcUF=|K&r~yx?3wIx*akJ z2HIWsHyGLtT(v!#m0_112Tm7NOOZWGOH0KzogxmdU9&xlr>Zfw3{t}PQqdf(iAfA= zcyUQ}EUGb4n|4Z0l{Y`&nH<>Hl_~W-O51=kI&i(U5;;Wt)^_y%}}|s|C)Y zZ{_u`SFVJDK(azKcHPlIXvR95Q}4YrAFOPt{+nC#IBs`*B)lvanINN4TdjT+>ahE} zUolwQgb6`O!OEP5jUI~DHhVQa8?HOOG0A)iI(t;8IVrd{p*92w`m`gO^*HpMh&tYvQyWAXq)x8LBP1LW>_B|p zf3-!BoNc5}m~#FLHU6OC(D6kQCQScpV>DUAEIe*ss)p&Q?xK@em&@=Nog)&Rtw_LP zYd_(qoZE@V$Gr}$3|v`ct0^;&{;HYAAG~*GDvX6}QrL(v*fS1FuRp3w%+h6^m}ugn z3V$&la7WVxT59=%k?yN#JZ0a-9wbDm-PSu*aCPB0aW_MDGk(PM9}EKU%xs@)>)2d^ zB2(Iax{YG?3cl1$F$J8$M81B}&!W*IMJ_8V5^=S2p86v9?bsPIg}VDlSxjUF8!2+R ze@5bVuxbHjuTALWGa8K*>binf#aZ^-JbuAm5t!m)oYwur*V)yHWbM2v_aKy+o%kxn+S&?mvn7b@~Kqw{Ji~3S_NMQxEQghTH)(2+?FEZ z_AOLCtfoNKqjA-Bhb%oI7!StcKMWcQ5)?VYLpOJtS$eT@0=lHqksk4ZrhmObu->L@ zT^QkXu!aOXBXfyra|i%bHyE3P>H}XB+m;SLaDG+>YYz2=7b&B32NzO+0%hZs)tW_CS!0 zCG@T6IRv+;85kdbG4x({Upg3rN_xoEK^Bdl3+8XMml@EaLiMZVhG9?BIA6@H9#(5{ zJ%qBPdi7tg-Bc=^F)Hq*mZ=rZs68(z-mO*O2o$l3zP+wfJ#YwlHBoZ(-MsREu@d`Z znY!bx8x}cSB1f)6MTKJv`kmoT~ z?wIE_ZcjEZGBOv4*%(T`k{hHAkZeG}Qt|l!*}BOhlI&`v@C-V*Z#^nBKY}yRM}V4{ zIiQ|_AF0mIW)$ZzR9|F3epo+Gs-(2|So@BG z5M-H1!fI{SU=H4lseQY`W%!Y^Mk4HCcVUSGy@&gn>2RXpqc)c32Ha5JhYBmNFMTn{ zbFm(s9Cve4eRtj+!w(vU08Gy~5eOG@8HCqA54M}LcrpJL*4sQENwEnS^@CeZ10&lb zl-E6V8QcG+SgH~iZu;~;k;(rp%%b^E-@u|k5SZLOdWb(3$PBq9DGfX?PEOOB*#r7| zZHHdYi6-@z^2PymHIHX0F)5c;PMfF)U=Yp=h5RmXx)dzhlPjIP|BXE5ffAds26^jB z9VrH%Ko&J5_elPMGuv1w-?;=&0^ddA=t}F}?*MGnFoXl9#^SV8CB8-!^o=h=fw^#pt*i zlI~Q5z^Fv8&$^j%`RQ~yQX?QPFio*I z5bBIfOn9;~$qaIx0kH^DKz_jYj~$%%gGOspG*{lgxbGmgtl^D$>6VtqDd#t6FwF*H zYi^I+)mt2HGAjN#P!N;^4OpJl9=Rm2Ks9kMW*h2TSC)*oLwip*LQAyLGH$bQzX#?7 z_<~fPNYW`MeBraan#@A6ZE$~6zg9|I6}OY&O~p>7BB`+P>kX2g)%wVFd}{H1)QbJI z*K=N&hjTh&)uMbq8gH2CLGu9TG;OIVL#2s=OkmYU#51x|Tr2Znn@jGO^->Zn3d=ku zxU4JtT060#G$XFspGtWwq#ebk%!e4xGK-igEDmrwHj)UPZoz)$<0nraiA`VPtzxNp z+A!RBCdw~4dIvKYa)kvyeWO#TNPbo(C_JM2Z$6=>Z5|jF;m0i#U;c?AV~6?5o7Ogt zZ_VAr1bPq0uIi$|DduB4zi!Hpe$2PJjzqLSm*~uD?ls~|R$af+x{nqPFcz*X^7+2{ zKm+UT`BHjTx6e`W$#+}9;nt#0bA4x{eXe#Zn;u&~81*XkAOrog$+WMZ9sSXSBb~7Yc_=1CtqqHz>htX4|ooR;!>H>Gr6{3x4mb4HG%SS^L-Y z?7=lU8-z$Ta@zM)S#M={jdl7=k*+Ly)IE*+Q!8E*`Vc`A75Rn`wvc;97WG^+QM#Bd z2`5CL{%U75b3@ZHw^I;u5wSunZ||AdezJ8Jf7;Rb%_3s3>M(KBvcSpTi7l5tD?>hj z`-E?9M}GNj+>DK{Tye$MkPES~nrH+o1y)SLvE>oClw3upYob$C^GD%u_upL$EZ#~7i??lwVAGXaU3(HSo9(VXy?trY!+vJCN?hyWs8vxp;5HS;fVfXHe)2}R zq2i3POI_z6;BC9Fa4h-9Iw%49+`0V`t(DloiL+x0qMbFmbVI8A^A@Vru}Mo~h&q&9 zx$4T{<2yCa1k|?#ZPmk0Fh5n*46%>l@?0 zTe$h{mOjaxMQ!uk z>Xi5e*06z%43Pn9gcyeWH?cGbJql$v20-z1MB!tE3@#2nt#OgC+ftlUpj#nsU&;6? z^g@X<-o<2tWZXcM`q^e4M*d!uQx8@gRT1sc%wvd40xFY2+!=1Vvlso+I3-aLz@&4$f*%ZUxPXKCtFyJFxMAufJX%pT2K z_YhZM{4+AysO!;LM{T^qd@pB_xbPPHqz4R3Lrc3~Aq%Q1w$dgvKa?L!q&Q<_whr#@ zzq3XYF?Zwf_gNB22ZN=^JALOeNkJ=qh65I%ZYo~a)>8v3?^Oq&U# zEQ!wzpUaf*5b?3jL}aS(WQT&`orCw zsRA%7^f+l$p_6}qX|a*dx)B>%&0I10%k>@{&D+mekSLtNEiZ7&YWt%_!Hc)w?{ebm zJ+rZmV5W3#Deu(w5F@1jVYVEVCsLf8zR60gVzlYHO=Y!gT_PfQ?chx&Zybh93Ib{l zG(ZbnZG{2W+9`CRu&X!;j*G4qW@GJ-Ytq!*;)sw;K5VFo;nBlsI`grAXsjc;jgFG2 zK8-+f2JPS0t1aq_o45X^)Edv>t@pPQe3v>4 zGDSStTwvscFwQ}LkNM}!6PV8I{Ym0vqQpezHPyPA=I^Y6`tRE ze&g5NqZ<&*+p*qp{MhOs@3xhyS)YGhOXX}U_UPPhmYjy;=gSfdrfIFjB!izjRDOk? z&kT3@ppzvt+yryA0o&9z5*#mx?3#gZivFOC7Th>uyc0I4_A8=l&^u@O#$_(23HSFDtB~(NES`6NbC4scx7?A{U3i> z%fBa|3nug=242Un7Tt)KhzFLW(ZoCW?Y0>7;Gt2~IAQC*zhvrbC$F(}^AKfV^CEX>`ut=A5gMf5N*Zc54=l#MF zWS4#Bo|!9V?r06QcbI6TXdn;>Q&B-q69j@21O9CZMh3p-i9SbwK-3^bIq45xxknxQ zDHH=~5|3sU+N;Hmo-^nQ3g9|$XfMPpy$6DTjIEN1Z9+CUipa}-J?iJ&|M8S2Xj7x&=;9^&wAsGN+Ivb=HlMBfanmfYJx~74`l=&MdB^10(zD;8|QI*<7&fa=(TOd2OB zYGq=vWG1iHrLF3^s(e*)cSw{Ri(61|4~yi%Rl=&`IB&#RWYu#`DL)F_H#KQLD(Nml zX4@8{zR=a8`LSz#aAk#DXiv*qovoyYGAnYjdb#3+3M*Lslp* zD9XJ9N#rLEFHXx@R7FOCVBI#uD&?V|e-8+aW1Cf@t?^Zxc!3v(=iWKRK~bP-Y(*BD zF~-K&H>!9*y2Nfll!mrwGw;!|>-qYexIo(&eVe}^Z%QzNjD?|KB@D-1Y0uMdHcT0t zf*UDZt}iJzTLINHr?dDnfc19IzS25 zRQmVe|IfE$$ozscQ89Yc1XM<_HT8YXst3|q!<}`}z(w(bI<9N|4Avw(+>HI&TFGXD zOxux%PNijins&hK2fOgmpw#j&;2rO2v-h3OCD~ti;2q%sJ~$}sJ$WGsKMawI2C)^F z9yo$YJAqYCrLsCtEIV``UINjo)LxW#@f&r6lmp6~U9t3vXc&$BGs~tBt3zunxxOmQs@8R;deLAxxJg?C_}*i&uiKFjUr#ebY}> z@b(Fs+#*BaacCfWQA_rS(ouYrG$a_c&}D&@%M8!$|5{cLFg!3om%Aa{I{jymMgkL* zlhB*>!HK|gSFyX_S_>;Ha_Q!!O$%rTA+(pDXINrrD=RCdSi|v|)E!7f6E(jrAAg2I z5j2M-V|+#+p*ZmG2~54MN#ZO{l6jQ_D}U3Z^%h8Wmo;gH3zru*HSuHI`!j3aUgR0e zSIoMY3qkc)B`@d6=xmF{Gs?5YRGC4{l$^uyD0{!^F;K86`?p^nguZy62-{)Z-wEXi zHx~CX%T)-Y(8hmiK}qDnb3=QJm%D#w{_ebe4$RPBnKXSy2Lg6A5(XRi@1Z}k5MNAxCVf~rR5e`EbZ`HbCmt+K;c0O=W z`u}?`_B1-9YhaMWLz7}%F)dd()&2M=_Kn%)poiV0i&L+%s){BaYNi*#r#kWd#ZpEt zjD4gawKqD22?r4lXuLQPUv+Rwtgq!~w{i=4*WrlCLwi6^0bS{)c(_|au&;fQ=fCI@ zsL^Eo_LW6CGk(N-2z-JU5ESIQmMbb9 zd`3=Wp~f%(_cEH5+{7up)3=2SPJ(a9jnsXgY=%aHi7QWT=!9tc{V;7Yl`_YBmpluR zfFCD`XwMvO47CAN)I62ZwLcZk&z;^Xmurx6uLIp!%Pb%Gt~avUGOe zSh7I~GE-72bY@y>!CD3Lk>KtebSutAT93XFSce1xz!! z?*?=Tvj$R2)!e{#e4KyBQYVlmREuTGdYigW? z2nDTZ`uL=H`KyUOGBQ|q2q;v8+Ny;*g<#(*j4%G{Fq7qgba^;gZ>_Lg4S$eIghDb+ z^3){vYV;KsG6NxU2b|E%uxb6&TamxPR`tKfV#8EIppzI=_WaUy@O0sBzXe$xpZ05_ zy5EA&K%qV0xHZtZRoJFelo=l=RYnZ7M*45kI;{2iGXGs`Z2>mlIE5qnFHk%&JI7~d zQ#ehQU+jI+T1@BXgH-B%(R$WI{2raW2^I~}@(sbv+4fL<3zMuNDxn1u*!3lmKupdpFp!tpOElS^kb2+W<0HM3P2iyu?IPgBJygtAAgjW5DPFK)LoTs z)|CyC8ir2~{i@J7=rnEiSM8>)^`%JgXo^YR@TQOGHKKg{r1*KVNds@% z5S7nG&LMnb1!hypLbLFk41cV`2&4)Z!@lhwb{GZ{l|nEhgQlGlbXG|S;tcqM#r_6y zBPWy8n_}nc)dZ{XGK9ENmD#LktW8gW{hQ(ogd^RAk~k@X+piIMGrr_*?@e#$pd?Ve}&7bhH@l}=1Q-KGg#LLkwjIiG$>{tnH=#^;C-{NYh}uIT5lqE6Ht@zsq3SL>%`mCx84Y2 zTl(9QlKT(k6N3;UkU-(UVojf-)7;z84fdLu`}geFT-DvbK=*bROJpzc)}v@P7&bZK zjlsCx7?JIlHT)Q=f$}CQaIxKRC@i|nWq9QNGF@e9X{kp{R-u`x8k#aa-SneBoZt%I$KI(0urCXP6|B?d%30@z z_MCHw=L?+c$^EGLIaV z@k-5d+sY%B5I`W0&_&1PXYuGo{iC`{O|AW>kt-Jku$hJmFNZ;A%=uiiI!ia96*+&7 z{+Ar8qBiY@1L47=K__9<@vDHnIpKWgxN~mS(fnDA%3-T#r=KB3*JI|fwrtf&7wjI$ zG$5MpVmG|D4GdhU{`X{V%`$s1#%Nm0_BfJfz9Q7wT!mM(2Li^(8to1Rseqr@S#pJ( z;V<*zBL-t_V_;{A6#(mGo~9hL)Z(X~CN~5JQ)ATD*Vmg5eza9_&bdpl@)pmaFYX6A z{gf47ZEbB3b4_R*IPnptBw~z{y11^X}>Ijiw(WIZ3cmF(NA+YA$I ztA)NB@-v1u#mDY|y?5p;eP@|CiO2zG*wZeKN4KaPRhTK z!gx8HR`JA&Ml(#1g|of(cr^_S0*`AFU`m;%_KuTXhXPIWonAVC`)=(5y-UO~l;T5bwqK5*SFG*qJTZha#*H~5MOU}DOVK!je3%`dKxcpR)Fa`9IRr2 zM7Y#snQ0!p3AZF0m`(grX-4)XCr6gxtrfq4!8o(D5_bRny@-5a62A3>#mjJM&mujH z@0mI*$T2Bb{u#Li&%Sh~=kf7TB{NqOtvA;V;E?X_gy+oiE%Ow-HnE;QKRIU;2(_17 z-!?etc9VYi-d#IBxM?K_O)K)2z}~G-MH$^)Imx&gf%m~4XMJp~v$&sRpe@py%7T24 zU}rN$RK&mWGo`}G;+jsz{ru@TIzS!xhyw(7 zV_KPWV6!ihn;dK6yZX*Epf53fZ%&YKH>+CKdf!p`yXg>HRm}F9XBb6{aCVWGs^#_m z$JzP4@3L76t6}BnGZ&;_%F4vry3AvR&qLF#5;Fw!S*>8o&gA$vX++_@GkNH|9zV>3 zk?e;FUuJC<_`|BiHnnTiEyR1))P&@+$Ww@d_77Q$p?VeeW~IA&ip5jl>``%+nWVXTMsrq4(wDDL3@_QFeb9zomR!*c=EI)uVZ(SP&^86!%riqnX3M#T=8m+0 zrQOoa7@hyh3?2E#*{h)SJE%?7DjoqNJDAAXLw4*lnz(9H=2bTl<{opTIYWjU7fmvU zC7O&Vp_#Xv^kY&b;_I{FsWQcqQ2_-W>`cix@W69~SJpI`wbW+eM)c7XrM7Oxu$^s$ zVsBk9JEGujPJWf;jb!77y*3rw>NaFzLnrAS-dtC^^-hY6Pd+Toj_dKhCv7Oe`{)|i zOl13)3+@lYiX-hz#rGPe&;_)H3L9V284iPKe?M0?l^TZxyC%D|Km3YKH&u1xPz2%7 z^Quz!oj1_>Im343RvZ&)kOZ7;GYqXK9GZUJ#&h)H9WB==&j_`mHrfJWEbmX=0Wo%m z!MEdxcF55`P><+g~&gfn!*XLy5V(BKAyXNTBw8Go+kvxLI>kja}8-_AQ7!sa|VFf6wGd?Vz2QDoaP>#*7TA4fm`ykRI{7#*#5tzX$ruY9!s$?ZP= z(f_E61dRjRynMLjZ$^GUpI?dQAWo^NjrQpHi?4oEVZvq_e|i;9hoXwL&ST5tsp9FW zQ~)cF=mUG*zRE;P<-P4MZt?M^d~(>{FU5$JRu1p-`c%z_O{8xE&pEDGXN%5W6v~Gk z-w$hzo%I60SE&5W{m@A-F9!u4@5!aF2SaT&GOwyoI+a^3Q6h@`kG^+t(xQ?{O@859u3?4Z`duDc&R{$o`)UrUsH|L*aP;C z7PWROlm-|-n}~s+B;fipL!-N1OG35Y6#BIgqF$sZ6za4#F!-t)&T!CBO(Gmd@SFWQUyXTqw%I<$q^nWnr>BiQ&1ur^*CPx z{vSN_j~$}kIBz!&f20qw6dRIf2Q<_4z;Q=y9~gQAt>bnt@Y!;7V&Y?f zBstbO08E>Ek}uvg0d8z=PgnEX!6=m9$A*kcx^DmL>Xv-$lQcP9>i}5b&3d3@7|!k5 zO=qNhVenyf7nbqE(){bWI*p$LZA}IoO#I0UE|z=6d61$N=-jo9jbT8>JkCfy;X|Na z|EAvAF8`Y~*fvE&lEMitBX76}e5?<@n4?JpkM?WmvwTjrfgP1VX(0b~CrQ_h2CuIO zb*a&ExJd}=zWYd<2-h+a>9YA$Wn+KO37=Q`W}Ezv`PD{dE_-NJU;cj)@t9+OexGse z#vwp4#4vhDF%wfaOu-E993zS~)zSg0?}(a%YLPhbYq@53^jLDZ+Fr7Px2eZ_-WG_1 z;Pb?Sz#3)aDb|ApG4xL~2`-Mtd(tMU{zkGq zO%PKac`EnKa@ib@C2VhpqeJSiMXDwwKH~4qgTf4f447&4an|^W@Z{&ETBH6OatS|3 z*W(W7`Aq&Z0dQ6(v73_5+mZm!im&n8VQYOjX?GsupWldP`qKUKwEnUgiY?I%gURgId2M3?;)Jc{CmzuI2i)h4P>KlxZU8&tR}x+LD65W`v4KHfG(MBl z#UI5C|AD!DbCS8axii2}*y@kQw`y4~^-n^FVhkowy{nm*?OM+-|KYbMy50luj@@K- zc23UiHQ&>Lo=_Bu(B(GQQiJY_ii-cWktu~z?jL(!e1StP+G7Me?WBF&qIx-}I$wY$ zs2-PUtK%Sw$SS16v7@wB(Q6a7ZTPJSh2k-WX2Yde_AauI6Uh0@um#b8w!b8OC8*#> zc5%g$OS(R?6l=LI<8ggMq(uwj-j&Jw_8kr>Tu5s}ZUX}c7G9EDHxP#a8W8T~lJTuZ zC?k+!nPwT0#}O_WY?E5B329l@(4?gyO|dI^KWX!I(IK<~#LWZ!&Q=e~f(Z&wKZCa-&UfyNHT5y-J>T(%O-4*HO2qL4-uCe%>hz$m{arpqE8Gnr*9 zRnZaTm0Hl1MU#TsjX(|V&Qhy>|8T;aFioPt$P4BmNBA83N+(4zj5e#@({ZM?9i@2 z$#`<%5PT-JAcb|_GXMfj0|F?i0w1{nkGj@!f^sGB<>_{$>rr{|H>Ka1wAfiU!buo* zAI_KsJ}?eRkbD*jc-*Gi22fHO2NB4TsD`cTs;bTX(tH?ji~#H<1m0x?IwRv9zA%Ob zrHX9VbM7F*E|)pV1=s!XC&X{a<0-{sJlFj_ZS*U|eXnB`afyxGa5;Ybr3HQGD>_=J zLttaOm;Zsz`Lp)S2nVtCpu7UMR8}7a#~92ELA1Pgz|-zALF)}3e2mREghY(Xe)=rH zR;~R`cn@eAO7NQI)Mh325T=hcDlCLG>FRV~%3$<(zVyUIsbFh(=`v9aI4KcrNo=~a zT2!PU6udZ>WDz%Y)$8|H z#V6EYz?_g~dB^jYsNO2U)Sn>~W1C#smU663I0#JE0g*z}$-7uc+JL8)Dq%s~vl<_x zQ$=;jl&Qn%CxA>($Ix*(jr~&?e8LN&#+b5e?#`6r0UI80EWapjJAHzD8919}e~ZVo z;60?~_jG7HXymyXK0B+8gRAyMEIK?K$sTDZk*UtRmb#_HWOng4|jtXuv=O$+0%)sU9~_#=SmkuLFKz%X$D=BsLXnfY>>i%=MPESfJYEOY~45(`Y#=8Xd>CL|u%0eq22QPv=| zFe@%+B_9beZWg)!fTWNh{_d^;w2zo6VE1dTP$ @zVur+~tmW+j~oC?;{UF?efML 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 b1dtT9rR;)8?lkZfDo9CAO}0|nIOP8WG+I`_ literal 17955 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, (void*)this); + auto shift_task_ptr = std::make_shared(task_callback, (void*)this); //shift_task_ptr->set_facility("Mfg"); //shift_task_ptr->set_product("CombatRecord"); shift_task_ptr->set_task_chain(DebugTaskChain); @@ -274,6 +275,9 @@ bool asst::Assistance::start_infrast_shift(const std::vector& order // 这个流程任务,结束的时候是处于基建主界面的。既可以用于进入基建,也可以用于从设施里返回基建主界面 append_match_task(InfrastTaskCahin, { "InfrastBegin" }); + auto info_task_ptr = std::make_shared(task_callback, (void*)this); + m_tasks_deque.emplace_back(info_task_ptr); + // 因为后期要考虑多任务间的联动等,所以这些任务的声明暂时不妨到for循环中 auto dorm_task_ptr = std::make_shared(task_callback, (void*)this); dorm_task_ptr->set_task_chain(InfrastTaskCahin); diff --git a/src/MeoAssistance/AsstDef.h b/src/MeoAssistance/AsstDef.h index ae2654642f..8da22eb7d4 100644 --- a/src/MeoAssistance/AsstDef.h +++ b/src/MeoAssistance/AsstDef.h @@ -293,7 +293,7 @@ namespace asst efficient[key] += value; } for (const auto& [key, reg] : s.efficient_regex) { - efficient_regex[key] += " + " + reg; + efficient_regex[key] += "+(" + reg + ")"; } } } diff --git a/src/MeoAssistance/InfrastAbstractTask.cpp b/src/MeoAssistance/InfrastAbstractTask.cpp index ad238e44b7..625431cf70 100644 --- a/src/MeoAssistance/InfrastAbstractTask.cpp +++ b/src/MeoAssistance/InfrastAbstractTask.cpp @@ -11,7 +11,7 @@ bool asst::InfrastAbstractTask::enter_facility(const std::string& facility, int const auto& image = ctrler.get_image(); InfrastFacilityImageAnalyzer analyzer(image); - analyzer.set_facilities({ facility }); + analyzer.set_to_be_analyzed({ facility }); if (!analyzer.analyze()) { return false; } diff --git a/src/MeoAssistance/InfrastConfiger.h b/src/MeoAssistance/InfrastConfiger.h index 1ca7cf22be..e226437453 100644 --- a/src/MeoAssistance/InfrastConfiger.h +++ b/src/MeoAssistance/InfrastConfiger.h @@ -26,6 +26,9 @@ namespace asst { const InfrastFacilityInfo& get_facility_info(const std::string& facility) const { return m_facilities_info.at(facility); } + const std::unordered_map& get_facility_info() const noexcept { + return m_facilities_info; + } protected: virtual bool parse(const json::value& json) override; diff --git a/src/MeoAssistance/InfrastFacilityImageAnalyzer.cpp b/src/MeoAssistance/InfrastFacilityImageAnalyzer.cpp index eb9502ed6d..9b39812793 100644 --- a/src/MeoAssistance/InfrastFacilityImageAnalyzer.cpp +++ b/src/MeoAssistance/InfrastFacilityImageAnalyzer.cpp @@ -32,12 +32,13 @@ bool asst::InfrastFacilityImageAnalyzer::analyze() int cor_suffix_index = -1; - for (const std::string& key : m_facilities) { - const auto find_iter = facility_task_name.find(key); - if (find_iter == facility_task_name.cend()) { - return false; // TODO 报错 + for (const auto& [key, task_name] : facility_task_name) { + if (!m_to_be_analyzed.empty()) { // 若为空,则分析所有设施 + if (std::find(m_to_be_analyzed.cbegin(), m_to_be_analyzed.cend(), key) + == m_to_be_analyzed.cend()) { + continue; + } } - const std::string& task_name = find_iter->second; std::vector cur_facility_result; // 已知基建缩放状态的时候,只识别这个缩放状态下的就行了 // 否则识别所有状态,直到找出正确的当前缩放状态 @@ -72,6 +73,10 @@ bool asst::InfrastFacilityImageAnalyzer::analyze() } } } + if (cur_facility_result.empty()) { + continue; + } + #ifdef LOG_TRACE cv::RNG rng(time(0)); cv::Scalar rand_color(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); @@ -85,5 +90,5 @@ bool asst::InfrastFacilityImageAnalyzer::analyze() m_result.emplace(key, std::move(cur_facility_result)); } - return true; + return !m_result.empty(); } \ No newline at end of file diff --git a/src/MeoAssistance/InfrastFacilityImageAnalyzer.h b/src/MeoAssistance/InfrastFacilityImageAnalyzer.h index 34de4f748a..7e14d4efc1 100644 --- a/src/MeoAssistance/InfrastFacilityImageAnalyzer.h +++ b/src/MeoAssistance/InfrastFacilityImageAnalyzer.h @@ -11,8 +11,9 @@ namespace asst { virtual bool analyze() override; - void set_facilities(std::vector facilities) noexcept { - m_facilities = std::move(facilities); + // 若为空,则分析所有设施 + void set_to_be_analyzed(std::vector facilities) noexcept { + m_to_be_analyzed = std::move(facilities); } int get_quantity(const std::string& name) const { @@ -38,6 +39,9 @@ namespace asst { } } } + const std::unordered_map>& get_result() const noexcept { + return m_result; + } private: // 该分析器不支持外部设置ROI virtual void set_roi(const Rect& roi) noexcept override { @@ -49,7 +53,7 @@ namespace asst { // key:设施名,value:所有这种设施的当前Rect(例如所有制造站的位置) std::unordered_map> m_result; - // 需要识别的设施名 - std::vector m_facilities; + // 需要识别的设施名,若为空,则分析所有设施 + std::vector m_to_be_analyzed; }; } diff --git a/src/MeoAssistance/InfrastInfoTask.cpp b/src/MeoAssistance/InfrastInfoTask.cpp new file mode 100644 index 0000000000..f886eb6c8d --- /dev/null +++ b/src/MeoAssistance/InfrastInfoTask.cpp @@ -0,0 +1,35 @@ +#include "InfrastInfoTask.h" + +#include "Controller.h" +#include "RuntimeStatus.h" +#include "Resource.h" +#include "InfrastFacilityImageAnalyzer.h" +#include "Logger.hpp" + +bool asst::InfrastInfoTask::run() +{ + json::value task_start_json = json::object{ + { "task_type", "InfrastInfoTask" }, + { "task_chain", m_task_chain} + }; + m_callback(AsstMsg::TaskStart, task_start_json, m_callback_arg); + + const auto& image = ctrler.get_image(); + + InfrastFacilityImageAnalyzer analyzer(image); + std::vector all_facilities; + for (auto&& [key, _value] : resource.infrast().get_facility_info()) { + all_facilities.emplace_back(key); + } + if (!analyzer.analyze()) { + return false; + } + for (auto&& [name, res] : analyzer.get_result()) { + std::string key = "NumOf" + name; + int size = static_cast(res.size()); + status.set(key, size); + log.trace("InfrastInfoTask | ", key, size); + } + + return true; +} \ No newline at end of file diff --git a/src/MeoAssistance/InfrastInfoTask.h b/src/MeoAssistance/InfrastInfoTask.h new file mode 100644 index 0000000000..a3ba4ea1da --- /dev/null +++ b/src/MeoAssistance/InfrastInfoTask.h @@ -0,0 +1,13 @@ +#pragma once +#include "InfrastAbstractTask.h" + +namespace asst { + class InfrastInfoTask : public InfrastAbstractTask + { + public: + using InfrastAbstractTask::InfrastAbstractTask; + virtual ~InfrastInfoTask() = default; + + virtual bool run() override; + }; +} \ No newline at end of file diff --git a/src/MeoAssistance/InfrastProductionTask.cpp b/src/MeoAssistance/InfrastProductionTask.cpp index 74f9b4d1c0..3b5456abef 100644 --- a/src/MeoAssistance/InfrastProductionTask.cpp +++ b/src/MeoAssistance/InfrastProductionTask.cpp @@ -2,6 +2,8 @@ #include +#include + #include "Resource.h" #include "Controller.h" #include "InfrastSkillsImageAnalyzer.h" @@ -9,6 +11,7 @@ #include "MatchImageAnalyzer.h" #include "AsstUtils.hpp" #include "Logger.hpp" +#include "RuntimeStatus.h" //bool asst::InfrastProductionTask::run() //{ @@ -125,16 +128,39 @@ size_t asst::InfrastProductionTask::opers_detect() const auto& cur_all_info = skills_analyzer.get_result(); max_num_of_opers_per_page = (std::max)(max_num_of_opers_per_page, cur_all_info.size()); - // 如果两个的hash距离过小,则认为是同一个干员,不进行插入 - for (const auto& cur : cur_all_info) { + for (const auto& cur_info : cur_all_info) { auto find_iter = std::find_if(m_all_available_opers.cbegin(), m_all_available_opers.cend(), - [&cur](const InfrastOperSkillInfo& info) -> bool { - int dist = utils::hamming(cur.hash, info.hash); + [&cur_info](const InfrastOperSkillInfo& info) -> bool { + int dist = utils::hamming(cur_info.hash, info.hash); return dist < HashDistThres; }); - if (find_iter == m_all_available_opers.cend()) { - m_all_available_opers.emplace_back(cur); + // 如果两个的hash距离过小,则认为是同一个干员,不进行插入 + if (find_iter != m_all_available_opers.cend()) { + continue; } + auto pred_info = cur_info; + // 根据正则,计算当前干员的实际效率 + for (auto&& [product, formula] : pred_info.skills_comb.efficient_regex) { + std::string cur_formula = formula; + for (size_t pos = 0; pos != std::string::npos;) { + pos = cur_formula.find('[', pos); + if (pos == std::string::npos) { + break; + } + size_t rp_pos = cur_formula.find(']', pos); + if (rp_pos == std::string::npos) { + break; + // TODO 报错! + } + std::string status_key = cur_formula.substr(pos + 1, rp_pos - pos - 1); + int status_value = std::any_cast(status.get(status_key)); + cur_formula.replace(pos, rp_pos - pos + 1, std::to_string(status_value)); + } + + int eff = calculator::eval(cur_formula); + pred_info.skills_comb.efficient[product] = eff; + } + m_all_available_opers.emplace_back(std::move(pred_info)); } return cur_all_info.size(); } @@ -148,8 +174,6 @@ bool asst::InfrastProductionTask::optimal_calc() return false; } - // TODO: 处理效率的正则,将正则的结果计算到数字的efficient中 - // 先把单个的技能按效率排个序,取效率最高的几个 std::vector optimal_opers; optimal_opers.reserve(max_num_of_opers); @@ -190,9 +214,16 @@ bool asst::InfrastProductionTask::optimal_calc() std::vector cur_opers; cur_opers.reserve(max_num_of_opers); double cur_efficient = 0; - // TODO:条件判断,不符合的直接过滤掉 - for (const auto& [cond, value] : group.conditions) { - // if xxx continue; + // 条件判断,不符合的直接过滤掉 + for (const auto& [cond, cond_value] : group.conditions) { + if (!status.exist(cond)) { + continue; + } + // TODO:这里做成除了不等于,还可计算大于、小于等不同条件的 + int cur_value = std::any_cast(status.get(cond)); + if (cur_value != cond_value) { + continue; + } } // necessary里的技能,一个都不能少 for (const InfrastSkillsComb& nec_skills : group.necessary) { diff --git a/src/MeoAssistance/MeoAssistance.vcxproj b/src/MeoAssistance/MeoAssistance.vcxproj index 2df333a06a..e191b516f3 100644 --- a/src/MeoAssistance/MeoAssistance.vcxproj +++ b/src/MeoAssistance/MeoAssistance.vcxproj @@ -28,6 +28,7 @@ + @@ -49,6 +50,7 @@ + @@ -68,6 +70,7 @@ + @@ -91,6 +94,7 @@ + diff --git a/src/MeoAssistance/MeoAssistance.vcxproj.filters b/src/MeoAssistance/MeoAssistance.vcxproj.filters index bf22bbcf05..3174df0b99 100644 --- a/src/MeoAssistance/MeoAssistance.vcxproj.filters +++ b/src/MeoAssistance/MeoAssistance.vcxproj.filters @@ -192,6 +192,12 @@ 头文件\Task + + 头文件 + + + 头文件\Task + @@ -311,6 +317,12 @@ 源文件\Task + + 源文件 + + + 源文件\Task + diff --git a/src/MeoAssistance/RuntimeStatus.cpp b/src/MeoAssistance/RuntimeStatus.cpp new file mode 100644 index 0000000000..1ebc704409 --- /dev/null +++ b/src/MeoAssistance/RuntimeStatus.cpp @@ -0,0 +1 @@ +#include "RuntimeStatus.h" \ No newline at end of file diff --git a/src/MeoAssistance/RuntimeStatus.h b/src/MeoAssistance/RuntimeStatus.h new file mode 100644 index 0000000000..1555fb58c0 --- /dev/null +++ b/src/MeoAssistance/RuntimeStatus.h @@ -0,0 +1,49 @@ +#pragma once + +#include +#include + +namespace asst { + class RuntimeStatus + { + public: + RuntimeStatus(const RuntimeStatus& rhs) = delete; + RuntimeStatus(RuntimeStatus&& rhs) noexcept = delete; + ~RuntimeStatus() = default; + + static RuntimeStatus& get_instance() { + static RuntimeStatus unique_instance; + return unique_instance; + } + + std::any get(const std::string& key) const noexcept { + if (auto iter = m_data.find(key); + iter != m_data.cend()) { + return iter->second; + } + else { + return std::any(); + } + } + bool exist(const std::string& key) const noexcept { + return m_data.find(key) != m_data.cend(); + } + + template + inline void set(Args &&... args) { + static_assert( + std::is_constructible::value_type, Args...>::value, + "Parameter can't be used to construct a std::unordered_map::value_type"); + m_data.emplace(std::forward(args)...); + } + + RuntimeStatus& operator=(const RuntimeStatus& rhs) = delete; + RuntimeStatus& operator=(RuntimeStatus&& rhs) noexcept = delete; + private: + RuntimeStatus() = default; + + std::unordered_map m_data; + }; + + static auto& status = RuntimeStatus::get_instance(); +}