<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/55903>55903</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-format] Formatting with Java Advance Switch Statement
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
StrangeRanger
</td>
</tr>
</table>
<pre>
I found that when attempting to format a Java file that contains an advanced switch statement, `clang-format` will only format the code to the switch statement, but nothing below it.
Below is an example code that hasn't been formatted yet, and has an advanced switch statement. I've also included my configuration file. As a note, I'm using clang-format `14.0.4`.
```java
package cs350s22.component.ui.parser;
import cs350s22.component.logger.LoggerMessage;
import cs350s22.component.logger.LoggerMessageSequencing;
import cs350s22.support.Clock;
import cs350s22.support.Filespec;
import java.io.IOException;
/** META command class. */
public class MetaParser implements SubParser {
String[] cmdTextSplit;
int numOfCmdArgs;
A_ParserHelper parserHelper;
@Override
public void parse(String[] cmdTextSplit, A_ParserHelper parserHelper) throws IOException {
this.cmdTextSplit = cmdTextSplit;
this.numOfCmdArgs = cmdTextSplit.length - 1;
this.parserHelper = parserHelper;
switch (cmdTextSplit[0].toUpperCase()) {
case "@CLOCK" -> setClockHelper();
case "@EXIT" -> exit();
case "@RUN" -> run();
case "@CONFIGURE" -> configure();
default -> System.out.println("Invalid META command: " + cmdTextSplit[0]);
}
}
////[ Clock Methods ]///////////////////////////////////////////////////////////////
/** Parses @CLOCK sub commands, and execute their respective methods. */
private void setClockHelper() {
if (numOfCmdArgs == 0) {
displayClock();
return;
}
String argOne = cmdTextSplit[1].toUpperCase();
/// @CLOCK (PAUSE | RESUME)
if (argOne.contains("PAUSE") || argOne.contains("RESUME")) {
setClockState(argOne);
}
/// @CLOCK ONESTEP [count]
else if (argOne.contains("ONESTEP")) {
if (numOfCmdArgs >= 2) {
setClockOnestep(Integer.parseInt(cmdTextSplit[2]));
} else {
setClockOnestep();
}
}
/// META commands that require 2 or more arguments.
else if (numOfCmdArgs >= 2) {
String argTwo = cmdTextSplit[2].toUpperCase();
/// @CLOCK SET RATE value
if (argOne.contains("SET") && argTwo.contains("RATE")) {
if (numOfCmdArgs >= 3) {
setClockRate(Integer.parseInt(cmdTextSplit[3]));
} else {
System.out.println("Missing argument for @CLOCK SET RATE");
}
}
/// @CLOCK WAIT FOR value
else if (argOne.contains("WAIT") && argTwo.contains("FOR")) {
if (numOfCmdArgs >= 3) {
setClockWaitFor(Double.parseDouble(cmdTextSplit[3]));
} else {
System.out.println("Missing argument for @CLOCK WAIT FOR");
}
}
/// @CLOCK WAIT UNTIL value
else if (argOne.contains("WAIT") && argTwo.contains("UNTIL")) {
if (numOfCmdArgs >= 3) {
setClockWaitUntil(Double.parseDouble(cmdTextSplit[3]));
} else {
System.out.println("Missing argument for @CLOCK WAIT UNTIL");
}
} else {
System.out.println("Invalid arguments for @CLOCK: " + argOne + " " + argTwo);
}
}
/// Anything else.
else {
System.out.println("Invalid argument for @CLOCK: " + argOne);
}
}
/** Display clock time. */
private void displayClock() {
System.out.println(Clock.getInstance().getTime());
}
/**
* Set the state of the clock to either 'RESUME' or 'PAUSE'.
*
* @param arg The state the clock should be set to.
*/
private void setClockState(String arg) {
Clock.getInstance().isActive(arg.contains("RESUME"));
}
/**
*
*/
private void setClockOnestep() {
if (Clock.getInstance().isActive()) {
System.out.println("Clock must be paused to use this command");
} else {
Clock.getInstance().onestep();
}
}
/**
*
* @param onestep
*/
private void setClockOnestep(int onestep) {
if (Clock.getInstance().isActive()) {
System.out.println("Clock must be paused to use this command");
} else {
Clock.getInstance().onestep(onestep);
}
}
/**
*
* @param rate
*/
private void setClockRate(int rate) {
Clock.getInstance().setRate(rate);
}
/**
*
* @param value
*/
private void setClockWaitFor(double value) {
Clock.getInstance().waitFor(value);
}
/**
*
* @param value
*/
private void setClockWaitUntil(double value) {
Clock.getInstance().waitUntil(value);
}
////[ Non-Clock Methods ]///////////////////////////////////////////////////////////
/**
*
*/
private void exit() {
//parserHelper.exit(); // TODO: Uncomment when ready...
System.exit(0);
}
/**
*
*/
private void run() {
try {
parserHelper.run(cmdTextSplit[1]);
} catch (ParseException | IOException e) {
throw new RuntimeException(e);
}
}
/**
* TODO: Possibly refactor/modify.
*/
private void configure() throws IOException {
String log = null, dotSequence = null, network = null, xml = null;
/// For statement only goes up to the second to last index in array on purpose.
for (int i = 1; i < numOfCmdArgs; i++) {
String cmdArg = cmdTextSplit[i].toUpperCase();
String cmdArgPrevious = cmdTextSplit[i-1].toUpperCase();
if (cmdArg.contains("LOG")) {
log = cmdTextSplit[i+1];
} else if (cmdArgPrevious.contains("DOT") && cmdArg.contains("SEQUENCE")) {
dotSequence = cmdTextSplit[i+1];
} else if (cmdArg.contains("NETWORK")) {
network = cmdTextSplit[i+1];
} else if (cmdArg.contains("XML")) {
xml = cmdTextSplit[i+1];;
}
}
if (log != null && dotSequence != null && network != null) {
LoggerMessage.initialize(Filespec.make(log));
LoggerMessageSequencing.initialize(Filespec.make(dotSequence),
Filespec.make(network));
} else {
throw new IOException("One or more required arguments is either missing or incorrect for @CONFIGURE");
}
}
}
```
```clang
---
Language: Java
# BasedOnStyle: Chromium
AccessModifierOffset: -1
AlignAfterOpenBracket: Align
AlignArrayOfStructures: None
AlignConsecutiveMacros: Consecutive
AlignConsecutiveAssignments: Consecutive
AlignConsecutiveBitFields: Consecutive
AlignConsecutiveDeclarations: Consecutive
AlignEscapedNewlines: Left
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: false # Maybe: Do some testing
AllowAllParametersOfDeclarationOnNextLine: false # Maybe: Do some testing
AllowShortEnumsOnASingleLine: true # Maybe
AllowShortBlocksOnASingleLine: Empty
AllowShortCaseLabelsOnASingleLine: false # Maybe
AllowShortFunctionsOnASingleLine: All
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Never # Maybe
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
AttributeMacros:
- __capability
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: Never
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: NonAssignment # OR None
BreakBeforeConceptDeclarations: true
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon # OR AfterComma
BreakBeforeTernaryOperators: true # Maybe
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon # OR AfterColon
BreakAfterJavaFieldAnnotations: true
BreakStringLiterals: true
ColumnLimit: 88
CommentPragmas: '^ IWYU pragma:'
QualifierAlignment: Leave # Maybe (WARNING: Warning provided on website)
CompactNamespaces: false # Maybe
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 8
Cpp11BracedListStyle: true
DeriveLineEnding: true
DerivePointerAlignment: false
DisableFormat: false
EmptyLineAfterAccessModifier: Leave
EmptyLineBeforeAccessModifier: LogicalBlock
ExperimentalAutoDetectBinPacking: false
PackConstructorInitializers: NextLine # OR BinPack
FixNamespaceComments: false
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IfMacros:
- KJ_IF_MAYBE
IncludeBlocks: Merge
IncludeCategories:
- Regex: '^<ext/.*\.h>'
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: '^<.*\.h>'
Priority: 1
SortPriority: 0
CaseSensitive: false
- Regex: '^<.*'
Priority: 2
SortPriority: 0
CaseSensitive: false
- Regex: '.*'
Priority: 3
SortPriority: 0
CaseSensitive: false
IncludeIsMainRegex: '([-_](test|unittest))?$'
IncludeIsMainSourceRegex: ''
IndentAccessModifiers: false
IndentCaseLabels: true
IndentCaseBlocks: false
IndentGotoLabels: true
IndentPPDirectives: AfterHash
IndentExternBlock: Indent
IndentRequires: false # Maybe
IndentWidth: 4
IndentWrappedFunctionNames: true
InsertTrailingCommas: None
JavaScriptQuotes: Double
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: false
LambdaBodyIndentation: OuterScope
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: All
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 4
ObjCBreakBeforeNestedBlockParam: true # TODO
ObjCSpaceAfterProperty: false # TODO
ObjCSpaceBeforeProtocolList: true # TODO
PenaltyBreakAssignment: 2 # TODO
PenaltyBreakBeforeFirstCallParameter: 1 # TODO
PenaltyBreakComment: 300 # TODO
PenaltyBreakFirstLessLess: 120 # TODO
PenaltyBreakOpenParenthesis: 120 # TODO
PenaltyBreakString: 1000 # TODO
PenaltyBreakTemplateDeclaration: 10 # TODO
PenaltyExcessCharacter: 1000000 # TODO
PenaltyReturnTypeOnItsOwnLine: 200 # TODO
PenaltyIndentedWhitespace: 0 # TODO
PointerAlignment: Right
PPIndentWidth: -1
ReferenceAlignment: Pointer
ReflowComments: true
RemoveBracesLLVM: false # Maybe (WARNING: Warning provided on website)
SeparateDefinitionBlocks: Leave # Maybe
ShortNamespaceLines: 1
SortIncludes: CaseSensitive
SortJavaStaticImport: Before
SortUsingDeclarations: true
SpaceAfterCStyleCast: true
SpaceAfterLogicalNot: true
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: Custom
SpaceBeforeParensOptions:
AfterControlStatements: true
AfterForeachMacros: true
AfterFunctionDefinitionName: false
AfterFunctionDeclarationName: false
AfterIfMacros: true
AfterOverloadedOperator: false
BeforeNonEmptyParentheses: false
SpaceAroundPointerQualifiers: Default
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyBlock: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: Never
SpacesInConditionalStatement: false
SpacesInContainerLiterals: false
SpacesInCStyleCastParentheses: false
SpacesInLineCommentPrefix:
Minimum: 1
Maximum: -1
SpacesInParentheses: false
SpacesInSquareBrackets: false
SpaceBeforeSquareBrackets: false
BitFieldColonSpacing: Both # Maybe
Standard: Auto
StatementAttributeLikeMacros:
- Q_EMIT
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 4
UseCRLF: false
UseTab: Never
WhitespaceSensitiveMacros:
- STRINGIZE
- PP_STRINGIZE
- BOOST_PP_STRINGIZE
- NS_SWIFT_NAME
- CF_SWIFT_NAME
...
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzlHNt24jjya-gXnXCIEzrphzwAgRmmCdBANrv7kiNsAZo2lteWk7Bfv1WSZcvXkJme2RsnnYBUVaq7SiXTW-Gd7qZkJ5LAI_JAJXk9sIBQKdkxlDzYEylgNjrCDCW_0BdKdtxnGtQVgaQ8iAkFDO-FBi7zSPzKpXsgsaRAggWy44xI53PP9Wmwv9CU4CN55b5PROCfDHV5YEDQY7ggvq-js00kCYQ8IF9b5otXwmW307vv9Ab691APKo7YGz2GviGK_B5oHHScGwm4IKNeVwLLJ6aoU1ABgLRK0yVToPDCCPVjQXjg-okHYMcTKmPH90lEJReBUlKXDIAYMsyQPCIeSRIj87Y2UDuX191e9xreFKSBz_rnV9C7Hgqp-53uQaj4qt-LHafrimMoAuQs4d2QRjGLOldDmwoHgEjWYfhiv2dRd6b-PLA4BsoZ8sfQ1uwfCQtckK2RQJyEONAd-cL9_i7UBBQYh8wtA6Iqulx0p4vxm8tCVHZJ3o4z6Tjwe0AexpsB2OV4RMuCyuO4S9TUJFVmsvW5q2fIA5N0qfRHOPoNWjsm62SbDnZu0lUIvNYyQlH7w07_nrhHb8Pe5Dr0ucx4QSgeSGK9guS42I2O3iDaxwW4wbNe42fmh7BSaH0oyYbQneve4oVFEfdYPpiK8iK4p_E7zm0zk-CNbWs6XyBeIvEaE0vLRQXgC-Iw7tp0SeeqRRsZiq2HCkrXZ8FeHsgFuazHtjlV2O-oC19pFINOCtz1hz1QTVeKxxBwR1RpDaRHBVSkxZcLIEDFAROMZovRV3hLLjpXYxIzqdzaKFBRKbNfojD-63STEWBvaJZz0FaP8wwrSoLzkEaL-WT60-NqnKGadMVaCHhsRxNfaoT1KYYU2BWJ7IbgV9LXSzvT4IX64HV2sHWuBrgw_BuSGo3Xrde5ubdc3HywhjCqzU9_SJS6MWgPwgMvQqKT_-KfOmlVDlNRGhPjcSROtkbLsdm02BtzE4mbHOMRiVTelBw2qaNWTzHrqXQR8RfY0XS-qHPeqv_zHcZPOXYxAHuN8eLxOPTpSWf8Zj-LmEyioNklisM6rREa7RcBq6ac_vCyPqjrU0NmglzFAL8cPK7HwMCIrMbrx4cx4tdoQ_PQNXWQDgiFi2GntDJCIrVwhrKTZpx6FRrjrLECyZZ8N4IaRFvMx-vNeAnxMnSh5JMYNwUc5kPOaBEuJZBzXct0ra-M0VROI44tLKwLySYEGtNAMiw2VJKfYhVYTuFOmlAafAu0ooX6wKIttM5WuZ0OY11-RlAj8YgRh4iIHAW8AxUnqs7oNlrhY0rMY2PzKupiw_lIbDQ40Xq8IavBZkwg8Sesyfq17gOoJjKcz_CTclqODCD-joe1e9lVK55t9JWOqvfd7Krdzc5zNWWihn30gcdxajvlE3g-qeo8VUsLC2e4bYNdnwbTDZksVk12fS83IP4Z1oUV_iTjPlEuJwJ3tHsB9THT5tXv_-MsbLT_h1v4cb6Zzv5gG6s1_kQrPwaS-_9Fdrb181FLv8PZe3V6tucU2LIrdlNZwVs9lA2DoX_E3jgITrqHg5LUbX31e9uZgr0j128-fKhy_F5XtMRVxw_Jj-yd4rpaAlelq5VMYXT3TE6DWGIzSmPjyAaWzU6qBWHaeLfWREnWTPfcVGuLiJ1uwGmxBGEcPoIanRtTpt5g1QJ_0vL2plukV6IO-ocgpEdUOtlky-RrxAeR-B7ZMoxjWLFM7t3TiimI85KnVrdNauTxQJ2RdKJrL81_o4o_KlGhAG06gJ0hT1vSbQoifZw-JjE2R0lIk5h56AfwV7VdspN9fc5qT0tNPIvWivvsoDzPEc1iv9ko2M3LOP4_s08u9x9tpgij-oM2Sot4NJBC_0geABopeor6Q4I9l6dcZ50lUF64eqqISal8RK7XjITB_U8RzNRqv0s0Q-RDwlntw7kILv4HWog_diPKm9BVY-gF7V57t9CzTgHIZnG_wKLrMcCMhOWYulCMGPVO3W6p2EuzXUqo98dvtVnDvOY2IzrVZ8eCzJpATcOxKeu6NL15UI1c-zZlVLhdqQ8BxRhexZCAvZJVEmDFmV98Obe_r5wtxbax3VLAAWbrn8BqO-pKzCKTo_D47nR2lVa6XjjrPimt5HyxV52rIPF97HB7Qqa3i6wwHjD5KqLvhbG3o59_fq_hC-kxv9jVd9F7wWKShNkdNAM51D7rU9h5eeCxN_gNxWYEZwCQIUyiUFTOMOoAovcjrtjBqyz1dlS-BCQcTibqp72j5yqMuo4eb-_oNdJaRuyFi6R6A4c0Lz7UQ8eXrn406VI1PVv8dEYrwJi9Ip6j46u1uWuvbgQrcXG_KDUuanldj789juejc9qPZb_83YyXWJmPN0-L1dczOLEj4Udz8deHc_o4Ju5aVv9Y06CutFYe4lya-DZ2LNihOp0pJ59qFKXwSEOXB1xy6vN_oveb5xG6R_qdaWZamkgNz0a0k7QEUaRHza2nlleZaip_A7PtB4N867Eft9AXQQHLrjHSiw27twQnkrSFcEy7YQDMoSaIIubmLRrrWvoDG1n2xjwfY_tMNqiesdFjFxcX-s0MhhL1lEu2xi_ZszUd54oMIdd5i2AtT74GGoEKjjw5apCB64JNH3Av5Cxa7HZQ2CIY5Es97_N9MNhJmAtZMIyo-10DqAkbBneQxQ4ycuJK2CZjBIKilFkwIxHEeLELp8YH6kZCwViD9aADUPc-UFY4C34I5wTOfO886HsGatXPOLUgjGOXhsybs1efB1q2GdtJCwLUE6krbGWIsnY2EeWAuR_pElJBgaayJXzxCr8GxtsWwRySzgyWQsAdRX8maM0HetqqsXtBYnGEozIcY7nxCkNniecZBjaLFztLvjqqZxJdH0Qkx7DVA2uDNcz5zNBBMWzmSkhDPJNUscbHUJ7KsLgvz-gWwrcCX-a2hDlJAleZsIIIMGXgGT1uPXoW6HS3NvVUFX7OXlRHsYGnmRBhgyAG9JWe4iGcJL6rCFuppwY2p5CVYyeDGzJINOwh8SW6E9P1T9xMd8OOoQ8ClL1cUVAsaQwJhLaJzMPSZKkL8vwMrk-3sJ4x2JAHS8gDmbcWnTmdzX2wNA0phD1FNAzVo3XZQkoDmQOoKLJEMvP4YFuW6mrmYaePhJ_ZLLNSAQr9OM-XVSrGmTRMdX4OgsUhiNHA5WL768hSeMk6KZBOlIaN6vxjkHFQOz9-g1_BUD96WFpAe8kID2q1C-j5MY7ULqDndZgMhXdqWODpwH1Wu8AUzhWBVKY25irMq3JKpQBb17mT2BArOLJEXvN8wRq2n2XhAh5Jo5NK0HD0MxtTvq3o7LVYWSFnYYNPYZ1QjqD6lTKJIaIoaL8MMA2gguCq94NbAS1pVkFaMDMeKxcxnPhwQjPMpg6PRMqrbMAzyhLXpmmFgzueckYRTbNqLorNmg1cNmC9wy0MWTTUIJYrar8eBIGQjQrWqW7GAQM4KQIA3eQYzPiRZwF1e2um1Ia7jOj-SLUvdpybTn9Mpk9_e4QjPo5jGoJBhfAtAUmwFlL7tkkiM0ZfbPVh9f40WM2n859w-olGAZaEYSReOD4-DZK_sm3MdQPWcAJeKjN3zbN2xSz1utVB9cQ9qaL6OoOFvTpReitBGBWE4eWl8kwP_SmrBHP93YO_vagdahx4Oi1XZpcCTv8lrVg-cc9juvXZRD8OX06cKlCRvrJ4sebM1FsC1V5UAyv23KW-znwa5Q0cnSNT1B8kUtzDtuPKdB9KxbGYwdEW7zU1Uua6KSGNPOFvmQXtYs6iDzoYQ-zXbKUoUJYVcODb82SxGg9GP-dDw8VivSkOT3c1tL7-8jydPD8M_jYcp1D60X1db2kLPLBozwqzsCewvYg4KxJbsT17s44QxERJ52oE6ug4ky42x_qj7gGfZjCxgnDLiAM9ebKwnXx2DXVQCaKXz-J2v2YBhAlW29Xdtp2xj7B0-Sey9O_WzjlMXP0YJlKvmsYPlAcZN7g4HKn7w4tn1Ue-xfNE52aUQKSpt-nJfdJxrjNGC6TWIolcViSYwWGOK6aFcgRqmPw0Ucxn-WweKxXkn4QUzcjL5T2P9CPJerfHtPYzjQ82UKlC04M2wEp3GeK8jKzsBKWMjq_rwgwW0swzVZRKTWWGYxZJ-_xJS0dz3IDXbsRD-S0RUuOnjxqV5nG1qfrWSmmRr4yFWeKOB3JzgKMJjeRiV6vivLLUUmRl8iLBytgVYQqo8p4iMWR7HpR9IZ8e60f0SWn6LWdqI5BJBEpzQZbGSzxkp0As481hJgJ3cIVv6jHcZSwg5KB-d1bTeWE2x0tnT8Gr81GxMFO3FRnaGnlTjgWrwwYn8zK8EVyvUua2boUlC6gvT7oMyyphhHbaQPUCEx7FEEBWo0HptQ0x3SsR7qrXa4NUxGcQ3fhP0XVa4bEvBXwA8QOL-TkY6deIELDXzkvN8VmjNSBhSzGORweAdY1WeurVgJAf-RfBVMaL18D0CZxGHO1pzIPjl8xPPlXomoJtxfeHNAUtl5XcYnp-K7ZjETZtC7gpvQzEF692AWRlgxU7ipf0LDSb_eWhrtD9DQX0muE9PRpjp7rOIsiTS7k-TzGwDZPF-cx07lIxceNLdx1zSC3udhmUyoCYIVyd_fJDTg7ziD3h5kNiHs0jVYDDSrIJIq1w56IRwvjlV3Z6rRyOrUyQR3blLFiBRdn1Aa2YrG2Q4kmiBbBYV2dkaxcunInbAFWU6yZtEktxbABYhEb_rb2hkiZM70eX6Hl7ugqR7rW5G6KH1Td5ctjML5qBrTKfkOq6-BVJX1AIDmPLhrYM7Oxq28uSIivvv9qRIvyKdBrV2alX7_76a3IV_a5osGfqQgHUhO3NJntNNQdZ7VM__Q6DaQeirnXu2GDTYIANVq03q9tnZsHwnrITLTYGK-spULwphBC0-gx1cFkMvyfDVCX0rAsBPvNmOeYDeNDRbkZaJxWoXspzJkEb0u8vvv5HQnVb6jurHFQty7bCmQsVZW1ESnfPoZCHas6FQPZo5Fl859VSpv-s4Tzj3-uazt-exw_TTQmpFu5x_rge31sjm-fV-NvjdDV-_st4tZ4u5npuQ7eFMjqvpB8h761mE1vRlvAwC6iFQ5blY_kenG0bNVyuNyvY56Z_H-dDy-Vzzag-_NfPzdfP66fpZPM8HzxYw6NJZTh7Kin9be4PP3l3V96Xqy_0k-TSZ3f4nTn7PzHo3xPdv1H_TcIrB-uq_x9hoP_vALLWXzrO7PEpify7g5ShklY9grIHpGSLX62HD77_Yv5cwMb-KxyY4COP4wT81Zn0-196V58Od66zvb3cfmGX1Ln9fLnb9nsOvby-cp0-JLv-pfPJV-cwZLfjOHh3q0jgDWv__hO_c3qO0_vc-3x527_tXXXp5eerS2_n9N3d9fUNxS8LsyOkkC7y0RXR_lN0p1jaJvsYJn3YyeJ8kqotkyntIH2aSKgi7qBmxOSnMmD0STFwpwT4F7BXXpQ">