  let name = get(
        Kind::ThreeColourStraight,
        status.has_claimed_open,
        settings.display_lang,
    );
    if !has_won(hand) {
        return (name, false, 0);
    }
    todo!();
}
/// 一気通貫
pub fn check_straight(
    hand: &HandAnalyzer,
    status: &Status,
    settings: &Settings,
) -> (&'static str, bool, u32) {
    let name = get(
        Kind::Straight,
        status.has_claimed_open,
        settings.display_lang,
    );

    if !has_won(hand) {
        return (name, false, 0);
    }
    let mut m = [false; 3];
    let mut p = [false; 3];
    let mut s = [false; 3];

    for v in &hand.sequential3 {
        match v.get() {
            [Tile::M1, Tile::M2, Tile::M3] => m[0] = true,
            [Tile::M4, Tile::M5, Tile::M6] => m[1] = true,
            [Tile::M7, Tile::M8, Tile::M9] => m[2] = true,
            [Tile::P1, Tile::P2, Tile::P3] => p[0] = true,
            [Tile::P4, Tile::P5, Tile::P6] => p[1] = true,
            [Tile::P7, Tile::P8, Tile::P9] => p[2] = true,
            [Tile::S1, Tile::S2, Tile::S3] => s[0] = true,
            [Tile::S4, Tile::S5, Tile::S6] => s[1] = true,
            [Tile::S7, Tile::S8, Tile::S9] => s[2] = true,
            _ => {}
        }
    }

    if (m[0] && m[1] && m[2]) || (p[0] && p[1] && p[2]) || (s[0] && s[1] && s[2]) {
        if status.has_claimed_open {
            return (name, true, 1);
        } else {
            return (name, true, 2);
        }
    }
    return (name, false, 0);
}
/// 対々和
pub fn check_all_triplet_hand(
    hand: &HandAnalyzer,
    status: &Status,
    settings: &Settings,
) -> (&'static str, bool, u32) {
    let name = get(
        Kind::AllTripletHand,
        status.has_claimed_open,
        settings.display_lang,
    );
    if !has_won(hand) {
        return (name, false, 0);
    }
    if hand.same3.len() == 4 && hand.same2.len() == 1 {
        return (name, true, 2);
    }
    return (name, false, 0);
}
/// 三暗刻
pub fn check_three_closed_triplets(
    hand: &HandAnalyzer,
    status: &Status,
    settings: &Settings,
) -> (&'static str, bool, u32) {
    let name = get(
        Kind::ThreeClosedTriplets,
        status.has_claimed_open,
        settings.display_lang,
    );
    if !has_won(hand) {
        return (name, false, 0);
    }
    todo!();
}
/// 三色同刻
pub fn check_three_colour_triplets(
    hand: &HandAnalyzer,
    status: &Status,
    settings: &Settings,
) -> (&'static str, bool, u32) {
    let name = get(
        Kind::ThreeColourTriplets,
        status.has_claimed_open,
        settings.display_lang,
    );
    if !has_won(hand) {
        return (name, false, 0);
    }
    todo!();
}
/// 混全帯么九
pub fn check_terminal_or_honor_in_each_set(
    hand: &HandAnalyzer,
    status: &Status,
    settings: &Settings,
) -> (&'static str, bool, u32) {
    let name = get(
        Kind::


[2447] = "Botão-da-paz",
[2448] = "Pavês Pesado",
[2449] = "Raiz-telúrica",
[2450] = "Cravespinho",
[2451] = "Escudo Brasonado Timbrado",
[2452] = "Cardo-veloz",
[2453] = "Ervamossa",
[2454] = "Elixir de Força de Leão",
[2455] = "Poção Menor de Mana",
[2456] = "Poção Menor de Rejuvenescimento",
[2457] = "Elixir de Agilidade Menor",
[2458] = "Elixir de Fortitude Menor",
[2459] = "Poção de Rapidez",
[2460] = "Elixir of Tongues (NYI)",
[2461] = "Deprecated Elemental Resistance Potion",
[2462] = "Deprecated Potion of Lesser Invulnerability (Fix)",
[2463] = "Gibão Cravejado",
[2464] = "Cinto Cravejado",
[2465] = "Calças Cravejadas",
[2466] = "Fetiche Rachacrânio",
[2467] = "Botas Cravejadas",
[2468] = "Braçadeiras Cravejadas",
[2469] = "Luvas Cravejadas",
[2470] = "Colete de Couro Reforçado",
[2471] = "Cinto de Couro Reforçado",
[2472] = "Calças de Couro Reforçado",
[2473] = "Botas de Couro Reforçado",
[2474] = "Braçadeiras de Couro Reforçado",
[2475] = "Luvas de Couro Reforçado",
[2476] = "Anca Fria de Basilisco",
[2477] = "Crânio do Assolador",
[2478] = "Deprecated Replenishing Font",
[2479] = "Machado Largo",
[2480] = "Clava Grande",
[2481] = "Espada de Peão",
[2482] = "Machadinha Inferior",
[2483] = "Machado Largo Rústico",
[2484] = "Faquinha",
[2485] = "Tábua Farpada",
[2486] = "Maça de Pedra Grande",
[2487] = "Cajado de Acólito",
[2488] = "Gládio",
[2489] = "Espada de Duas Mãos",
[2490] = "Machadinha",
[2491] = "Machado Largo",
[2492] = "Clava",
[2493] = "Marreta de Madeira",
[2494] = "Estilete",
[2495] = "Bengala",
[2496] = "Espada Curta do Saqueador",
[2497] = "Espadão Enferrujado",
[2498] = "Machadinha Pequena",
[2499] = "Double-Bladed Axe",
[2500] = "Martelo Leve",
[2501] = "Martelo de Guerra de Madeira",
[2502] = "Adaga Arranhada",
[2503] = "Cajado Curto de Adepto",
[2504] = "Arco Curto Usado",
[2505] = "Arco Curto Polido",
[2506] = "Arco Recurvo de Pau-de-chifre",
[2507] = "Arco Recurvo Laminado",
[2508] = "Bacamarte Velho",
[2509] = "Bacamarte Ornado",
[2510] = "Bacamarte Maciço",
[2511] = "Cano de Atirar do Caçador",
[2512] = "Flecha Rústica",
[2513] = "Deprecated Iron Shot",
[2514] = "Depricated Sharp Arrow",
[2515] = "Flecha Afiada",
[2516] = "Muni


8 */	lwz r29, 8(r3)
/* 80272D24 0026E984  54 04 8B FE */	srwi r4, r0, 0xf
/* 80272D28 0026E988  3C E0 10 62 */	lis r7, 0x10624DD3@ha
/* 80272D2C 0026E98C  7E A4 30 16 */	mulhwu r21, r4, r6
/* 80272D30 0026E990  3D 60 01 E1 */	lis r11, 0x01E13380@ha
/* 80272D34 0026E994  38 E7 4D D3 */	addi r7, r7, 0x10624DD3@l
/* 80272D38 0026E998  83 43 00 00 */	lwz r26, 0(r3)
/* 80272D3C 0026E99C  38 0B 33 80 */	addi r0, r11, 0x01E13380@l
/* 80272D40 0026E9A0  81 63 00 20 */	lwz r11, 0x20(r3)
/* 80272D44 0026E9A4  7F 05 31 D6 */	mullw r24, r5, r6
/* 80272D48 0026E9A8  3A EA 51 80 */	addi r23, r10, 0x00015180@l
/* 80272D4C 0026E9AC  7C 76 62 14 */	add r3, r22, r12
/* 80272D50 0026E9B0  3B 80 00 3C */	li r28, 0x3c
/* 80272D54 0026E9B4  3A C3 FF FF */	addi r22, r3, -1
/* 80272D58 0026E9B8  3C 60 4E 1E */	lis r3, 0x4E1E4080@ha
/* 80272D5C 0026E9BC  7F 24 31 D6 */	mullw r25, r4, r6
/* 80272D60 0026E9C0  7D 55 C2 14 */	add r10, r21, r24
/* 80272D64 0026E9C4  3B E3 40 80 */	addi r31, r3, 0x4E1E4080@l
/* 80272D68 0026E9C8  3B C0 0E 10 */	li r30, 0xe10
/* 80272D6C 0026E9CC  39 80 FF F1 */	li r12, -15
/* 80272D70 0026E9D0  7C C4 A1 D6 */	mullw r6, r4, r20
/* 80272D74 0026E9D4  57 24 E8 3E */	rotlwi r4, r25, 0x1d
/* 80272D78 0026E9D8  7D 4A 32 14 */	add r10, r10, r6
/* 80272D7C 0026E9DC  7C C7 40 16 */	mulhwu r6, r7, r8
/* 80272D80 0026E9E0  7D 43 53 78 */	mr r3, r10
/* 80272D84 0026E9E4  51 44 E8 04 */	rlwimi r4, r10, 0x1d, 0, 2
/* 80272D88 0026E9E8  53 23 07 7E */	rlwimi r3, r25, 0, 0x1d, 0x1f
/* 80272D8C 0026E9EC  7C 63 1E 70 */	srawi r3, r3, 3
/* 80272D90 0026E9F0  54 CA D1 BE */	srwi r10, r6, 6
/* 80272D94 0026E9F4  7C 84 01 94 */	addze r4, r4
/* 80272D98 0026E9F8  7C 63 01 94 */	addze r3, r3
/* 80272D9C 0026E9FC  7D 38 FE 70 */	srawi r24, r9, 0x1f
/* 80272DA0 0026EA00  7C E0 48 16 */	mulhwu r7,


now growing stronger. Soon I, in my
age beyond ages, might not be a match
for you. And sensibly, I won't take
that risk later. But I do so love a
fresh challenge every now and then.

So hear this.

Seek my Pyramid! Challenge my maze!

Of course you should have a reason
more than simply my word of challenge.

How about treasure? Ah, I knew that
would do it. Within my Labyrinth lies
much treasure if you can find it. It
lies within much risk, but any reward
without risk is hollow and cold as is.

And there is what I carry as well,
though I feel it fair to warn you
that I have played this game for a
long, long time and have yet to lose.

Oh and one more thing, should you not
be properly entered within the great
Book of the Dead before entering,
those within shall ensure that you
become so, promptly indeed.

Face me if you dare!

]],
    },
    CardGameManual = {


ount);

		var envVars = new LlvmIrGlobalVariable (appEnvVars, "__naot_android_app_environment_variables") {
			Comment = " Application environment variables array, name:value",
			Options = LlvmIrVariableOptions.GlobalConstant,
		};
		module.Add (envVars);
		module.AddGlobalVariable ("__naot_android_app_environment_variable_contents", envVarsBlob, LlvmIrVariableOptions.GlobalConstant);

		// We reuse the same structure as for environment variables, there's no point in adding a new, identical, one
		var sysPropsBlob = new LlvmIrStringBlob ();
		List<StructureInstance<LlvmIrHelpers.AppEnvironmentVariable>> appSysProps = LlvmIrHelpers.MakeEnvironmentVariableList (
			Log,
			systemProperties,
			sysPropsBlob,
			appEnvironmentVariableStructureInfo
		);

		var sysPropsCount = new LlvmIrGlobalVariable ((uint)appSysProps.Count, "__naot_android_app_system_property_count");
		module.Add (sysPropsCount);

		var sysProps = new LlvmIrGlobalVariable (appSysProps, "__naot_android_app_system_properties") {
			Comment = " System properties defined by the application",
			Options = LlvmIrVariableOptions.GlobalConstant,
		};
		module.Add (sysProps);
		module.AddGlobalVariable ("__naot_android_app_system_property_contents", sysPropsBlob, LlvmIrVariableOptions.GlobalConstant);
	}

	void MapStructures (LlvmIrModule module)
	{
		appEnvironmentVariableStructureInfo = module.MapStructure<LlvmIrHelpers.AppEnvironmentVariable> ();
	}
}


  .swal2-success-ring {
        width: 2em;
        height: 2em;
      }

      .swal2-success-fix {
        top: 0;
        left: .4375em;
        width: .4375em;
        height: 2.6875em;
      }

      [class^='swal2-success-line'] {
        height: .3125em;

        &[class$='tip'] {
          top: 1.125em;
          left: .1875em;
          width: .75em;
        }

        &[class$='long'] {
          top: .9375em;
          right: .1875em;
          width: 1.375em;
        }
      }
    }

    &.swal2-show {
      animation: showSweetToast .5s;
    }

    &.swal2-hide {
      animation: hideSweetToast .2s forwards;
    }

    .swal2-animate-success-icon {
      .swal2-success-line-tip {
        animation: animate-toast-success-tip .75s;
      }

      .swal2-success-line-long {
        animation: animate-toast-success-long .75s;
      }
    }
  }
}

// Animations
@keyframes showSweetToast {
  0% {
    transform: translateY(-.625em) rotateZ(2deg);
    opacity: 0;
  }

  33% {
    transform: translateY(0) rotateZ(-2deg);
    opacity: .5;
  }

  66% {
    transform: translateY(.3125em) rotateZ(2deg);
    opacity: .7;
  }

  100% {
    transform: translateY(0) rotateZ(0);
    opacity: 1;
  }
}

@keyframes hideSweetToast {
  0% {
    opacity: 1;
  }

  33% {
    opacity: .5;
  }

  100% {
    transform: rotateZ(1deg);
    opacity: 0;
  }
}

@keyframes animate-toast-success-tip {
  0% {
    top: .5625em;
    left: .0625em;
    width: 0;
  }

  54% {
    top: .125em;
    left: .125em;
    width: 0;
  }

  70% {
    top: .625em;
    left: -.25em;
    width: 1.625em;
  }

  84% {
    top: 1.0625em;
    left: .75em;
    width: .5em;
  }

  100% {
    top: 1.125em;
    left: .1875em;
    width: .75em;
  }
}

@keyframes animate-toast-success-long {
  0% {
    top: 1.625em;
    right: 1.375em;
    width: 0;
  }

  65% {
    top: 1.25em;
    right: .9375em;
    width: 0;
  }

  84% {
    top: .9375em;
    right: 0;
    width: 1.125em;
  }

  100% {
    top: .9375em;
    right: .1875em;
    width: 1.375em;
  }
}
@include flag-icon(ad);
@include flag-icon(ae);
@include flag-icon(af);
@include flag-icon(ag);
@include flag-icon(ai);
@include flag-icon(al);
@include flag-icon(am);
@include flag-icon(ao);
@include flag-icon(aq);
@include flag-icon(ar);
@include flag-icon(as);
@include flag-icon(at);
@include flag-icon(au);
@include flag-icon(aw);
@include flag-icon(ax);
@include flag-icon(az);
@include flag-icon(ba);
@include flag-icon(bb);
@include flag-icon(bd);
@include flag-icon(be);
@include flag-icon(bf);
@include flag-icon(bg);
@include flag


/value change modes

		const EBTDecoratorAbortRequest RequestMode = (NotifyObserver == EBTBlackboardRestart::ValueChange) ? EBTDecoratorAbortRequest::ConditionPassing : EBTDecoratorAbortRequest::ConditionResultChanged;
		ConditionalFlowAbort(*BehaviorComp, RequestMode);
	}

	return EBlackboardNotificationResult::ContinueObserving;
}

void UBTDecorator_Blackboard::DescribeRuntimeValues(const UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory, EBTDescriptionVerbosity::Type Verbosity, TArray<FString>& Values) const
{
	Super::DescribeRuntimeValues(OwnerComp, NodeMemory, Verbosity, Values);

	const UBlackboardComponent* BlackboardComp = OwnerComp.GetBlackboardComponent();
	FString DescKeyValue;

	if (BlackboardComp)
	{
		DescKeyValue = BlackboardComp->DescribeKeyValue(BlackboardKey.GetSelectedKeyID(), EBlackboardDescription::OnlyValue);
	}

	const bool bResult = BlackboardComp && EvaluateOnBlackboard(*BlackboardComp);
	Values.Add(FString::Printf(TEXT("value: %s (%s)"), *DescKeyValue, bResult ? TEXT("pass") : TEXT("fail")));
}

FString UBTDecorator_Blackboard::GetStaticDescription() const
{
	return FString::Printf(TEXT("%s: %s"), *Super::GetStaticDescription(), *CachedDescription);
}

#if WITH_EDITOR
static UEnum* BasicOpEnum = NULL;
static UEnum* ArithmeticOpEnum = NULL;
static UEnum* TextOpEnum = NULL;

static void CacheOperationEnums()
{
	if (BasicOpEnum == NULL)
	{
		BasicOpEnum = StaticEnum<EBasicKeyOperation::Type>();
		check(BasicOpEnum);
	}

	if (ArithmeticOpEnum == NULL)
	{
		ArithmeticOpEnum = StaticEnum<EArithmeticKeyOperation::Type>();
		check(ArithmeticOpEnum);
	}

	if (TextOpEnum == NULL)
	{
		TextOpEnum = StaticEnum<ETextKeyOperation::Type>();
		check(TextOpEnum);
	}
}

void UBTDecorator_Blackboard::BuildDescription()
{
	UBlackboardData* BlackboardAsset = GetBlackboardAsset();
	const FBlackboardEntry* EntryInfo = BlackboardAsset ? BlackboardAsset->GetKey(BlackboardKey.GetSelectedKeyID()) : NULL;

	FString BlackboardDesc = "invalid";
	if (EntryInfo)
	{
		// safety feature to not crash when changing couple of properties on a bunch
		// while "post edit property" triggers for every each of them
		if (EntryInfo->KeyType->GetClass() == BlackboardKey.SelectedKeyType)
		{
			const FString KeyName = EntryInfo->EntryName.ToString();
			CacheOperationEnums();

			const EBlackboardKeyOperation::Type Op = EntryInfo->KeyType->GetTestOperation();
			switch (Op)
			{
			case EBlackboardKeyOperation::Basic:
				BlackboardDesc = FString::Printf(TEXT("%s is %s"), *KeyName, *BasicOpEnum->GetDisplayNameTextByValue(OperationType).ToString());
				break;

			case EBlackboardKeyOperation::Arithmetic:
				BlackboardDesc = FString::Printf(TEXT("%s %s %s"), *KeyName, *ArithmeticOpEnum->GetDisplayNameTextByValue(OperationType).ToString(),
					*EntryInfo->KeyType->DescribeArithmeticParam(IntValue, FloatValue));
				break;

			case EBlackboardKeyOperation::Text:
				BlackboardDesc = FString::Printf(TEXT("%s %s [%s]"), *KeyName, *TextOpEnum->GetDisplayNameTextByValue(OperationType).ToString(), *StringValue);
				break;

			default: break;
			}
		}
	}

	CachedDescription = BlackboardDesc;
}

void UBTDecorator_Blackboard::PostEditChangeProperty(FP


스턴트로 대화를 시작할 수 있습니다.

> [!TIP]
> 우리의 `docker-compose`에는 CPU에서 실행되는 로컬 Ollama가 포함되어 있습니다. 빠른 테스트용으로 사용할 수 있습니다. 그러나 속도가 느리기 때문에 다른 모델 사용을 권장합니다. 만약 사용하고 싶다면, 어시스턴트에 다음과 같이 모델 확장 기능을 추가하세요.
> * 확장: `Dev: Ollama`
> * 엔드포인트: `http://ollama:11434`
> * 모델: `llama3.2`
### 모델 컨텍스트 프로토콜 (MCP) [선택 사항]

`MCP Tools` 확장 기능이 포함된 `sse` 인터페이스를 제공하는 모든 MCP 서버를 사용하세요 (또는 `mcp-tool-as-server`를 프록시로 하여 `stdio` MCP 서버 앞에 둘 수도 있습니다).
각 MCP 서버는 확장 기능으로 세부적으로 구성할 수 있습니다.

### 검색 증강 생성(RAG) / 파일 검색 [선택 사항]

사용자가 제공한 파일을 검색하기 위해 우리의 RAG 서버인 `REI-S`를 사용하세요. 어시스턴트에 대해 `Search Files` 확장 기능만 구성하면 됩니다.
이 프로세스는 [ `services/reis` 하위 디렉터리](services/reis/#example-configuration-in-c4)에서 자세히 설명되어 있습니다.

## 기여 및 개발

* 기여 방법에 대한 지침은 [CONTRIBUTING.md](https://raw.githubusercontent.com/codecentric/c4-genai-suite/main/CONTRIBUTING.md)를 참조하세요.
* 개발자 온보딩을 위해서는 [DEVELOPERS.md](https://raw.githubusercontent.com/codecentric/c4-genai-suite/main/DEVELOPERS.md)를 확인하세요.

## 주요 구성 요소

이 애플리케이션은 **프론트엔드**, **백엔드**, 그리고 **REI-S** 서비스로 구성되어 있습니다.

```
┌──────────┐
│   사용자   │
└─────┬────┘
      │


ELEMENT_TEMPLATEITEM,
				ICONS_PATH + OBJ16_PATH + "templatereportitem.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_NEW_REPORT, ICONS_PATH + OBJ16_PATH + "new_report.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_NEW_LIBRARY, ICONS_PATH + EVIEW16_PATH + "library.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_NEW_FOLDER, ICONS_PATH + OBJ16_PATH + "new_folder.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_NEW_TEMPLATE, ICONS_PATH + OBJ16_PATH + "new_template.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_REPORT_FILE, ICONS_PATH + EVIEW16_PATH + "report.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_TEMPLATE_FILE, ICONS_PATH + EVIEW16_PATH + "template.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_LIBRARY_FILE, ICONS_PATH + EVIEW16_PATH + "library.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_DOCUMENT_FILE, ICONS_PATH + EVIEW16_PATH + "document.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_REPORT_LOCK, ICONS_PATH + OBJ16_PATH + "icon_lock_node.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_LOCK_MENU, ICONS_PATH + OBJ16_PATH + "icon_lock_menu.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_QUIK_EDIT, ICONS_PATH + EVIEW16_PATH + "quick_edit.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_REPORT_PERSPECTIVE,
				ICONS_PATH + EVIEW16_PATH + "report_perspective.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_REPORT_PROJECT, ICONS_PATH + OBJ16_PATH + "report_project.gif"); //$NON-NLS-1$

		// element icons
		declareImage(IReportGraphicConstants.ICON_ELEMENT_CELL, ICONS_PATH + OBJ16_PATH + "cell.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_ELEMENT_DATA, ICONS_PATH + OBJ16_PATH + "data.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_ELEMENT_DATA_LARGE, ICONS_PATH + OBJ16_PATH + "data_large.png"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_ELEMENT_DATA_SET, ICONS_PATH + OBJ16_PATH + "data_set.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_ELEMENT_DATA_SOURCE, ICONS_PATH + OBJ16_PATH + "data_source.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_ELEMENT_ODA_DATA_SET, ICONS_PATH + OBJ16_PATH + "data_set.gif"); //$NON-NLS-1$

		declareImage(IReportGraphicConstants.ICON_ELEMENT_ODA_DATA_SOURCE, ICONS_PATH


param name="link">The link.</param>
		/// ------------------------------------------------------------------------------------
		public void HandleLinkRequest(FwAppArgs link)
		{
			FieldWorks.HandleLinkRequest(link);
		}

		/// <summary>
		/// Reopens the given FLEx project. This may be necessary if some external process modified the pro


156151
IGlua29tZW4= 156152
IOW9qeelnuS6iemcuOe9keermQ== 156153
U1RT 156154
KE1vZHVsZQ== 156155
IHNpZGlp 156156
INC20LjQstC+0YLQsA== 156157
INC/0L7QtNC+0LnQtNC10YI= 156158
IGFmZ2VzdA== 156159
IGNyZWF0aXZpZGFk 156160
4pas4pas 156161
Vk1M 156162
IGt1cnVt 156163
IFJFTg== 156164
IHJpcHBpbmc= 156165
IGdlbHQ= 156166
eGFl 156167
IOGDqOGDog== 156168
cmV0dG8= 156169
b2xpcXVl 156170
INCx0LDQudC90LDQuw== 156171
IENlbGxl 156172
IOCypuCzgQ== 156173
INGP0qPRiw== 156174
54K46YeR6Iqx 156175
IGdyYWNlZnVsbHk= 156176
QUxMRVJZ 156177
SEVSRQ== 156178
X0hBVkU= 156179
IGdlbGnFn3Q= 156180
IFJlZXNl 156181
IGFtYWxh 156182
IGNhbWlub3M= 156183
w7VlbQ== 156184
eW50YQ== 156185
IENPTE9SUw== 156186
IEZTTQ== 156187
IOCwrOCxhg== 156188
IFplbQ== 156189
IE1hY2Vkb25pYQ== 156190
2LTYsdi32Kk= 156191
IMO1aWc= 156192
INGA05nQuNGB0Lg= 156193
aXRpdm9z 156194
IGVnbmE= 156195
4LCl4LGN4LCv4LCC4LCy4LGL 156196
Ym9uZXM= 156197
INi02YjZhw== 156198
IGV6aW1i 156199
IEJBTQ== 156200
IGluaW1lc2Vk 156201
IOC0uOC1jeC0teC0puC1h+C0tuC0vw== 156202
IOCqleCqsOCrjeCqrg== 156203
WW91dGg= 156204
6byg 156205
IGFwcHJlbmQ= 156206
IFJFR0lPTg== 156207
IM66zrHOuM63 156208
IHF1aXRz 156209
IHBlcGE= 156210
IG9yY2hpZA== 156211
0LjRgtCw0L0= 156212
5aSn5Y+R55S1 156213
Y2hpZQ== 156214
cm9tZXRyeQ== 156215
IOCyruCzgA== 156216
IOCmmuCmvuCmlQ== 156217
UnVl 156218
aXJ1dA== 156219
IOCqteCqv+Cqtw== 156220
IGRvbWljaWxp 156221
CUNvbnRleHQ= 156222
RVJSUQ== 156223
06nTqdC7 156224
5pa96Kit 156225
INCy0LDQt9C40YQ= 156226
Y3VsYWlyZQ== 156227
IGNvbXBsZW1lbnRhcg== 156228
X0FMRVJU 156229
IG3hu4Ft 156230
4oCd66mw 156231
INWh1bbVuNaC1bQ= 156232
0LzQuNGA0LA= 156233
IHByb21pbmVudGx5 156234
dW1pd2E= 156235
IOCknOCkvuCkj+CkguCkl+Clhw== 156236
IE91dGRvb3Jz 156237
IGluc3RhbGxlcmV


13.34 10.84C12.96 10.84 12.62 10.96 12.34 11.16L11 12.16L5.66 16.16C5.26 16.46 5 16.96 5 17.5V32.5C5 33.04 5.26 33.54 5.66 33.84L11 37.84L12.34 38.84C12.62 39.04 12.96 39.16 13.34 39.16C13.78 39.16 14.2 39 14.48 38.7L14.6 38.58L21.4 32.06L32.06 44.42C32.38 44.78 32.82 45 33.34 45C33.68 45 34 44.9 34.26 44.72L44.26 38.06C44.7 37.76 45 37.24 45 36.66V13.34C45 12.74 44.7 12.24 44.26 11.94ZM32 28.1L28.76 25L32 21.9V28.1ZM11 19.98L11.66 20.74L15.34 25L11.66 29.24L11 30.02V19.98ZM23.58 29.98L21.62 27.7L19.28 25L17.6 23.04L17.32 22.7L13.94 18.78L11.28 15.7L13.22 14.26L19.34 20.1L19.46 20.2L21.62 22.28L24.44 25L26.6 27.06L26.7 27.16L32 32.26V39.74L23.68 30.1L23.58 29.98ZM38.38 38.38L38 38.62L35 40.64V9.38L38 11.38L38.38 11.64L40.94 13.34L42 14.04V35.96L40.94 36.66L38.38 38.38Z"/> </symbol><symbol id="brand-youtube" viewBox="0 0 30 30"> <path d="M29.4145 8.62258C29.0932 7.39355 28.1434 6.42581 26.9391 6.09677C24.7564 5.5 16 5.5 16 5.5C16 5.5 7.24364 5.5 5.06091 6.09677C3.85659 6.42581 2.90682 7.39355 2.58545 8.62258C2 10.8516 2 15.5 2 15.5C2 15.5 2 20.1484 2.58545 22.3774C2.90682 23.6065 3.85659 24.5742 5.06091 24.9032C7.24364 25.5 16 25.5 16 25.5C16 25.5 24.7564 25.5 26.9391 24.9032C28.1434 24.5742 29.0932 23.6065 29.4145 22.3774C30 20.1484 30 15.5 30 15.5C30 15.5 30 10.8516 29.4145 8.62258ZM13.1364 19.721V11.279L20.4545 15.5L13.1364 19.721Z"/> </symbol><symbol id="calendar-add" viewBox="0 0 24 24"> <path d="M17.5 12C20.5376 12 23 14.4624 23 17.5C23 20.5376 20.5376 23 17.5 23C14.4624 23 12 20.5376 12 17.5C12 14.4624 14.4624 12 17.5 12ZM17.75 3C19.5449 3 21 4.45507 21 6.25L21.0012 12.0226C20.5378 11.7258 20.0342 11.4861 19.5004 11.3136L19.5 8.5H4.5V17.75C4.5 18.7165 5.2835 19.5 6.


_080625DC: .4byte 0x0000FFFF
_080625E0: .4byte gBackgroundsCopyQueueCursor
_080625E4: .4byte gBackgroundsCopyQueueIndex
_080625E8: .4byte sa2__gUnknown_03005390
_080625EC: .4byte gVramGraphicsCopyCursor
_080625F0: .4byte gVramGraphicsCopyQueueIndex
_080625F4:
	movs r0, #0
	strb r0, [r2]
_080625F8:
	adds r2, #1
	adds r3, #1
	cmp r3, #3
	bhi _0806260A
	ldrb r0, [r7]
	asrs r0, r3
	ands r0, r5
	cmp r0, #0
	bne _0806258A
_0806260A:
	ldr r0, _08062718 @ =gGameMode
	ldrb r0, [r0]
	cmp r0, #1
	bls _0806262E
	ldr r2, _0806271C @ =gMultiSioRecv
	ldr r0, _08062720 @ =gMultiSioStatusFlags
	ldr r0, [r0]
	movs r1, #0x80
	ands r0, r1
	cmp r0, #0
	bne _0806262E
	ldrh r0, [r2]
	cmp r0, #0x4f
	bls _0806262E
	ldrb r0, [r2, #2]
	adds r1, r6, #0
	adds r1, #0x55
	strb r0, [r1]
_0806262E:
	ldr r2, [r6, #0x4c]
	adds r0, r6, #0
	adds r0, #0x58
	adds r2, #1
	ldrb r0, [r0]
	adds r3, r6, #0
	adds r3, #0x52
	cmp r0, #1
	bne _08062644
	movs r0, #0
	strh r0, [r3]
_08062644:
	str r2, [r6, #0x4c]
	movs r0, #0xb4
	lsls r0, r0, #2
	mov r4, r8
	adds r1, r4, r0
	str r2, [r1]
	add r0, sb
	str r2, [r0]
	mov r0, sl
	str r2, [r0, #0x48]
	adds r5, r6, #0
	adds r5, #0x55
	ldrb r2, [r5]
	ldr r0, _08062724 @ =0x000002D7
	adds r1, r4, r0
	strb r2, [r1]
	ldrb r1, [r5]
	add r0, sb
	strb r1, [r0]
	ldrb r0, [r5]
	mov r1, sl
	adds r1, #0x4f
	strb r0, [r1]
	movs r1, #0
	ldrsh r0, [r3, r1]
	adds r4, r6, #0
	adds r4, #0x50
	ldrh r1, [r4]
	subs r0, r0, r1
	lsls r0, r0, #1
	movs r1, #0xa
	bl Div
	ldrh r2, [r4]
	adds r2, r2, r0
	movs r7, #0
	strh r2, [r4]
	movs r0, #0xb5
	lsls r0, r0, #2
	mov r3, r8
	adds r1, r3, r0
	strh r2, [r1]
	ldrh r1, [r4]
	add r0, sb
	strh r1, [r0]
	ldrh


-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:re


TOR_SRC_ALPHA
    Blending.BlendFactor.OneMinusSrcAlpha -> VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA

    Blending.BlendFactor.SrcColor -> VK_BLEND_FACTOR_SRC_COLOR
    Blending.BlendFactor.OneMinusSrcColor -> VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR

    Blending.BlendFactor.DstColor -> VK_BLEND_FACTOR_DST_COLOR
    Blending.BlendFactor.OneMinusDstColor -> VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR

    Blending.BlendFactor.DstAlpha -> VK_BLEND_FACTOR_DST_ALPHA
    Blending.BlendFactor.OneMinusDstAlpha -> VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA

    Blending.BlendFactor.ConstantColor -> VK_BLEND_FACTOR_CONSTANT_COLOR
    Blending.BlendFactor.OneMinusConstantColor -> VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR

    Blending.BlendFactor.ConstantAlpha -> VK_BLEND_FACTOR_CONSTANT_ALPHA
    Blending.BlendFactor.OneMinusConstantAlpha -> VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_ALPHA

    Blending.BlendFactor.Src1Color -> VK_BLEND_FACTOR_SRC1_COLOR
    Blending.BlendFactor.OneMinusSrc1Color -> VK_BLEND_FACTOR_ONE_MINUS_SRC1_COLOR

    Blending.BlendFactor.Src1Alpha -> VK_BLEND_FACTOR_SRC1_ALPHA
    Blending.BlendFactor.OneMinusSrc1Alpha -> VK_BLEND_FACTOR_ONE_MINUS_SRC1_ALPHA

    Blending.BlendFactor.SrcAlphaSaturate -> VK_BLEND_FACTOR_SRC_ALPHA_SATURATE
}

/**
 * Converts a [Blending.BlendOp] to a Vulkan-intenal integer-based descriptor.
 */
fun Blending.BlendOp.toVulkan() = when (this) {
    Blending.BlendOp.add -> VK_BLEND_OP_ADD
    Blending.BlendOp.subtract -> VK_BLEND_OP_SUBTRACT
    Blending.BlendOp.min -> VK_BLEND_OP_MIN
    Blending.BlendOp.max -> VK_BLEND_OP_MAX
    Blending.BlendOp.reverse_subtract -> VK_BLEND_OP_REVERSE_SUBTRACT
}

/**
 * VU - Vulkan Utils
 *
 * A collection of convenience methods for various Vulkan-related tasks
 *
 * @author Ulrik Guenther <hello@ulrik.is>
 */
class VU {

    /**
     * Exception class to be thrown when a Vulkan command fails.
     */
    class VulkanCommandException(message: String) : RuntimeException(message)

    /**
     * Companion object for [VU] to access methods statically.
     */
    companion object {
        private val logger by lazyLogger()

        /**
         * Runs a lambda [function] containing a Vulkan call, and checks it for errors. Allowed error codes
         * can be set in [allowedResults], for debugging, the call may be given a [name].
         */
        inline fun run(name: String, function: () -> Int, allowedResults: List<Int> = emptyList()) {
            val result = function.invoke()

            if (result != VK_SUCCESS && result !in allowedResults) {
                LoggerFactory.getLogger("VulkanRenderer").error("Call to $name failed: ${translate(result)}")

                if(result < 0) {
                   throw VulkanCommandException("Call to $name failed: ${translate(result)}")
                }
            }

            if(result in allowedResults) {
                LoggerFactory.getLogger("VulkanRenderer").debug("Call to $name did not result in error because return code(s) ${allowedResults.joinToString(", ")} were explicitly tolerated.")
            }
        }

        /**
         * Runs a lambda [function] containing a Vulkan call, and checks it for errors. After the call, [cleanup] is run.
         * For debugging, the call may be given a [name].
         */
        inline fun run(name


   search_multi_poly[0].outer().push_back(P(x - w/2, y + h));
    search_multi_poly[0].outer().push_back(P(x - w, y + h));
    search_multi_poly[0].outer().push_back(P(x - w, y + h/2));
    search_multi_poly[0].outer().push_back(P(x - 3*w/2, y));
    search_multi_poly[0].outer().push_back(P(x - w, y - h/2));
    search_multi_poly[0].outer().push_back(P(x - w, y - h));

    search_multi_poly[0].inners().push_back(Poly::ring_type());
    search_multi_poly[0].inners()[0].push_back(P(x - w/2, y - h/2));
    search_multi_poly[0].inners()[0].push_back(P(x + w/2, y - h/2));
    search_multi_poly[0].inners()[0].push_back(P(x + w/2, y + h/2));
    search_multi_poly[0].inners()[0].push_back(P(x - w/2, y + h/2));
    search_multi_poly[0].inners()[0].push_back(P(x - w/2, y - h/2));

    search_multi_poly.push_back(Poly());
    search_multi_poly[1].outer().push_back(P(x - 2*w, y - 2*h));
    search_multi_poly[1].outer().push_back(P(x - 6*w/5, y - 2*h));
    search_multi_poly[1].outer().push_back(P(x - 6*w/5, y - 6*h/5));
    search_multi_poly[1].outer().push_back(P(x - 2*w, y - 6*h/5));
    search_multi_poly[1].outer().push_back(P(x - 2*w, y - 2*h));

    search_multi_poly.push_back(Poly());
    search_multi_poly[2].outer().push_back(P(x + 6*w/5, y + 6*h/5));
    search_multi_poly[2].outer().push_back(P(x + 2*w, y + 6*h/5));
    search_multi_poly[2].outer().push_back(P(x + 2*w, y + 2*h));
    search_multi_poly[2].outer().push_back(P(x + 6*w/5, y + 2*h));
    search_multi_poly[2].outer().push_back(P(x + 6*w/5, y + 6*h/5));

    found_count = query(cont, Predicate(search_multi_poly));

    if ( found_count > 0 )
    {
        std::cout << "search multi_poly[0] outer: ";
        BOOST_FOREACH(P const& p, search_multi_poly[0].outer())
        {
            bgi::detail::utilities::print_indexable(std::cout, p);
            std::cout << ' ';
        }
        std::cout << "\nfound: ";
        print_result(cont);
    }
    else
        std::cout << "boxes not found\n";
}

template <typename Predicate>
void query_segment()
{
    float x = ( rand() % 1000 ) / 10.0f;
    float y = ( rand() % 1000 ) / 10.0f;
    float w = 10.0f - ( rand() % 1000 ) / 50.0f;
    float h = 10.0f - ( rand() % 1000 ) / 50.0f;
    w += 0 <= w ? 10 : -10;
    h += 0 <= h ? 10 : -10;

    boost::geometry::set<0, 0>(search_segment, x - w);
    boost::geometry::set<0, 1>(search_segment, y - h);
    boost::geometry


::increasing_triplet(vec![1,2,3]));
    assert!(Solution::increasing_triplet(vec![4,6,7]));
    assert!(!Solution::increasing_triplet(vec![5,4,3,2,1]));
    assert!(!Solution::increasing_triplet(vec![5,4,6,2,1]));
    assert!(Solution::increasing_triplet(vec![5,4,6,2,7]));
    assert!(Solution::increasing_triplet(vec![2,1,5,0,4,6]));
    assert!(Solution::increasing_triplet(vec![20,100,10,12,5,13]));
}<reponame>knm3000/proxy<gh_stars>10-100
use crate::Adler32;
use std::ops::{AddAssign, MulAssign, RemAssign};

impl Adler32 {
    pub(crate) fn compute(&mut self, bytes: &[u8]) {
        // The basic algorithm is, for every byte:
        //   a = (a + byte) % MOD
        //   b = (b + a) % MOD
        // where MOD = 65521.
        //
        // For efficiency, we can defer the `% MOD` operations as long as neither a nor b overflows:
        // - Between calls to `write`, we ensure that a and b are always in range 0..MOD.
        // - We use 32-bit arithmetic in this function.
        // - Therefore, a and b must not increase by more than 2^32-MOD without performing a `% MOD`
        //   operation.
        //
        // According to Wikipedia, b is calculated as follows for non-incremental checksumming:
        //   b = n×D1 + (n−1)×D2 + (n−2)×D3 + ... + Dn + n*1 (mod 65521)
        // Where n is the number of bytes and Di is the i-th Byte. We need to change this to account
        // for the previous values of a and b, as well as treat every input Byte as being 255:
        //   b_inc = n×255 + (n-1)×255 + ... + 255 + n*65520
        // Or in other words:
        //   b_inc = n*65520 + n(n+1)/2*255
        // The max chunk size is thus the largest value of n so that b_inc <= 2^32-65521.
        //   2^32-65521 = n*65520 + n(n+1)/2*255
        // Plugging this into an equation solver since I can't math gives n = 5552.18..., so 5552.
        //
        // On top of the optimization outlined above, the algorithm can also be parallelized with a
        // bit more work:
        //
        // Note that b is a linear combination of a vector of input bytes (D1, ..., Dn).
        //
        // If we fix some value k<N and rewrite indices 1, ..., N as
        //
        //   1_1, 1_2, ..., 1_k, 2_1, ..., 2_k, ..., (N/k)_k,
        //
        // then we can express a and b in terms of sums of smaller sequences kb and ka:
        //
        //   ka(j) := D1_j + D2_j + ... + D(N/k)_j where j <= k
        //   kb(j) := (N/k)*D1_j + (N/k-1)*D2_j + ... + D(N/k)_j where j <= k
        //
        //  a = ka(1) + ka(2) + ... + ka(k) + 1
        //  b = k*(kb(1) + kb(2) + ... + kb(k)) - 1*ka(2) - ...  - (k-1)*ka(k) + N
        //
        // We use this insight to unroll the main loop and process k=4 bytes at a time.
        // The resulting code is highly amenable to SIMD acceleration, although the immediate speedups
        // stem from increased pipeline parallelism rather than auto-vectorization.
        //
        // This technique is described in-depth (here:)[https://software.intel.com/content/www/us/\
        // en/develop


u653f\u5e9c\u5bf9\u80e1\u98ce\u548c\u80e1\u98ce\u53cd\u9769\u547d\u96c6\u56e2\u5206\u5b50\u5206\u522b\u4f9d\u6cd5\u4e88\u4ee5\u60e9\u5904!", "type": "paragraph"}, {"text": "\u6765\u6e90\uff1a\u300a\u89e3\u653e\u65e5\u62a5\u300b1955\u5e746\u670826\u65e5", "type": "paragraph"}]}
  </script>

    [返回索引页面]

   揭露胡风分子张禹(王思翔)的反革命罪行

   日期：1955-6-26 作者：朱子程, 范平, 郑志

   朱子程、范平、郑志

   我们要揭发胡风反革命集团重要分子张禹(王思翔)的罪行。张禹以两面派手法，伪装革命，潜藏在台湾民主自治同盟中，干着反革命的勾当。张禹断章取义、别有用心地摘录马克思列宁主义经典著作的笔记本就有二十几本。这些笔记本一方面是用来伪装做革命者的，另一方面也是作为进攻党、污蔑党的领导的“资本”。张禹写起文章来就利用这些笔记本，披着马克思列宁主义的外衣，来反对马克思列宁主义。张禹以“非党布尔什维克”自居，以“一贯进步的革命干部”的姿态出现，并窃取了台盟的重要职位，干了很多坏事，严重地危害了人民革命事业。

   如所周知，“泥土社”是胡风反革命集团的重要根据地。一九五○年张禹在台盟工作时即与违法投机出版商胡风分子许史华等人组织“泥土社”，建立起反革命活动的据点。张禹就是这个出版社编辑部的实际负责人和“理论”审查的主要负责人之一。在这个出版社出版的首恶分子胡风的“剑、文艺、人民”“论现实主义的路”、胡风集团骨干分子耿庸的““阿Q正传”研究”以及其他很多胡风分子的著作，都是经张禹校阅的。张禹本人也曾由“泥土社”出版了有严重政治错误的“台湾二月革命记”和极力反对党对文艺战线领导的“文艺的任务及其他”等书。在全国展开对胡风反动思想批判的时候，张禹还恬不知耻地说：“过去泥土社版的胡风著作卖不出，这一次竟一销而空，泥土社还发了一笔洋财!”可见，张禹对於胡风反革命集团的根据地——“泥土社”的


 assemble_nested_body(flat_body)

    # HYBRID APPROACH: Try external API first, always save to JSON storage
    api_success = False
    api_response = None

    # Step 1: Try external API first (demo integration)
    try:
        success, response = await make_api_request("/user", method="POST", params=params, data=data)
        if success:
            api_success = True
            api_response = response
            logger.info("✅ User successfully created via external API")
        else:
            logger.warning(f"External API failed: {response.get('error') if response else 'Unknown error'}")
    except Exception as e:
        logger.warning(f"External API call failed: {e}")

    # Return success response based on JSON storage
    return {
        "success": api_success,
        "message": f"User '{api_response.get('username', api_response['id'])}' successfully created",
        "user": api_response,
    }


oker(Poker.class);
    setInstanceLogger(Logger.class);
  }

  private void updatePorts(Instance instance) {
    final var ps = new Port[numInputs + STD_PORTS];
    if (instance.getAttributeValue(StdAttr.APPEARANCE) == StdAttr.APPEAR_CLASSIC) {
      if (numInputs == 1) {
        ps[0] = new Port(-40, 20, Port.INPUT, 1);
        ps[1] = new Port(-40, 0, Port.INPUT, 1);
      } else if (numInputs == 2) {
        ps[0] = new Port(-40, 0, Port.INPUT, 1);
        ps[1] = new Port(-40, 20, Port.INPUT, 1);
        ps[2] = new Port(-40, 10, Port.INPUT, 1);
      } else {
        throw new RuntimeException("flip-flop input > 2");
      }
      ps[numInputs + 1] = new Port(0, 0, Port.OUTPUT, 1);
      ps[numInputs + 2] = new Port(0, 20, Port.OUTPUT, 1);
      ps[numInputs + 3] = new Port(-10, 30, Port.INPUT, 1);
      ps[numInputs + 4] = new Port(-30, 30, Port.INPUT, 1);
    } else {
      if (numInputs == 1) {
        ps[0] = new Port(-10, 10, Port.INPUT, 1);
        ps[1] = new Port(-10, 50, Port.INPUT, 1);
      } else if (numInputs == 2) {
        ps[0] = new Port(-10, 10, Port.INPUT, 1);
        ps[1] = new Port(-10, 30, Port.INPUT, 1);
        ps[2] = new Port(-10, 50, Port.INPUT, 1);
      } else {
        throw new RuntimeException("flip-flop input > 2");
      }
      ps[numInputs + 1] = new Port(50, 10, Port.OUTPUT, 1);
      ps[numInputs + 2] = new Port(50, 50, Port.OUTPUT, 1);
      ps[numInputs + 3] = new Port(20, 60, Port.INPUT, 1);
      ps[numInputs + 4] = new Port(20, 0, Port.INPUT, 1);
    }
    ps[numInputs].setToolTip(S.getter("flipFlopClockTip"));
    ps[numInputs + 1].setToolTip(S.getter("flipFlopQTip"));
    ps[numInputs + 2].setToolTip(S.getter("flipFlopNotQTip"));
    ps[numInputs + 3].setToolTip(S.getter("flipFlopResetTip"));
    ps[numInputs + 4].setToolTip(S.getter("flipFlopPresetTip"));
    instance.setPorts(ps);
  }

  @Override
  public Bounds getOffsetBounds(AttributeSet attrs) {
    return (attrs.getValue(StdAttr.APPEARANCE) == StdAttr.APPEAR_CLASSIC)
        ? Bounds.create(-40, -10, 40, 40)
        : Bounds.create(-10, 0, 60, 60);
  }

  protected abstract Value computeValue(Value[] inputs, Value curValue);

  //
  // concrete methods not intended to be overridden
  //
  @Override
  protected void configureNewInstance(Instance instance) {
    instance.addAttributeListener();
    updatePorts(instance);
    final var bds = instance.getBounds();
    instance.setTextField(
        StdAttr.LABEL,
        StdAttr.LABEL_FONT,
        bds.getX() + bds.getWidth() / 2,
        bds.getY() - 3,
        GraphicsUtil.H_CENTER,
        GraphicsUtil.V_BASELINE);
  }

  @Override
  public String getHDLName(AttributeSet attrs) {
    final var completeName = new StringBuilder();
    final var parts = this.getName().split(" ");
    completeName.append(parts[0].replace("-", "_").toUpperCase());
    completeName.append("_");
    if (attrs.containsAttribute(StdAttr.


0.53,-3.31l5.06,-3.24l3.77,-7.6l2.63,-1.08l1.25,-2.54l0.57,-2.06l-0.56,-2.46l0.07,-1.09l0.82,-1.41l1.17,-0.69l0.8,-1.66l0.01,-3.28l-1.31,-6.67l3.26,-4.85l3.26,-11.15l-0.12,-0.41l-3.48,-3.04l-0.2,-3.11l-0.99,-2.49l-1.46,-1.5l-1.5,-0.7l-0.93,0.08l-2.12,3.14l-1.09,2.7l-1.55,0.84l-1.02,1.43l-0.04,1.26l-1.01,1.88l-5.52,-3.12l-0.92,0.09l-1.08,-1.1l-2.76,0.67l-1.43,1.74l-0.9,0.53l-0.09,1.05l-1.88,3.04l-0.0,0.86l-0.72,0.32l-0.85,1.74l-3.41,3.32l-10.66,-15.14l0.76,-0.81l2.76,-0.08l0.38,-0.31l0.51,-2.36l-0.28,-2.95l-1.55,-3.19l0.1,-1.25Z", "name": "Union County"}}, "height": 2172.0618544414556, "projection": {"type": "lcc", "centralMeridian": -100.0}, "width": 1000.0});jQuery.fn.vectorMap('addMap', 'us-co_lcc_en',{"insets": [{"width": 1000, "top": 0, "height": 764.0383049477095, "bbox": [{"y": -4912129.934748664, "x": -799379.3846856811}, {"y": -4432526.019758674, "x": -171657.04159869}], "left": 0}], "paths": {"08029": {"path": "M121.14,418.11l2.54,-27.66l27.56,-8.71l1.84,-0.78l0.54,-0.57l1.86,0.32l0.94,-0.99l0.87,0.13l0.3,-0.8l-0.46,-1.37l0.54,-0.45l0.13,-0.64l1.09,0.67l1.37,-0.67l5.24,-6.03l0.32,-1.28l-0.7,-1.79l3.41,-2.68l2.4,-2.76l0.18,0.35l0.62,0.14l1.33,-0.61l1.25,-2.14l0.8,-0.21l5.49,-3.55l0.77,-1.13l1.08,-0.09l2.88,0.51l4.68,-0.34l1.37,0.71l1.23,-0.84l1.57,-0.03l4.08,-1.79l0.4,0.42l0.55,-0.21l1.62,0.4l1.44,1.01l3.27,1.49l1.26,0.78l2.58,3.09l0.9,0.32l0.61,-0.2l0.24,-0.42l0.85,-0.35l0.32,-0.76l0.63,0.03l1.19,-0.85l-0.04,-


t RDPSRAPIInvitation: ::windows_sys::core::GUID = ::windows_sys::core::GUID { data1: 1226264006, data2: 1841, data3: 19294, data4: [142, 225, 131, 166, 61, 56, 104, 250] };
pub const RDPSRAPIInvitationManager: ::windows_sys::core::GUID = ::windows_sys::core::GUID { data1: 1406781915, data2: 30123, data3: 17009, data4: [148, 138, 76, 78, 179, 106, 143, 43] };
pub const RDPSRAPISessionProperties: ::windows_sys::core::GUID = ::windows_sys::core::GUID { data1: 3715470591, data2: 59946, data3: 19462, data4: [143, 223, 19, 45, 228, 139, 101, 16] };
pub const RDPSRAPITcpConnectionInfo: ::windows_sys::core::GUID = ::windows_sys::core::GUID { data1: 3192511295, data2: 60342, data3: 17016, data4: [140, 224, 213, 69, 88, 51, 234, 238] };
pub const RDPSRAPIWindow: ::windows_sys::core::GUID = ::windows_sys::core::GUID { data1: 63915739, data2: 52805, data3: 19766, data4: [134, 237, 237, 40, 183, 67, 152, 191] };
pub const RDPSRAPIWindowList: ::windows_sys::core::GUID = ::windows_sys::core::GUID { data1: 2619466424, data2: 24020, data3: 17100, data4: [129, 186, 28, 9, 152, 82, 230, 250] };
#[doc = "*Required features: `\"Win32_System_DesktopSharing\"`*"]
pub type RDPSRAPI_APP_FLAGS = i32;
#[doc = "*Required features: `\"Win32_System_DesktopSharing\"`*"]
pub const APP_FLAG_PRIVILEGED: RDPSRAPI_APP_FLAGS = 1i32;
#[doc = "*Required features: `\"Win32_System_DesktopSharing\"`*"]
pub type RDPSRAPI_KBD_CODE_TYPE = i32;
#[doc = "*Required features: `\"Win32_System_DesktopSharing\"`*"]
pub const RDPSRAPI_KBD_CODE_SCANCODE: RDPSRAPI_KBD_CODE_TYPE = 0i32;
#[doc = "*Required features: `\"Win32_System_DesktopSharing\"`*"]
pub const RDPSRAPI_KBD_CODE_UNICODE: RDPSRAPI_KBD_CODE_TYPE = 1i32;
#[doc = "*Required features: `\"Win32_System_DesktopSharing\"`*"]
pub type RDPSRAPI_KBD_SYNC_FLAG = i32;
#[doc = "*Required features: `\"Win32_System_DesktopSharing\"`*"]
pub const RDPSRAPI_KBD_SYNC_FLAG_SCROLL_LOCK: RDPSRAPI_KBD_SYNC_FLAG = 1i32;
#[doc = "*Required features: `\"Win32_System_DesktopSharing\"`*"]
pub const RDPSRAPI_KBD_SYNC_FLAG_NUM_LOCK: RDPSRAPI_KBD_SYNC_FLAG = 2i32;
#[doc = "*Required features: `\"Win32_System_DesktopSharing\"`*"]
pub const RDPSRAPI_KBD_SYNC_FLAG_CAPS_LOCK: RDPSRAPI_KBD_SYNC_FLAG = 4i32;
#[doc = "*Required features: `\"Win32_System_DesktopSharing\"`*"]
pub const RDPSRAPI_KBD_SYNC_FLAG_KANA_LOCK: RDPSRAPI_KBD_SYNC_FLAG = 8i32;
#[doc = "*Required features: `\"Win32_System_DesktopSharing\"`*"]
pub type RDPSRAPI_MOUSE_BUTTON_TYPE = i32;
#[doc = "*Required features: `\"Win32


    @Test
    fun `getNonMaskingRestrictedLineExpression with restriction across two legs, disabled`() = runBlocking {
        val viewData = MapboxRouteLineViewOptions.Builder(ctx)
            .routeLineColorResources(
                RouteLineColorResources.Builder()
                    .restrictedRoadColor(Color.CYAN)
                    .inactiveRouteLegRestrictedRoadColor(Color.GRAY)
                    .build(),
            )
            .displayRestrictedRoadSections(true)
            .build()
            .toData()
        val apiOptions = MapboxRouteLineApiOptions.Builder()
            .styleInactiveRouteLegsIndependently(false)
            .calculateRestrictedRoadSections(true)
            .build()
        val expectedExpression = listOf(
            StringChecker("step"),
            StringChecker("[line-progress]"),
            StringChecker("[rgba, 0.0, 0.0, 0.0, 0.0]"),
            DoubleChecker(0.0),
            StringChecker("[rgba, 0.0, 0.0, 0.0, 0.0]"),
            DoubleChecker(0.4459960518654729),
            StringChecker("[rgba, 0.0, 255.0, 255.0, 1.0]"),
            DoubleChecker(0.6043542020248469),
            StringChecker("[rgba, 0.0, 0.0, 0.0, 0.0]"),
        )
        val route = loadNavigationRoute("multileg_route_two_legs_with_restrictions.json")
        val expressionData = MapboxRouteLineUtils.extractRouteRestrictionData(
            route,
            MapboxRouteLineUtils.granularDistancesProvider,
        )

        val result = MapboxRouteLineUtils.getNonMaskingRestrictedLineExpressionProducer(
            expressionData,
            vanishingPointOffset = 0.0,
            activeLegIndex = 1,
            apiOptions,
        )

        checkExpression(expectedExpression, result(viewData).toExpression())
    }

    @Test
    fun cacheResultKeyRouteTraffic_hashCode_numericTraffic() {
        val route = loadNavigationRoute("route-with-congestion-numeric.json")
        val trafficProvider =
            MapboxRouteLineUtils.getRouteLegTrafficNumericCongestionProvider(
                MapboxRouteLineApiOptions.Builder().build(),
            )
        var expectedHashCode = route.id.hashCode()
        expectedHashCode = 31 * expectedHashCode + trafficProvider.hashCode()
        route.directionsRoute.legs()?.forEach { routeLeg ->
            expectedHashCode =
                31 * expectedHashCode + routeLeg.annotation()?.congestion().hashCode()
            expectedHashCode =
                31 * expectedHashCode + routeLeg.annotation()?.congestionNumeric().hashCode()
            expectedHashCode = 31 * expectedHashCode + routeLeg.closures().hashCode()
            MapboxRouteLineUtils.getRoadClassArray(routeLeg.steps()).forEach {
                expectedHashCode = 31 * expectedHashCode + it.hashCode()
            }
        }

        val hashCode = CacheResultUtils.CacheResultKeyRouteTraffic<Any>(
            route,
            trafficProvider,
        ).hashCode()

        assertEquals(expectedHashCode, hashCode)
    }

    @Test
    fun removeLayers() {
        val style = mockk<StyleManager> {
            every { removeStyleLayer(any()) } returns ExpectedFactory.createNone()
            every { removeStyleImage(any()) } returns ExpectedFactory.createNone()
        }

        MapboxRouteLineUtils.removeLayers(style)

        verify { style.removeStyleLayer(TOP_LEVEL_ROUTE_LINE_LAYER_ID) }
        verify { style.removeStyleLayer(BOTTOM_LEVEL_ROUTE_LINE_LAYER_ID) }
        verify { style.removeStyleLayer(LAYER_GROUP_1_TRAIL_CASING) }
        verify { style.removeStyleLayer(LAYER_GROUP_1_TRAIL


同祭事叁	2015年02月21日	东京都大田区产业广场Pio 1层 大展示厅	4751	10	查看场内合同展会

名称	展会主题作品/角色	摊位数	备注

月之宴8	东方儚月抄，东方永夜抄	100

小春小径・陸	博丽灵梦	64	新加入

天狗大人的工作・六	射命丸文，犬走椛，姬海棠果	52	新加入

樱花花信2	东方妖妖梦	35

诹访子乐园 三	<a href="./洩


.onBarMove(screenLeftTimeInMillisecond, screenRightTimeInMillisecond, currentTimeInMillisecond)
                }
                invalidate()
                /* if (lastMoveState) {
                    if (handler.hasMessages(MOVEING))
                        handler.removeMessages(MOVEING);
                    handler.sendEmptyMessageDelayed(MOVEING, 1100);
                }*/mode = NONE
            }
            MotionEvent.ACTION_UP -> {
                if (mode == DRAG) {
                    val deltaX_up = 0 - left
                    val timeBarLength_up = width - screenWidth
                    currentTimeInMillisecond = mostLeftTimeInMillisecond + deltaX_up * WHOLE_TIMEBAR_TOTAL_SECONDS * 1000 / timeBarLength_up
                    //invalidate();
                    if (handler0.hasMessages(ACTION_UP)) handler0.removeMessages(ACTION_UP)
                    handler0.sendEmptyMessageDelayed(ACTION_UP, 1100)
                    /*if (lastMoveState) {
                        if (handler.hasMessages(MOVEING))
                            handler.removeMessages(MOVEING);
                        handler.sendEmptyMessageDelayed(MOVEING, 1100);
                    }*/
                }
                mode = NONE
            }
        }
        return true
    }

    fun scaleByPressingButton(zoomIn: Boolean) {

        //当前所在刻度标准的默认长度（不含两端空出的screenWidth）
        val currentCriterionViewLength = timebarTickCriterionMap[currentTVideoTimelineTickCriterionIndex]!!.viewLength
        val currentViewLength = width - screenWidth
        if (currentViewLength == currentCriterionViewLength) {
            if (zoomIn) {
                val newCriteriaIndex = currentTVideoTimelineTickCriterionIndex - 1
                if (newCriteriaIndex < ZOOMMIN || newCriteriaIndex > ZOOMMAX) {
                    return
                } else {
                    currentTVideoTimelineTickCriterionIndex = newCriteriaIndex
                    val newWidth = timebarTickCriterionMap[newCriteriaIndex]!!.viewLength
                    justScaledByPressingButton = true
                    val params = layoutParams
                    params.width = newWidth
                    layoutParams = params
                }
            } else {
                val newCriteriaIndex = currentTVideoTimelineTickCriterionIndex + 1
                // TLog.d("newCriteriaIndex", newCriteriaIndex + "");
                if (newCriteriaIndex > ZOOMMAX || newCriteriaIndex >= timebarTickCriterionCount) {
                    return
                } else {
                    currentTVideoTimelineTickCriterionIndex = newCriteriaIndex
                    val newWidth = timebarTickCriterionMap[newCriteriaIndex]!!.viewLength
                    justScaledByPressingButton = true
                    val params = layoutParams
                    params.width = newWidth
                    layoutParams = params
                }
            }
        } else {
            if (currentViewLength > currentCriterionViewLength) {
                if (zoomIn) {
                    val newCriteriaIndex = currentTVideoTimelineTickCriterionIndex - 1
                    if (newCriteriaIndex < 0) {
                        return
                    } else {
                        currentTVideoTimelineTickCriterionIndex = newCriteriaIndex
                        val newWidth = timebarTickCriterionMap[newCriteriaIndex]!!.viewLength
                        justScaledByPressingButton = true
                        val params = layoutParams
                        params.width = newWidth
                        layoutParams = params
                    }
                } else {
                    val newWidth = timebarTickCriterionMap[currentTVideoTimelineTickCriterionIndex]!!.viewLength
                    justScaledByPressingButton = true
                    val params = layoutParams
                    params.width = newWidth
                    layoutParams = params
                }
            } else {
                if (zoomIn) {
                    val newWidth = timebarTickCriterionMap[cur


osition should be specified in logical units (not physical pixels).
    ///
    /// The scale determines the size of the text (where 1.0 is 8 pixels high). The position is the
    /// location on the window from the upper-left corner. The color is in RGBA format (alpha
    /// blending is supported).
    pub fn draw<DrawSurface: glium::Surface>(
        &self,
        display: &glium::Display,
        target: &mut DrawSurface,
        txt: &[u8],
        scale: f32,
        pos: [f32; 2],
        color: [f32; 4],
    ) {
        let win_size = display.get_context().get_framebuffer_dimensions();

        // Adjust for DPI factor
        let hidpi_factor = display.gl_window().window().scale_factor() as f32;
        let scale = scale * hidpi_factor;
        let pos = [pos[0] * hidpi_factor, pos[1] * hidpi_factor];

        let transform = {
            // Scale and translate values
            let (w, h) = (win_size.0 as f32, win_size.1 as f32);
            let xs: f32 = 2.0 / w;
            let xt: f32 = -w / 2.0;
            let ys: f32 = -2.0 / h;
            let yt: f32 = -h / 2.0;

            [
                [xs, 0.0, 0.0, xt * xs],
                [0.0, ys, 0.0, yt * ys],
                [0.0, 0.0, 1.0, 0.0],
                [0.0, 0.0, 0.0, 1.0],
            ]
        };

        let uniforms = uniform! {
            matrix: transform,
            ascii_texture: glium::uniforms::Sampler::new(&self.ascii_texture)
                .magnify_filter(glium::uniforms::MagnifySamplerFilter::Nearest)
                .minify_filter(glium::uniforms::MinifySamplerFilter::Nearest),
        };

        let mut draw_params: glium::draw_parameters::DrawParameters = Default::default();
        draw_params.blend = glium::Blend::alpha_blending();

        let mut vertex_data = Vec::with_capacity(4 * txt.len());
        let mut index_data = Vec::with_capacity(6 * txt.len());

        let dim = scale * 8.0;
        let next_char = scale * 9.0;
        let mut x = pos[0];
        let mut y = pos[1];
        for glyph in txt {
            if *glyph == b'\n' {
                // Newline
                x = pos[0];
                y += next_char;
            } else {
                add_glyph(
                    &mut vertex_data,
                    &mut index_data,
                    *glyph,
                    dim,
                    [x, y],
                    color,
                );
                x += next_char;
            }
        }

        let vertex_buffer = glium::VertexBuffer::immutable(display, &vertex_data)
            .expect("Failed to create ASCII vertex buffer");
        let indices = glium::index::IndexBuffer::immutable(
            display,
            glium::index::PrimitiveType::TrianglesList,
            &index_data,
        )
        .expect("Failed to create ASCII index buffer");

        target
            .draw(
                &vertex_buffer,
                &indices,
                &self.ascii_program,
                &uniforms,
                &draw_params,
            )
            .expect("Failed to render ASCII text");
    }
}

fn add_glyph(
    vertex_data: &mut Vec<AsciiVertex>,
    index_data: &mut Vec<u32>,
    glyph: u8,
    dim: f32,
    pos: [f32; 2],


u723E" },
            { "SO", "\u7D22\u99AC\u5229\u4E9E" },
            { "SR", "\u8607\u5229\u5357" },
            { "ST", "\u8056\u591A\u7F8E" },
            { "SV", "\u85A9\u723E\u74E6\u591A" },
            { "SY", "\u6558\u5229\u4E9E" },
            { "SZ", "\u53F2\u74E6\u6FDF\u862D" },
            { "Samr", "\u6492\u99AC\u5229\u4E9E\u6587" },
            { "Sara", "\u6C99\u62C9\u5824\u6587" },
            { "Sarb", "\u5357\u963F\u62C9\u4F2F\u53E4\u6587" },
            { "Saur", "\u7D22\u62C9\u4EC0\u7279\u62C9\u6587" },
            { "Sgnw", "\u624B\u8A9E\u66F8\u5BEB\u7B26\u865F" },
            { "Shaw", "\u7C2B\u67CF\u7D0D\u5B57\u7B26" },
            { "Sind", "\u4FE1\u5FB7\u6587" },
            { "Sinh", "\u932B\u862D\u6587" },
            { "Sund", "\u5DFD\u4E39\u6587" },
            { "Sylo", "\u5E0C\u6D1B\u5F1F\u7D0D\u683C\u91CC\u6587" },
            { "Syrc", "\u6558\u5229\u4E9E\u6587" },
            { "Syre", "\u6558\u5229\u4E9E\u6587 (\u798F\u97F3\u9AD4\u6587\u5B57\u8B8A\u9AD4)" },
            { "Syrj", "\u6558\u5229\u4E9E\u6587 (\u897F\u65B9\u6587\u5B57\u8B8A\u9AD4)" },
            { "Syrn", "\u6558\u5229\u4E9E\u6587 (\u6771\u65B9\u6587\u5B57\u8B8A\u9AD4)" },
            { "TC", "\u571F\u514B\u65AF\u548C\u958B\u5361\u65AF\u7FA4\u5CF6" },
            { "TD", "\u67E5\u5FB7" },
            { "TF", "\u6CD5\u570B\u5357\u65B9\u9818\u5730" },
            { "TG", "\u591A\u54E5" },
            { "TH", "\u6CF0\u570B" },
            { "TJ", "\u5854\u5409\u514B" },
            { "TK", "\u6258\u514B\u52DE\u7FA4\u5CF6" },
            { "TL", "\u6771\u5E1D\u6C76" },
            { "TM", "\u571F\u5EAB\u66FC" },
            { "TN", "\u7A81\u5C3C\u897F\u4E9E" },
            { "TO", "\u6771\u52A0" },
            { "TR", "\u571F\u8033\u5176" },
            { "TT", "\u5343\u91CC\u9054\u53CA\u6258\u5DF4\


:
        if config.PROCESSED_DATA_FILE_PATH.exists():
            df_processed = pd.read_csv(config.PROCESSED_DATA_FILE_PATH)
            st.dataframe(df_processed.head())

            st.markdown("### Statistiques descriptives")
            st.dataframe(df_processed.describe())

            if not df_processed.empty:
                import matplotlib.pyplot as plt
                st.markdown(f"### Distribution de la cible ({config.TARGET_COLUMN})")
                fig_hist, ax_hist = plt.subplots()
                ax_hist.hist(df_processed[config.TARGET_COLUMN], bins=50, edgecolor='k', color='skyblue')
                ax_hist.set_title(f'Distribution de {config.TARGET_COLUMN}')
                ax_hist.set_xlabel(config.TARGET_COLUMN)
                ax_hist.set_ylabel('Fréquence')
                st.pyplot(fig_hist)

                st.markdown(f"### {config.TARGET_COLUMN} vs. Irradiation Corrigée ({config.FEATURE_COLUMNS[2]})")
                fig_scatter, ax_scatter = plt.subplots()
                ax_scatter.scatter(df_processed[config.FEATURE_COLUMNS[2]], df_processed[config.TARGET_COLUMN], alpha=0.5, color='coral')
                ax_scatter.set_title(f'{config.TARGET_COLUMN} vs. {config.FEATURE_COLUMNS[2]}')
                ax_scatter.set_xlabel(config.FEATURE_COLUMNS[2])
                ax_scatter.set_ylabel(config.TARGET_COLUMN)
                st.pyplot(fig_scatter)
        else:
            st.warning(f"Le fichier de données traitées '{config.PROCESSED_DATA_FILE_PATH.name}' n'a pas été trouvé. "
                       "Exécutez d'abord le script de prétraitement.")
    except Exception as e:
        st.error(f"Erreur lors de l'affichage des données traitées: {e}")
        st.exception(e)

st.sidebar.markdown("---")
st.sidebar.info("""
**Note:** Ce projet est un prototype. Les modèles et les prédictions sont basés sur les données fournies et la configuration actuelle.
Les seuils pour les contraintes physiques dans le PINN nécessitent un ajustement fin.
""")


 Datatype('TreeList')
    Tree = Datatype('Tree')
    Tree.declare('leaf', ('val', IntSort()))
    Tree.declare('node', ('left', TreeList), ('right', TreeList))
    TreeList.declare('nil')
    TreeList.declare('cons', ('car', Tree), ('cdr', TreeList))

    Tree, TreeList = CreateDatatypes(Tree, TreeList)

    t1 = Tree.leaf(10)
    tl1 = TreeList.cons(t1, TreeList.nil)
    t2 = Tree.node(tl1, TreeList.nil)
    print(t2)  # node(cons(leaf(10), nil), nil)
    print(simplify(Tree.val(t1)))  # 10

    t1, t2, t3 = Consts('t1 t2 t3', TreeList)
    solve(Distinct(t1, t2, t3))  # [t2 = cons(leaf(1), nil), t1 = nil, t3 = cons(leaf(2), nil)]

```

## 5、未解释的排序（Uninterpreted Sorts）

纯一阶逻辑中的功能和常数符号未解释或自由表示，这意味着没有附加先验解释。
这与算术运算符（例如+和-）具有固定的标准解释相反。
未解释的函数和常量具有最大的灵活性； 它们允许进行任何与函数或常量约束一致的解释。

为了说明未解释的函数和常量，让我们引入一个（未解释的）排序A，常量x，y遍及A。
最后，使f为一个未解释的函数，它接受一个A类型的参数，并得出A值。
该示例说明了如何强制解释，其中对x两次应用f会再次导致x，但是对x一次应用f与x不同。

```python
# 示例81
from z3 import *

if __name__ == "__main__":
    A = DeclareSort('A')
    x, y = Consts('x y', A)
    f = Function('f', A, A)

    s = Solver()
    s.add(f(f(x)) == x, f(x) == y, x != y)

    print(s.check())  # sat
    m = s.model()
    print(m)
    # [x = A!val!0,
    # y = A!val!1,
    # f = [A!val!1 -> A!val!0, else -> A!val!1]]
    print("interpretation assigned to A:")
    print(m[A])  # [A!val!0, A!val!1]

```

最终的模型为A中的元素引入了抽象值，因为未解释排序A。
模型中对f的解释在x和y的两个值之间切换，这两个值是不同的。
**表达式m [A]返回模型m中未解释的类别A的解释（Universe）。**

## 6、量词

Z3可以解决包含算术，位向量，布尔值，数组，函数和数据类型在内的**无量纲问题。**
Z3还接受并可以使用**使用量词的公式**。
一般而言，它不再是此类公式的决策程序（并且由于充分的原因，因为一阶逻辑可能没有决策程序）。

```python
# 示例82
from z3 import *

if


--マドルチェ・バトラスク
function c48252330.initial_effect(c)
	--to deck
	local e1=Effect.CreateEffect(c)
	e1:SetDescription(aux.Stringid(48252330,0))
	e1:SetCategory(CATEGORY_TODECK)
	e1:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_F)
	e1:SetCode(EVENT_TO_GRAVE)
	e1:SetCondition(c48252330.retcon)
	e1:SetTarget(c48252330.rettg)
	e1:SetOperation(c48252330.retop)
	c:RegisterEffect(e1)
	--search
	local e2=Effect.CreateEffect(c)
	e2:SetDescription(aux.Stringid(48252330,1))
	e2:SetCategory(CATEGORY_TOHAND+CATEGORY_SEARCH)
	e2:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_O)
	e2:SetCode(EVENT_SUMMON_SUCCESS)
	e2:SetCondition(c48252330.shcon)
	e2:SetTarget(c48252330.shtg)
	e2:SetOperation(c48252330.shop)
	c:RegisterEffect(e2)
end
function c48252330.retcon(e,tp,eg,ep,ev,re,r,rp)
	return e:GetHandler():IsReason(REASON_DESTROY) and e:GetHandler():GetReasonPlayer()==1-tp
		and e:GetHandler():IsPreviousControler(tp)
end
function c48252330.rettg(e,tp,eg,ep,ev,re,r,rp,chk)
	if chk==0 then return true end
	Duel.SetOperationInfo(0,CATEGORY_TODECK,e:GetHandler(),1,0,0)
end
function c482523


>

Ŀһ

ʱ10/ȼ

־ͨЧ(޺)

ܿ(޺)

ܵ9

ĿڶԿܻ(ͳȻЧ)ʱĻ+3ֵ

ÿ֧3ܵ㣬ܵĶֵ1

(PROTECTION FROM SPELLS, PSIONIC)

ϵ

ȼħ8

ʱ׼

Ӵ

ĿӴ

ʱ10/ȼ

־ͨЧ(޺)

ܿ(޺Ʒ)

ܵ15

ͬ(PHB 266)עڴˡ

ÿ֧4ܵ㣬ԶӰһ

(PSYCHIC CONTAINMENT)

鸽ħϵ(в)[Ӱ]

ȼʿ/3

ʱ׼

(25+5/2ȼ)

Ŀһ

ʱ1/ȼ

־ͨЧ

ܿ

ܵ5

ʱֹһʹܻͷԣ֮佨һϱڡ(κѾչֵܽ糣ЧҪרעά֡ڴܳڼ䲻չµܡ)ÿֿԻһֶͻϱڣ½һλ춨ػչܵͨƵЧֹ

ÿ֧1ܵ㣬ԶӰһ

䵶(PSYCHIC SCIMITAR)

ϵ

ȼʿ/2

Ӿ

ʱ׼

о(100+10/ȼ)

Чһ

ʱ1/ȼ(ɽ)

ܿ

ܵ3

Դһѷʵ䵶Թ˻򽫵ͼܴԶչִܣʧȥ2ֵ(ԼĽܵ)ܽ»(ʹ䱻ɹ)䵶ݻ٣ʧȥԵ㽫޷ػ񣬴£ʧȥֵΪ˺

չִʱ䵶Сָ䵶Ҫһ׼һӵΧڵ˵䵶̴ʧڸ֣߳ˣ䵶Զĵˡͨ䵶ĹǽսӴĽսӴж+2ֵ䵶ΪһͨΪ䵶�


666, 16)
	if !a.NoError(err) {
		return
	}
	defer func(s *Semaphore) {
		a.NoError(s.Close())
		a.NoError(DestroySemaphore(testSemaName))
	}(s)
	var wg sync.WaitGroup
	wg.Add(16)
	for i := 0; i < 16; i++ {
		go func() {
			s.Wait()
			wg.Done()
		}()
	}
	wg.Wait()
}

func TestSemaCount2(t *testing.T) {
	a := assert.New(t)
	if !a.NoError(DestroySemaphore(testSemaName)) {
		return
	}
	s, err := NewSemaphore(testSemaName, os.O_CREATE|os.O_EXCL, 0666, 0)
	if !a.NoError(err) {
		return
	}
	defer func(s *Semaphore) {
		a.NoError(s.Close())
		a.NoError(DestroySemaphore(testSemaName))
	}(s)
	var wg sync.WaitGroup
	wg.Add(16)
	for i := 0; i < 16; i++ {
		go func() {
			s.Wait()
			wg.Done()
		}()
		s.Signal(1)
	}
	wg.Wait()
}

func TestTimedSema(t *testing.T) {
	a := assert.New(t)
	if !a.NoError(DestroySemaphore(testSemaName)) {
		return
	}
	s, err := NewSemaphore(testSemaName, os.O_CREATE|os.O_EXCL, 0666, 1)
	if !a.NoError(err) {
		return
	}
	defer func(s *Semaphore) {
		a.NoError(s.Close())
		a.NoError(DestroySemaphore(testSemaName))
	}(s)
	s.Wait()
	a.False(s.WaitTimeout(time.Millisecond * 50))
}

func TestSemaSignalAnotherProcess(t *testing.T) {
	a := assert.New(t)
	if !a.NoError(DestroySemaphore(testSemaName)) {
		return
	}
	s, err := NewSemaphore(testSemaName, os.O_CREATE|os.O_EXCL, 0666, 0)
	if !a.NoError(err) {
		return
	}
	defer func(s *Semaphore) {
		a.NoError(s.Close())
		a.NoError(DestroySemaphore(testSemaName))
	}(s)
	ch := make(chan struct{})
	go func() {
		s.Wait()
		s.Wait()
		ch <- struct{}{}
	}()
	args := argsForSemaSignalCommand(testSemaName, 2)
	result := testutil.RunTestApp(args, nil)
	if !a.NoError(result.Err) {
		t.Logf("test app error. the output is: %s", result.Output)
		return
	}
	select {
	case <-ch:
	case <-time.After(time.Second * 3):
		t.Errorf("timeout")
	}
}

func TestSemaWaitAnotherProcess(t *testing.T) {
	a := assert.New(t)
	if !a.NoError(DestroySemaphore(testSemaName)) {
		return
	}
	s, err := NewSemaphore(testSemaName, os.O_CREATE|os.O_EXCL, 0666, 0)
	if !a.NoError(err) {
		return
	}
	defer func(s *Semaphore) {
		a.NoError(s.Close())
		a.NoError(DestroySemaphore(testSemaName))
	}(s)
	args := argsForSemaWaitCommand(testSemaName, -1)
	killCh := make(chan bool, 1)
	resultCh := testutil.RunTestAppAsync(args, killCh)
	s.Signal(1)
	select {
	case result := <-resultCh:
		if !a.NoError(result.Err) {
			t.Logf("test app error. the ou


using System.Linq;
using JetBrains.ProjectModel;
using JetBrains.ReSharper.Psi;
using JetBrains.ReSharper.UnitTestFramework;
using JetBrains.ReSharper.UnitTestFramework.Elements;
using JetBrains.ReSharper.UnitTestFramework.Execution;
using JetBrains.ReSharper.UnitTestFramework.Execution.Hosting;
using JetBrains.Util.Dotnet.TargetFrameworkIds;

namespace ReSharperPlugin.ReqnrollRiderPlugin.UnitTestExplorers;

[UnitTestProvider]
public class ReqnrollUnitTestProvider : IUnitTestProvider
{
    public string ID => "REQNROLL";
    public string Name  => "Reqnroll";

    public bool IsElementOfKind(IDeclaredElement declaredElement, UnitTestElementKind elementKind)
    {
        throw new System.NotImplementedException();
    }
    public bool IsElementOfKind(IUnitTestElement element, U


: #fff;
$theme-green-navbar-brand_focus: #fff;
$theme-green-nav-anchor: #fff;
$theme-green-nav-anchor_hover: rgba(0,0,0,0);
$theme-green-nav-anchor_focus: rgba(0,0,0,0);
$theme-green-nav-anchor-opened: rgba(0,0,0,0);
$theme-green-nav-anchor-opened_hover: rgba(0,0,0,0);
$theme-green-nav-anchor-opened_focus: rgba(0,0,0,0);
$theme-green-menu-list-active: rgba(0,0,0,0);
$theme-green-menu-list-toggled: rgba(0,0,0,0);
$theme-green-menu-list-submenu: rgba(0,0,0,0);

//Theme Light Green
$theme-light-green: #8BC34A;
$theme-light-green-legal-bg: #fff;
$theme-light-green-bar: #fff;
$theme-light-green-navbar-brand: #fff;
$theme-light-green-navbar-brand_active: #fff;
$theme-light-green-navbar-brand_hover: #fff;
$theme-light-green-navbar-brand_focus: #fff;
$theme-light-green-nav-anchor: #fff;
$theme-light-green-nav-anchor_hover: rgba(0,0,0,0);
$theme-light-green-nav-anchor_focus: rgba(0,0,0,0);
$theme-light-green-nav-anchor-opened: rgba(0,0,0,0);
$theme-light-green-nav-anchor-opened_hover: rgba(0,0,0,0);
$theme-light-green-nav-anchor-opened_focus: rgba(0,0,0,0);
$theme-light-green-menu-list-active: rgba(0,0,0,0);
$theme-light-green-menu-list-toggled: rgba(0,0,0,0);
$theme-light-green-menu-list-submenu: rgba(0,0,0,0);

//Theme Lime
$theme-lime: #CDDC39;
$theme-lime-legal-bg: #fff;
$theme-lime-bar: #fff;
$theme-lime-navbar-brand: #fff;
$theme-lime-navbar-brand_active: #fff;
$theme-lime-navbar-brand_hover: #fff;
$theme-lime-navbar-brand_focus: #fff;
$theme-lime-nav-anchor: #fff;
$theme-lime-nav-anchor_hover: rgba(0,0,0,0);
$theme-lime-nav-anchor_focus: rgba(0,0,0,0);
$theme-lime-nav-anchor-opened: rgba(0,0,0,0);
$theme-lime-nav-anchor-opened_hover: rgba(0,0,0,0);
$theme-lime-nav-anchor-opened_focus: rgba(0,0,0,0);
$theme-lime-menu-list-active: rgba(0,0,0,0);
$theme-lime-menu-list-toggled: rgba(0,0,0,0);
$theme-lime-menu-list-submenu: rgba(0,0,0,0);

//Theme Yellow
$theme-yellow: #FFEB3B;
$theme-yellow-legal-bg: #fff;
$theme-yellow-bar: #fff;
$theme-yellow-navbar-brand: #fff;
$theme-yellow-navbar-brand_active: #fff;
$theme-yellow-navbar-brand_hover: #fff;
$theme-yellow-navbar-brand_focus: #fff;
$theme-yellow-nav-anchor: #fff;
$theme-yellow-nav-anchor_hover: rgba(0,0,0,0);
$theme-yellow-nav-anchor_focus: rgba(0,0,0,0);
$theme-yell


       = Body_Start + 45,
		Body_RightHandThumbMetacarpal    = Body_Start + 46,
		Body_RightHandThumbProximal      = Body_Start + 47,
		Body_RightHandThumbDistal        = Body_Start + 48,
		Body_RightHandThumbTip           = Body_Start + 49,
		Body_RightHandIndexMetacarpal    = Body_Start + 50,
		Body_RightHandIndexProximal      = Body_Start + 51,
		Body_RightHandIndexIntermediate  = Body_Start + 52,
		Body_RightHandIndexDistal        = Body_Start + 53,
		Body_RightHandIndexTip           = Body_Start + 54,
		Body_RightHandMiddleMetacarpal   = Body_Start + 55,
		Body_RightHandMiddleProximal     = Body_Start + 56,
		Body_RightHandMiddleIntermediate = Body_Start + 57,
		Body_RightHandMiddleDistal       = Body_Start + 58,
		Body_RightHandMiddleTip          = Body_Start + 59,
		Body_RightHandRingMetacarpal     = Body_Start + 60,
		Body_RightHandRingProximal       = Body_Start + 61,
		Body_RightHandRingIntermediate   = Body_Start + 62,
		Body_RightHandRingDistal         = Body_Start + 63,
		Body_RightHandRingTip            = Body_Start + 64,
		Body_RightHandLittleMetacarpal   = Body_Start + 65,
		Body_RightHandLittleProximal     = Body_Start + 66,
		Body_RightHandLittleIntermediate = Body_Start + 67,
		Body_RightHandLittleDistal       = Body_Start + 68,
		Body_RightHandLittleTip          = Body_Start + 69,
		Body_End                         = Body_Start + 70,

        // add new bones here
        Max = ((int)Hand_End > (int)Body_End) ? (int)Hand_End : (int)Body_End,
    }

	public enum HandFinger
	{
		Thumb = 0,
		Index = 1,
		Middle = 2,
		Ring = 3,
		Pinky = 4,
		Max = 5,
	}

	[Flags]
	public enum HandFingerPinch
	{
		Thumb  = (1 << HandFinger.Thumb),
		Index  = (1 << HandFinger.Index),
		Middle = (1 << HandFinger.Middle),
		Ring   = (1 << HandFinger.Ring),
		Pinky  = (1 << HandFinger.Pinky),
	}

	[StructLayout(LayoutKind.Sequential)]
	public struct HandState
	{
		public HandStatus Status;
		public Posef RootPose;
		public Quatf[] BoneRotations;
		public HandFingerPinch Pinches;
		public float[] PinchStrength;
		public Posef PointerPose;
		public float HandScale;
		public TrackingConfidence HandConfidence;
		public TrackingConfidence[] FingerConfidences;
		public double RequestedTimeStamp;
		public double SampleTimeStamp;
	}

	[StructLayout(LayoutKind.Sequential)]
	private struct HandStateInternal
	{
		public HandStatus Status;
		public Posef RootPose;
		public Quatf BoneRotations_0;
		public Quatf BoneRotations_1;
		public Quatf BoneRotations_2;
		public Quatf BoneRotations_3;
		public Quatf BoneRotations_4;
		public Quatf BoneRotations_5;
		public Quatf BoneRotations_6;
		public Quatf BoneRotations_7;
		public Quatf BoneRotations_8;
		public Quatf BoneRotations_9;
		public Quatf BoneRotations_10;
		public Quatf BoneRotations_11;
		public Quatf BoneRotations_12;
		public Quatf BoneRotations_13;
		public Quatf BoneRotations_14;
		public Quatf BoneRotations_15;
		public Quatf BoneRotations_16;
		public Quatf BoneRotations_17;
		public Quatf BoneRotations_18;
		public Quatf BoneRotations_19;
		public Quatf BoneRotations_20;
		public Quatf BoneRotations


85,46.58},{25.48,53.76},{56.17,53.94},{41.01,36.05},{27.47,73.3},{18.37,51.21},{38.01,83.9},{54.73,56.29},{48.84,29.23},{19.75,50.43},{38.38,44.22},{45.4,78.92},{18.34,50.95},{36.29,75.15},{56.54,54.68},{45.74,29.62},{59.25,41.35},{28.57,75.61},{54.32,55.97},{47.72,28.85},{42.81,30.52},{31.62,61.09},{45.83,58.89}}},1537},
[208872] = {"Cask of Drugan's IPA",nil,nil,{[1]={{53.96,50.72}}},1},
[208874] = {"Fly Covered \"Meat\"",nil,nil,{[1497]={{57.15,16.05},{56.84,16.1},{56.81,17.29},{56.68,15.91},{68.66,53.59},{68.46,53.27}}},1497},
[208875] = {"Mulgore Pine Cone",nil,nil,{[1638]={{46.05,54.32},{49.19,61.74},{37.92,55.69},{36.42,67.65},{45.05,67.64},{44.14,50.92},{48.87,63.72},{48.01,63.04},{48.54,62.16},{49.62,55.62},{48.46,52.84},{49.08,55.36}}},1638},
[208876] = {"Fly Covered \"Meat\"",nil,nil,{[1497]={{56.68,16.05},{57.1,17.13},{56.81,15.85},{68.57,52.59},{69.22,52.43}}},1497},
[208878] = {"\"Magic\" Mushroom",nil,nil,{[1638]={{24.51,14.09},{22.8,21.39},{24.08,14.63},{27.68,18.52},{23.4,15.53},{23.73,18.46},{26.34,17.73},{29.13,22.43},{24.53,23.14},{21.37,18.95},{24.73,14.85},{26.38,21.94},{26.44,22.64},{23.47,13.76},{26.39,24},{21.43,18.53},{29.13,22.64},{24.71,21.49},{26.57,17.98},{23.6,15.51},{27.18,16.04},{27.26,25.47},{27.43,18.1},{26.12,23.95},{22.61,21.83},{22.98,13.02}}},1638},
[208880] = {"Corn Kernels",nil,nil,{[1638]={{44.73,63.33},{36.82,65.02},{41.35,65.01},{50.39,55.99},{44.9,56.15},{38.54,65.35},{47.13,67.09},{42.27,62.39}}},1638},
[208887] = {"Mulgore Sweet Potatoes",nil,nil,{[1638]={{47.87,42.73}}},1638},
[208888] = {"Savory Spice Herbs",nil,nil,{[1638]={{49.72,42.07}}},1638},
[208889] = {"Fresh-Caught Fish",nil,nil,{[1638]={{56.01,44.49}}},1638},
[208890] = {"Fresh-Hunted Fowl",nil,nil,{[1638]={{51.1,46.93}}},1638},
[208900] = {"Portal to the Firelands",nil,nil,{[616]={{27.49,56.33}}},616},
[208903] = {"A big fire",nil,nil,{[33]={{38.12,49.85}}},33},
[208935] = {"Wickerman Campfire",nil,nil,nil,0},
[208948] = {"Guild Vault",n


Removed(
        sender: ObservableList<T>,
        positionStart: Int,
        itemCount: Int
    ) {
        adapter.notifyItemRangeRemoved(positionStart, itemCount)
    }

}import com.vanniktech.maven.publish.AndroidSingleVariantLibrary
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile

plugins {
    alias(libs.plugins.android.library)
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.maven.publish)
    id("maven-publish")
    id("signing")
}

val signingKeyId = properties["signing.keyId"]?.toString()

android {
    namespace = "github.leavesczy.monitor"
    compileSdk = 36
    defaultConfig {
        minSdk = 21
        consumerProguardFiles.add(File("consumer-rules.pro"))
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }
    tasks.withType<KotlinJvmCompile>().configureEach {
        compilerOptions {
            jvmTarget.set(JvmTarget.JVM_11)
        }
    }
}

dependencies {
    compileOnly(libs.squareup.okHttp)
}

if (signingKeyId == null) {
    publishing {
        publications {
            create<MavenPublication>("release") {
                afterEvaluate {
                    from(components["release"])
                }
            }
        }
    }
} else {
    mavenPublishing {
        publishToMavenCentral()
        signAllPublications()
        configure(platform = AndroidSingleVariantLibrary())
        coordinates(
            groupId = "io.github.leavesczy",
            artifactId = "monitor-no-op",
            version = libs.versions.monitor.get()
        )
        pom {
            name = "Monitor"
            description = "An Http inspector for OkHttp & Retrofit"
            inceptionYear = "2025"
            url = "https://github.com/leavesCZY/Monitor"
            licenses {
                license {
                    name = "The Apache License, Version 2.0"
                    url = "https://www.apache.org/licenses/LICENSE-2.0.txt"
                    distribution = "https://www.apache.org/licenses/LICENSE-2.0.txt"
                }
            }
            developers {
                developer {
                    id = "leavesCZY"
                    name = "leavesCZY"
                    url = "https://github.com/leavesCZY"
                }
            }
            scm {
                url = "https://github.com/leavesCZY/Monitor"
                connection = "scm:git:git://github.com/leavesCZY/Monitor.git"
                developerConnection = "scm:git:ssh://git@github.com/leavesCZY/Monitor.git"
            }
        }
    }
}package github.leavesczy.monitor.internal.db

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import github.leavesczy.monitor.internal.ContextProvider
import java.util.concurrent.TimeUnit

/**
 * @Author: leavesCZY
 * @Date: 2020/11/8 14:43
 * @Desc:
 */
@Database(
    entities = [Monitor::class],
    version = 42
)
@TypeConverters(value = [MonitorTypeConverter::class])
internal abstract class MonitorDatabase : RoomDatabase() {

    companion object {

        private const val MONITOR_DATABASE_NAME = "Monitor"

        const val MONITOR_TABLE_NAME = "Monitor"

        private var monitorDatabase: MonitorDatabase? = null

        val instance: MonitorDatabase
            get() {
                return monitorDatabase ?: synchronized(lock = MonitorDatabase::class.java) {
                    val cache = monitorDatabase
                    if (cache != null) {
                        return@synchronized cache
                    }
                    val db = createDb(context = ContextProvider.context)


 slope = (platform.end.y - platform.start.y) / (platform.end.x - platform.start.x);
						num yInt = platform.start.y - slope * platform.start.x;
						num lineY = slope * x + yInt;

						top = lineY - currentStreet.groundY;
						yVel = 0;

						break;
					}
				}
			}

			z = z.clamp(0, streetZ);

			updateAnimation(dt);
			updateTransform();

			//update the _entityRect so that other entities know if the player is colliding with them
			_entityRect
				..left = left
				..top = top
				..width = width
				..height = height;

			// If following a player, go to them
			if (id == CurrentPlayer.id && followingPlayer != null) {
				// Turn to face the same direction
				facingRight = followingPlayer.facingRight;

				// Copy their animation state
				updateAnimation(dt, followingPlayer.currentAnimation.animationName);

				// Go to their X coordinate (+/- a body width or so if on a platform)
				num xOffset = (followingPlayer.climbing ? 0 : (facingRight ? -1 : 1) * _entityRect.width);
				left = followingPlayer.left + xOffset;

				// Go to their Y coordinate (if not on a platform)
				if (followingPlayer.jumping || followingPlayer.climbing) {
					top = followingPlayer.top;
				}
			}
		}

		super.update(dt);
	}

	void updateLadderStatus(double dt) {
		if (doPhysicsApply && inputManager.upKey.active) {
			// moving up

			bool found = false;
			Rectangle playerRect = new Rectangle(left + width / 3, top + currentStreet.groundY, width / 3 , height - 15);
			for (Ladder ladder in currentStreet.ladders) {
				if (intersect(ladder.bounds, playerRect)) {
					// touching a ladder

					if (playerRect.top + playerRect.height < ladder.bounds.top) {
						//if our feet are above the ladder, stop climbing
						break;
					}

					top -= physics.speed / 4 * dt;
					climbingUp = true;
					activeClimb = true;
					jumping = false;
					found = true;
					break;
				}
			}

			if (!found) {
				// not touching a ladder
				climbingUp = false;
				climbingDown = false;
				activeClimb = false;
			}
		}

		if (doPhysicsApply && inputManager.downKey.active) {
			// moving down

			bool found = false;
			Rectangle playerRect = new Rectangle(left, top + currentStreet.groundY, width, height);

			for (Ladder ladder in currentStreet.ladders) {
				if (intersect(ladder.bounds, playerRect)) {
					// touching a ladder

					if (playerRect.top + playerRect.height > ladder.bounds.top + ladder.bounds.height) {
						//if our feet are below the ladder, stop climbing
						break;
					}

					top += physics.speed / 4 * dt;
					climbingDown = true;
					activeClimb = true;
					jumping = false;
					found = true;
					break;
				}
			}

			if (!found) {
				// not touching a ladder
				climbingDown = false;
				climbingUp = false;
				activeClimb = false;
			}
		}

		if (inputManager.rightKey.active || inputManager.leftKey.active) {
			// left or right on a ladder
			Rectangle playerRect = new Rectangle(left, top + currentStreet.groundY, width + 20, height + 20);

			for (Ladder ladder in currentStreet.ladders) {
				if (!intersect(ladder.bounds, playerRect)) {
					climbingDown = false;
					climbingUp = false;
					activeClimb = false;
				}
			}
		}
	}

	void updateAnimation(double dt, [String overrid


                      <big>Click or scan to see
this page online</big>

                  from the Oyamel forest to the Low Deciduous Forest. As for fauna, there are 237 species of birds, 60 of mammals and 45 of reptiles.

During your visit you can appreciate the natural beauty of this Park, which is incorporated into the "Chichinautzin Biological Corridor" and ranges from the Lagunas de Zempoala National Park to the northern area of the municipality of Atlatlahucan. The mountainous characteristics of the area have stimulated the isolation of animal and plant species, however, in this area there are 64 at risk.
 With your help we keep this site.

Topics. This historical marker  is listed in these topic lists: Environment • Parks & Recreational Areas. A significant historical date for this entry is January 22, 1937.

Location. 18° 59.166′ N, 99° 6.076′ W. Marker is in Tepoztlán, Morelos. Marker is on 5 de Mayo just south of Avenida Ignacio Zaragoza, on the right when traveling south.  Touch for map.  Marker is  at or near this postal address: 5 de Mayo 14, Tepoztlán MOR 62520, Mexico.  Touch for directions.

Other nearby markers. At least 8 other markers are within 16 kilometers of this marker, measured as the crow flies. First City Council of Tepoztlán (within shouting distance of this marker); Temple of Tezcatlipoca (approx. 14.1 kilometers away); Teopanzolco (approx. 14.1 kilometers away); Temples of Tlaloc and Huitilopochtli (approx. 14.2 kilometers away); The Temple of Ehécatl

Photographed By J.


N() or Settings.Commons.Enabled.Potions then
      local ShouldReturn = CDs(); if ShouldReturn then return ShouldReturn; end
    end
    -- call_action_list,name=trinkets
    if Settings.Commons.Enabled.Trinkets or Settings.Commons.Enabled.Items then
      local ShouldReturn = Trinkets(); if ShouldReturn then return ShouldReturn; end
    end
    if S.BlackArrow:IsAvailable() then
      -- call_action_list,name=drst,if=talent.black_arrow&(active_enemies<2|!talent.beast_cleave&active_enemies<3)
      if PetEnemiesMixedCount < 2 or not S.BeastCleave:IsAvailable() and PetEnemiesMixedCount < 3 then
        local ShouldReturn = DRST(); if ShouldReturn then return ShouldReturn; end
      end
      -- call_action_list,name=drcleave,if=talent.black_arrow&(active_enemies>2|talent.beast_cleave&active_enemies>1)
      if PetEnemiesMixedCount > 2 or S.BeastCleave:IsAvailable() and PetEnemiesMixedCount > 1 then
        local ShouldReturn = DRCleave(); if ShouldReturn then return ShouldReturn; end
      end
    else
      -- call_action_list,name=st,if=!talent.black_arrow&(active_enemies<2|!talent.beast_cleave&active_enemies<3)
      if PetEnemiesMixedCount < 2 or not S.BeastCleave:IsAvailable() and PetEnemiesMixedCount < 3 then
        local ShouldReturn = ST(); if ShouldReturn then return ShouldReturn; end
      end
      -- call_action_list,name=cleave,if=!talent.black_arrow&(active_enemies>2|talent.beast_cleave&active_enemies>1)
      if PetEnemiesMixedCount > 2 or S.BeastCleave:IsAvailable() and PetEnemiesMixedCount > 1 then
        local ShouldReturn = Cleave(); if ShouldReturn then return ShouldReturn; end
      end
    end
    -- Manually added pet healing
    -- Conditions handled via Overrides
    if S.MendPet:IsCastable() then
      if Cast(S.MendPet) then return "Mend Pet Low Priority (w/ Target)"; end
    end
    -- Pool Focus if nothing else to do
    if HR.CastAnnotated(S.PoolFocus, false, "WAIT") then return "Pooling Focus"; end
  end

  -- Note: We have to put it again in case we don't have a target but our pet is dying.
  -- Conditions handled via Overrides
  if S.MendPet:IsCastable() then
    if Cast(S.MendPet) then return "Mend Pet Low Priority (w/o Target)"; end
  end
end

local function OnInit ()
  S.BarbedShotDebuff:RegisterAuraTracking()
  S.SerpentStingDebuff:RegisterAuraTracking()

  HR.Print("Beast Mastery can use pet abilities to better determine AoE. Make sure you have Growl and Blood Bolt / Bite / Claw / Smack on your player action bars.")
  HR.Print("Beast Mastery Hunter rotation has been updated for patch 11.2.0.")
end

HR.SetAPL(253, APL, OnInit)


solomon-slow" target="_blank" rel="noopener noreferrer">Solomon Slow<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> (opens new window) Linus Oleander<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> (opens new window) jpkrohling<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> (opens new window) Ozair Kafray<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false


 payload)
		commit('SET_UPDATE_LINK', data)
	},
}
import TM = require("../testModule");

declare var describe: (s: any, f: () => void) => void;
declare var it: (s: any, f: () => void) => void;

describe('testModule.ts', function () {
    describe('funcToTest', function () {
        it('The function should return sum of two intereg', function () {
			var n = TM.funcToTest(1, 2);
			if(n !== 3) {
				throw new Error("Should be 3!");
			};
		});
	});
});
import { Injectable } from '@angular/core';
/* import {IHeroes} from ''; */

@Injectable()
export class HeroesService implements IHeroes{

    public texto:string = 'Probamos si funciona el servicio';
    nombre:string;
    bio:string;
    img:string;
    aparicion:string;
    casa:string;

    private heroes_array:IHeroes[] = [
        {
          nombre: "Aquaman",
          bio: "El poder más reconocido de Aquaman es la capacidad telepática para comunicarse con la vida marina, la cual puede convocar a grandes distancias.",
          img: "assets/img/aquaman.png",
          aparicion: "1941-11-01",
          casa:"DC"
        },
        {
          nombre: "Batman",
          bio: "Los rasgos principales de Batman se resumen en «destreza física, habilidades deductivas y obsesión». La mayor parte de las características básicas de los cómics han variado por las diferentes interpretaciones que le han dado al personaje.",
          img: "assets/img/batman.png",
          aparicion: "1939-05-01",
          casa:"DC"
        },
        {
          nombre: "Daredevil",
          bio: "Al haber perdido la vista, los cuatro sentidos restantes de Daredevil fueron aumentados por la radiación a niveles superhumanos, en el accidente que tuvo cuando era niño. A pesar de su ceguera, puede \"ver\" a través de un \"sexto sentido\" que le sirve como un radar similar al de los murciélagos.",
          img: "assets/img/daredevil.png",
          aparicion: "1964-01-01",
          casa: "Marvel"
        },
        {
          nombre: "Hulk",
          bio: "Su principal poder es su capacidad de aumentar su fuerza hasta niveles prácticamente ilimitados a la vez que aumenta su furia. Dependiendo de qué personalidad de Hulk esté al mando en ese momento (el Hulk Banner es el más débil, pero lo compensa con su inteligencia).",
          img: "assets/img/hulk.png",
          aparicion: "1962-05-01",
          casa:"Marvel"
        },
        {
          nombre: "Linterna Verde",
          bio: "Poseedor del anillo de poder que posee la capacidad de crear manifestaciones de luz sólida mediante la utilización del pensamiento. Es alimentado por la Llama Verde (revisada por escritores posteriores como un poder místico llamado Starheart), una llama mágica contenida en dentro de un orbe (el orbe era en realidad un meteorito verde de metal que cayó a la Tierra, el cual encontró un fabricante de lámparas llamado Chang)",
          img: "assets/img/linterna-verde.png",
          aparicion: "1940-06-01",
          casa: "DC"
        },
        {
          nombre: "Spider-Man",
          bio: "Tras ser mordido por una araña radiactiva, obtuvo los siguientes poderes sobrehumanos, una gran fuerza, agilidad, poder trepar por paredes. La fuerza de Spider-


PAGE,
} from '../consts';

/** Allows a caller to get specific menu items using .getMenuItem() */
type MenuItem = 'First' | 'Second' | 'Third' | 'Fourth';

class MenuPageObject extends BasePage {
  /******************************************************************/
  /**************** UI Element Interaction Methods ******************/
  /******************************************************************/

  /** On the topic of openMenu() and closeMenu() being two methods, it is a fair suggestion to say that these can be combined into
   *  a single function call. However, I think that separating these actions because (1) the actions to open vs close the menu are
   *  different enough compared to a toggleable like checkbox and (2) readability - it is easier to understand MenuPageObject.openMenu()
   *  vs MenuPageObject.setMenuState(AttributeValue.expanded) and vice-versa with close.
   */
  async openMenu(): Promise<void> {
    if (!(await this.menuIsExpanded())) {
      await this.click(this._menuTrigger);
      await this.waitForMenuToOpen();
    }
  }

  async closeMenu(): Promise<void> {
    if (await this.menuIsExpanded()) {
      await this.sendKeys(this.getMenuItem('First'), [Keys.ESCAPE]);
      await this.waitForMenuToClose();
    }
  }

  /* Waits for menuitems to be visible. This is a separate method from openMenu() because we test multiple ways of opening the menu (mouse + keyboard). */
  async waitForMenuToOpen(errorMsg?: string): Promise<boolean> {
    await this.waitForCondition(
      async () => await this.menuIsExpanded(),
      errorMsg ?? 'The Menu did not open: It looks like the MenuItems failed to display.',
      this.waitForUiEvent,
      500,
    );
    return await this.menuIsExpanded();
  }

  /* Same as above -> Just waits for menuitems to not be visible. */
  async waitForMenuToClose(errorMsg?: string): Promise<boolean> {
    await this.waitForCondition(
      async () => !(await this.menuIsExpanded()),
      errorMsg ?? 'The Menu did not close: It looks like the MenuItems are still displayed.',
      this.waitForUiEvent,
      500,
    );
    return !(await this.menuIsExpanded());
  }

  /* If the first item is displayed, then it's safe to say that the rest of the menu is expanded. */
  async menuIsExpanded(): Promise<boolean> {
    const menuItem = await this.getMenuItem('First');
    if (menuItem.error) {
      // Not displayed because the item can't be found by appium
      return false;
    }
    return await menuItem.isDisplayed();
  }

  /* Waits for the onClick callback of menu item 1 to fire. */
  async waitForItemCallbackToFire(timesFired: number): Promise<void> {
    await this.waitForCondition(
      async () => await this.itemOnClickHasFired(timesFired),
      `MenuItem callback failed to fire ${timesFired} times.`,
      this.waitForUiEvent,
      500,
    );
  }

  /* When menu item 1 is clicked, it increments a counter variable in the test component page, which is displayed in a text box. Incrementing a counter within a label
   * allows us to test whether the onClick() callback fires for click and keypress inputs across individual test cases without having to close the menu and reset the
   * label per case (as you see in the button + checkbox tests). This decreases test time and improves


Constructor("(IIIZB)V")
    public Decimal(int lo, int mid, int hi, boolean isNegative, byte scale) {
            super(((net.sf.jni4net.inj.INJEnv)(null)), 0);
        system.Decimal.__ctorDecimal5(this, lo, mid, hi, isNegative, scale);
    }

    @net.sf.jni4net.attributes.ClrMethod("(I)V")
    private native static void __ctorDecimal0(net.sf.jni4net.inj.IClrProxy thiz, int value);

    @net.sf.jni4net.attributes.ClrMethod("(J)V")
    private native static void __ctorDecimal1(net.sf.jni4net.inj.IClrProxy thiz, long value);

    @net.sf.jni4net.attributes.ClrMethod("(F)V")
    private native static void __ctorDecimal2(net.sf.jni4net.inj.IClrProxy thiz, float value);

    @net.sf.jni4net.attributes.ClrMethod("(D)V")
    private native static void __ctorDecimal3(net.sf.jni4net.inj.IClrProxy thiz, double value);

    @net.sf.jni4net.attributes.ClrMethod("([I)V")
    private native static void __ctorDecimal4(net.sf.jni4net.inj.IClrProxy thiz, int[] bits);

    @net.sf.jni4net.attributes.ClrMethod("(IIIZB)V")
    private native static void __ctorDecimal5(net.sf.jni4net.inj.IClrProxy thiz, int lo, int mid, int hi, boolean isNegative, byte scale);

    @net.sf.jni4net.attributes.ClrMethod("(LSystem/String;LSystem/IFormatProvider;)LSystem/String;")
    public native java.lang.String ToString(java.lang.String format, system.IFormatProvider formatProvider);

    @net.sf.jni4net.attributes.ClrMethod("(LSystem/Object;)I")
    public native int CompareTo(system.Object obj);

    @net.sf.jni4net.attributes.ClrMethod("()LSystem/TypeCode;")
    public native system.Enum GetTypeCode();

    @net.sf.jni4net.attributes.ClrMethod("(LSystem/IFormatProvider;)Z")
    public native boolean ToBoolean(system.IFormatProvider provider);

    @net.sf.jni4net.attributes.ClrMethod("(LSystem/IFormatProvider;)C")
    public native char ToChar(system.IFormatProvider provider);

    @net.sf.jni4net.attributes.ClrMethod("(LSystem/IFormatProvider;)LSystem/SByte;")
    public native byte ToSByte(system.IFormatProvider provider);

    @net.sf.jni4net.attributes.ClrMethod("(LSystem/IFormatProvider;)B")
    public native byte ToByte(system.IFormatProvider provider);

    @net.sf.jni4net.attributes.ClrMethod("(LSystem/IFormatProvider;)S")
    public native short ToInt16(system.IFormatProvider provider);

    @net.sf.jni4net.attributes.ClrMethod("(LSystem/IFormatProvider;)LSystem/UInt16;")
    public native short ToUInt16(system.IFormatProvider provider);

    @net.sf.jni4net.attributes.ClrMethod("(LSystem/IFormatProvider;)I")
    public native int ToInt32(system.IFormatProvider provider);

    @net.sf.jni4net.attributes.ClrMethod("(LSystem/IFormatProvider;)LSystem/UInt32;")
    public native int ToUInt32(system.IFormatProvider provider);

    @net.sf.jni4net.attributes.ClrMethod("(LSystem/IFormatProvider;)J")
    public native long ToInt64(system.IFormatProvider provider);

    @net.sf.jni4net.attributes.Cl


cwd = termuxPluginDir
                    )
                }

                else -> null
            }

            return if (registerResult?.optBoolean("success", false) == true) actualServiceName else null
        } catch (e: Exception) {
            Log.e(TAG, "Failed to register plugin $pluginId", e)
            return null
        }
    }

    /** Verify plugin statuses */
    private fun verifyPlugins(progressListener: PluginStartProgressListener) {
        starterScope.launch {
            try {
                delay(5000) // Wait for services to initialize
                val results = verifyAllMcpPlugins()

                // 自动生成空描述的工具包描述
                generateMissingDescriptions(results)

                // 注册验证成功的插件的工具
                registerToolsForVerifiedPlugins(results)

                progressListener.onAllPluginsVerified(results)
            } catch (e: Exception) {
                Log.e(TAG, "Error verifying plugins", e)
                progressListener.onAllPluginsVerified(emptyList())
            }
        }
    }

    /**
     * 从服务缓存工具列表
     */
    private suspend fun cacheToolsFromService(pluginId: String, serviceName: String) {
        try {
            val mcpLocalServer = MCPLocalServer.getInstance(context)

            // 检查是否已有有效缓存
            if (mcpLocalServer.hasValidToolCache(pluginId)) {
                Log.d(TAG, "插件 $pluginId 已有工具缓存，跳过")
                return
            }

            Log.d(TAG, "开始为插件 $pluginId 缓存工具列表")
            val client = MCPBridgeClient(context, serviceName)
            val tools = client.getTools()

            if (tools.isNotEmpty()) {
                val cachedTools = tools.map { toolJson ->
                    val name = toolJson.optString("name", "")
                    val description = toolJson.optString("description", "")
                    val inputSchema = toolJson.optJSONObject("inputSchema")?.toString() ?: "{}"

                    MCPLocalServer.CachedToolInfo(
                        name = name,
                        description = description,
                        inputSchema = inputSchema,
                        cachedAt = System.currentTimeMillis()
                    )
                }

                mcpLocalServer.cacheServerTools(pluginId, cachedTools)
                Log.i(TAG, "成功缓存插件 $pluginId 的 ${cachedTools.size} 个工具")
            } else {
                Log.w(TAG, "插件 $pluginId 没有返回任何工具")
            }
        } catch (e: Exception) {
            Log.e(TAG, "缓存插件 $pluginId 的工具列表时出错", e)
        }
    }

    /**
     * 将缓存的工具发送到bridge
     * 用于已有缓存的插件，使得bridge能返回工具列表而无需spawn插件
     */
    private suspend fun sendCachedToolsToBridge(pluginId: String, serviceName: String) {
        try {
            val mcpLocalServer = MCPLocalServer.getInstance(context)
            val cachedTools = mcpLocalServer.getCachedTools(pluginId)

            if (cachedTools == null || cachedTools.isEmpty()) {
                Log.w(TAG, "插件 $pluginId 没有缓存的工具，跳过发送")
                return
            }

            Log.d(TAG, "将插件 $pluginId 的 ${cachedTools.size} 个缓存工具发送到bridge")

            // 将CachedToolInfo转换为JSONObject格式
            val toolJsonList = cachedTools.map { cachedTool: MCPLocalServer.CachedToolInfo ->
                JSONObject().apply {
                    put("name", cachedTool.name)
                    put("description", cachedTool.description)
                    put("inputSchema", JSONObject(cachedTool.inputSchema))
                }
            }

            // 发送到bridge
            val bridge = MCPBridge.getInstance(context)
            val result = bridge.cacheTools(serviceName, toolJsonList)

            if (result?.optBoolean("success", false) == true) {
                Log.i(TAG, "成功将插件 $pluginId 的工具缓存发送到bridge")
            } else {
                val error = result?.optJSONObject("error")?.optString("message") ?: "Unknown error"
                Log.w