Util.validateError(resultNegative, ++i, "error constructor does not accept additional detail args " +
                "'fatal' when error detail type 'record {| string message?; error cause?; anydata...; |}' " +
                "contains individual field descriptors", 36, 60);
        BAssertUtil.validateError(resultNegative, ++i, "cannot bind undefined error detail field 'detail'",
                39, 26);
        BAssertUtil.validateError(resultNegative, ++i, "cannot bind undefined error detail field 'extra'", 39, 45);
        BAssertUtil.validateError(resultNegative, ++i, "redeclared symbol 'reason11'", 41, 16);
        BAssertUtil.validateError(resultNegative, ++i, "cannot bind undefined error detail field 'detail'",
                42, 26);
        BAssertUtil.validateError(resultNegative, ++i, "cannot bind undefined error detail field 'extra'", 42, 45);
        BAssertUtil.validateError(resultNegative, ++i,
                "incompatible types: expected 'boolean', found 'string'", 44, 26);
        BAssertUtil.validateError(resultNegative, ++i,
                "incompatible types: expected 'string', found 'string?'", 45, 28);
        BAssertUtil.validateError(resultNegative, ++i, "cannot bind undefined error detail field 'message'",
                52, 26);
        BAssertUtil.validateError(resultNegative, ++i, "cannot bind undefined error detail field 'detail'",
                52, 47);
        BAssertUtil.validateError(resultNegative, ++i, "cannot bind undefined error detail field 'extra'", 52, 66);
        BAssertUtil.validateError(resultNegative, ++i, "cannot bind undefined error detail field 'message'",
                53, 26);
        BAssertUtil.validateError(resultNegative, ++i, "cannot bind undefined error detail field 'message'",
                54, 26);
        BAssertUtil.validateError(resultNegative, ++i,
                "redeclared symbol 'message'", 54, 36);
        BAssertUtil.validateError(resultNegative, ++i,
                "incompatible types: expected 'int', found 'map<ballerina/lang.value:0.0.0:Cloneable>'", 56, 18);
        BAssertUtil.validateError(resultNegative, ++i,
                "invalid error variable; expecting an error type but found 'int' in type definition", 57, 47);
        BAssertUtil.validateError(resultNegative, ++i,
                "incompatible types: expected 'boolean', found 'string'", 63, 17);
        BAssertUtil.validateError(resultNegative, ++i,
                "incompatible types: expected 'string', found 'ballerina/lang.value:0.0.0:Cloneable'", 64, 16);
        BAssertUtil.validateError(resultNegative, ++i, "cannot bind undefined error detail field 'message'",
                69, 24);
        BAssertUtil.validateError(resultNegative, ++i,
                "incompatible types: expected 'string', found 'ballerina/lang.value:0.0.0:Cloneable'", 70, 16);
        Assert.assertEquals(resultNegative.getErrorCount(), ++i);
    }

    @AfterClass
    public void tearDown() {
        result = null;
    }
}
/*
*  Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
*  WSO2 Inc. licenses this file to you under the Apache License,
*  Version 2.0 (the "License"); you may not use this file except
*  in compliance with the License.
*  You may obtain a copy of the License at
*
*    http://www.apache.org/licenses/LICENSE-2.0
*
*  Unless required by applicable law or agreed to in writing,
*  software distributed under the License is distributed on an
*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
*  KIND, either express or implied.  See the License for the
*  specific language governing permissions and limitations
*  under the License.
*/
package org.balleri


 117, ../sass/components/button.scss */
.at-btn--text {
  background: none;
  color: #6190E8;
  color: #3F536E;
  border: none;
}
/* line 27, ../sass/components/button.scss */
.at-btn--text:hover {
  background: none;
  color: #79a1eb;
  border-color: rgba(255, 255, 255, 0.15);
}
/* line 32, ../sass/components/button.scss */
.at-btn--text:active {
  background: none;
  color: #719bea;
  border-color: rgba(255, 255, 255, 0.1);
}
/* line 122, ../sass/components/button.scss */
.at-btn--text:disabled, .at-btn--text:disabled:hover, .at-btn--text:disabled:active {
  background: none;
}
/* line 136, ../sass/components/button.scss */
.at-btn--default--hollow:disabled, .at-btn--default--hollow:disabled:hover, .at-btn--default--hollow:disabled:active, .at-btn--primary--hollow:disabled, .at-btn--primary--hollow:disabled:hover, .at-btn--primary--hollow:disabled:active, .at-btn--success--hollow:disabled, .at-btn--success--hollow:disabled:hover, .at-btn--success--hollow:disabled:active, .at-btn--error--hollow:disabled, .at-btn--error--hollow:disabled:hover, .at-btn--error--hollow:disabled:active, .at-btn--warning--hollow:disabled, .at-btn--warning--hollow:disabled:hover, .at-btn--warning--hollow:disabled:active, .at-btn--info--hollow:disabled, .at-btn--info--hollow:disabled:hover, .at-btn--info--hollow:disabled:active, .at-btn--text--hollow:disabled, .at-btn--text--hollow:disabled:hover, .at-btn--text--hollow:disabled:active {
  background: none;
}
/* line 143, ../sass/components/button.scss */
.at-btn--large {
  font-size: 16px;
  padding: 5px 18px;
}
/* line 147, ../sass/components/button.scss */
.at-btn--large.at-btn--circle {
  width: 40px;
  height: 40px;
}
/* line 151, ../sass/components/button.scss */
.at-btn--large.at-btn--circle .at-btn__icon {
  font-size: 16px;
}
/* line 155, ../sass/components/button.scss */
.at-btn--large .at-btn__text {
  font-size: 14px;
}
/* line 159, ../sass/components/button.scss */
.at-btn--small {
  font-size: 11px;
  padding: 4px 12px;
}
/* line 163, ../sass/components/button.scss */
.at-btn--small.at-btn--circle {
  width: 28px;
  height: 28px;
}
/* line 167, ../sass/components/button.scss */
.at-btn--small.at-btn--circle .at-btn__icon {
  font-size: 11px;
}
/* line 171, ../sass/components/button.scss */
.at-btn--small .at-btn__text {
  font-size: 11px;
}
/* line 175, ../sass/components/button.scss */
.at-btn--smaller {
  font-size: 10px;
  padding: 2px 10px;
}
/* line 179, ../sass/components/button.scss */
.at-btn--smal


32(vacc5x01, va5, vb01);
    }

    const float32x2_t vscale = vreinterpret_f32_u8(vld1_u8(w)); w = (const float*) w + 2;
    vacc0x01 = vmul_f32(vacc0x01, vscale);
    vacc1x01 = vmul_f32(vacc1x01, vscale);
    vacc2x01 = vmul_f32(vacc2x01, vscale);
    vacc3x01 = vmul_f32(vacc3x01, vscale);
    vacc4x01 = vmul_f32(vacc4x01, vscale);
    vacc5x01 = vmul_f32(vacc5x01, vscale);
    const float32x2_t vmax = vdup_n_f32(params->scalar.max);
    vacc0x01 = vmin_f32(vacc0x01, vmax);
    vacc1x01 = vmin_f32(vacc1x01, vmax);
    vacc2x01 = vmin_f32(vacc2x01, vmax);
    vacc3x01 = vmin_f32(vacc3x01, vmax);
    vacc4x01 = vmin_f32(vacc4x01, vmax);
    vacc5x01 = vmin_f32(vacc5x01, vmax);
    const float32x2_t vmin = vdup_n_f32(params->scalar.min);
    vacc0x01 = vmax_f32(vacc0x01, vmin);
    vacc1x01 = vmax_f32(vacc1x01, vmin);
    vacc2x01 = vmax_f32(vacc2x01, vmin);
    vacc3x01 = vmax_f32(vacc3x01, vmin);
    vacc4x01 = vmax_f32(vacc4x01, vmin);
    vacc5x01 = vmax_f32(vacc5x01, vmin);

    if XNN_LIKELY(nc >= 2) {
      vst1_f32(c0, vacc0x01);
      c0 = (float*) ((uintptr_t) c0 + cn_stride);
      vst1_f32(c1, vacc1x01);
      c1 = (float*) ((uintptr_t) c1 + cn_stride);
      vst1_f32(c2, vacc2x01);
      c2 = (float*) ((uintptr_t) c2 + cn_stride);
      vst1_f32(c3, vacc3x01);
      c3 = (float*) ((uintptr_t) c3 + cn_stride);
      vst1_f32(c4, vacc4x01);
      c4 = (float*) ((uintptr_t) c4 + cn_stride);
      vst1_f32(c5, vacc5x01);
      c5 = (float*) ((uintptr_t) c5 + cn_stride);

      a0 = (const float*) ((uintptr_t) a0 - kc);
      a1 = (const float*) ((uintptr_t) a1 - kc);
      a2 = (const float*) ((uintptr_t) a2 - kc);
      a3 = (const float*) ((uintptr_t) a3 - kc);
      a4 = (const float*) ((uintptr_t) a4 - kc);
      a5 = (const float*) ((uintptr_t) a5 - kc);

      nc -= 2;
    } else {
      assert(nc == 1);
      vst1_lane_f32(c0, vacc0x01, 0);
      vst1_lane_f32(c1, vacc1x01, 0);
      vst1_lane_f32(c2, vacc2x01, 0);
      vst1_lane_f32(c3, vacc3x01, 0);
      vst1_lane_f32(c4, vacc4x01, 0);
      vst1_lane_f32(c5, vacc5x01, 0);

      nc = 0;
    }
  } while (nc != 0);
}


# ------------------------------------------------------------------
# Copyright (c) 2020 PyInstaller Development Team.
#
# This file is distributed under the terms of the GNU General Public
# License (version 2.0 or later).
#
# The full license is available in LICENSE, distributed with
# this software.
#
# SPDX-License-Identifier: GPL-2.0-or-later
# ------------------------------------------------------------------

from PyInstaller.utils.hooks import collect_submodules

hiddenimports = collect_submodules("pynput")


0068 002EBCC8  98 F3 00 01 */	stb r7, 1(r19)
/* 802F006C 002EBCCC  98 D3 00 02 */	stb r6, 2(r19)
/* 802F0070 002EBCD0  98 13 00 03 */	stb r0, 3(r19)
/* 802F0074 002EBCD4  80 F2 00 34 */	lwz r7, 0x34(r18)
/* 802F0078 002EBCD8  54 E6 42 1E */	rlwinm r6, r7, 8, 8, 0xf
/* 802F007C 002EBCDC  54 E0 C4 2E */	rlwinm r0, r7, 0x18, 0x10, 0x17
/* 802F0080 002EBCE0  50 E6 C0 0E */	rlwimi r6, r7, 0x18, 0, 7
/* 802F0084 002EBCE4  50 E0 46 3E */	rlwimi r0, r7, 8, 0x18, 0x1f
/* 802F0088 002EBCE8  7C C0 03 78 */	or r0, r6, r0
/* 802F008C 002EBCEC  54 07 C6 3E */	rlwinm r7, r0, 0x18, 0x18, 0x1f
/* 802F0090 002EBCF0  98 13 00 04 */	stb r0, 4(r19)
/* 802F0094 002EBCF4  54 06 86 3E */	rlwinm r6, r0, 0x10, 0x18, 0x1f
/* 802F0098 002EBCF8  54 00 46 3E */	srwi r0, r0, 0x18
/* 802F009C 002EBCFC  98 F3 00 05 */	stb r7, 5(r19)
/* 802F00A0 002EBD00  98 D3 00 06 */	stb r6, 6(r19)
/* 802F00A4 002EBD04  98 13 00 07 */	stb r0, 7(r19)
/* 802F00A8 002EBD08  48 00 3F 61 */	bl MI_CpuFill8
/* 802F00AC 002EBD0C  7E A3 AB 78 */	mr r3, r21
/* 802F00B0 002EBD10  38 93 00 3C */	addi r4, r19, 0x3c
/* 802F00B4 002EBD14  38 A0 00 88 */	li r5, 0x88
/* 802F00B8 002EBD18  48 00 3F 55 */	bl MI_CpuCopy8
/* 802F00BC 002EBD1C  7E 83 A3 78 */	mr r3, r20
/* 802F00C0 002EBD20  38 93 00 C4 */	addi r4, r19, 0xc4
/* 802F00C4 002EBD24  38 A0 00 20 */	li r5, 0x20
/* 802F00C8 002EBD28  48 00 3F 45 */	bl MI_CpuCopy8
/* 802F00CC 002EBD2C  38 72 00 28 */	addi r3, r18, 0x28
/* 802F00D0 002EBD30  38 12 00 38 */	addi r0, r18, 0x38
/* 802F00D4 002EBD34  3A 40 00 00 */	li r18, 0
/* 802F00D8 002EBD38  38 82 A4 98 */	addi r4, r2, lbl_80642A98-_SDA2_BASE_
/* 802F00DC 002EBD3C  3F 40 80 40 */	lis r26, lbl_803FE0F8@ha
/* 802F00E0 002EBD40  90 81 00 1C */	stw r4, 0x1c(r1)
/* 802F00E4 002EBD44  7E 59 93 78 */	mr r25, r18
/* 802F00E8 00


FilterMap *ppfmReqd = pppsRequired->Ppfm();

	ULongPtrArray *pdrgpul = ppimReqd->PdrgpulScanIds(mp);

	CPartIndexMap *ppimResult = GPOS_NEW(mp) CPartIndexMap(mp);
	CPartFilterMap *ppfmResult = GPOS_NEW(mp) CPartFilterMap(mp);

	const ULONG ulPartIndexIds = pdrgpul->Size();

	// iterate over required part index ids and decide which ones to push through
	for (ULONG ul = 0; ul < ulPartIndexIds; ul++)
	{
		ULONG part_idx_id = *((*pdrgpul)[ul]);
		GPOS_ASSERT(ppimReqd->Contains(part_idx_id));

		// if part index id is defined in child, push it to the child
		if (ppartinfo->FContainsScanId(part_idx_id))
		{
			// push requirements to child node
			ppimResult->AddRequiredPartPropagation(
				ppimReqd, part_idx_id, CPartIndexMap::EppraPreservePropagators);
			if (CPhysical::EppcAllowed == eppcPropogate)
			{
				// for some logical operators such as limit while we push the part index map, we cannot push the constraints
				// since they are NOT semantically equivalent. So only push the constraints when the operator asks this
				// utility function to do so
				(void) ppfmResult->FCopyPartFilter(mp, part_idx_id, ppfmReqd,
												   filter_colrefs);
			}
		}
	}

	pdrgpul->Release();

	return GPOS_NEW(mp) CPartitionPropagationSpec(ppimResult, ppfmResult);
}

//---------------------------------------------------------------------------
//	@function:
//		CPhysical::PpimDeriveCombineRelational
//
//	@doc:
//		Common case of common case of combining partition index maps
//		of all logical children
//
//---------------------------------------------------------------------------
CPartIndexMap *
CPhysical::PpimDeriveCombineRelational(CMemoryPool *mp,
									   CExpressionHandle &exprhdl)
{
	GPOS_ASSERT(0 < exprhdl.Arity());

	CPartIndexMap *ppim = GPOS_NEW(mp) CPartIndexMap(mp);
	const ULONG arity = exprhdl.Arity();
	for (ULONG ul = 0; ul < arity; ul++)
	{
		if (!exprhdl.FScalarChild(ul))
		{
			CPartIndexMap *ppimChild = exprhdl.Pdpplan(ul)->Ppim();
			GPOS_ASSERT(NULL != ppimChild);

			CPartIndexMap *ppimCombined =
				CPartIndexMap::PpimCombine(mp, *ppim, *ppimChild);
			ppim->Release();
			ppim = ppimCombined;
		}
	}

	return ppim;
}

//---------------------------------------------------------------------------
//	@function:
//		CPhysical::PpimPassThruOuter
//
//	@doc:
//		Common case of common case of passing through partition index map
//
//---------------------------------------------------------------------------
CPartIndexMap *
CPhysical::PpimPassThruOuter(CExpressionHandle &exprhdl)
{
	CPartIndexMap *ppim = exprhdl.Pdpplan(0 /*child_index*/)->Ppim();
	GPOS_ASSERT(NULL != ppim);

	ppim->AddRef();

	return ppim;
}

//---------------------------------------------------------------------------
//	@function:
//		CPhysical::PpfmPassThruOuter
//
//	@doc:
//		Common case of common case of passing through partition filter map
//
//---------------------------------------------------------------------------
CPartFilterMap *
CPhysical::PpfmPassThruOuter(CExpressionHandle &exprhdl)
{
	CPartFilterMap *ppfm = exprhdl.Pdpplan(0 /*child_index*/)->Ppfm();
	GPOS_ASSERT(NULL != ppfm);

	ppfm->AddRef();

	return ppfm;
}

//------------


      break;
    case FACETYPE_MESH:
      if (1)
      {
        PatchSurface surface(verts, mVcount, mControlX, mControlY);
        const LightMapVertex *vlist = surface.GetVerts();
        const unsigned short *indices = surface.GetIndices();
        int tcount = surface.GetIndiceCount() / 3;

        for (int j = 0; j < tcount; j++)
        {

          int i1 = *indices++;
          int i2 = *indices++;
          int i3 = *indices++;

          mesh.AddTri(mat, vlist[i1], vlist[i2], vlist[i3]);
        }
      }
      break;
    case FACETYPE_FLARE: break;
    default:
      //      assert( 0 );
      break;
  }
}

void ShaderReference::GetTextureName(char *tname)
{
  strcpy(tname, "null");
  int len = strlen(mName);
  if (!len)
    return;
  const char *foo = &mName[0];
  // while ( *foo && (*foo != '/' && *foo != '\\') ) foo--;
  // if ( !*foo ) return;
  // foo++;
  if (!*foo)
    return;
  char *dest = tname;
  while (*foo)
  {
    *dest++ = *foo++;
  }
  *dest = 0;
}
// Copyright (C) Gaijin Games KFT.  All rights reserved.

#include <libTools/dagFileRW/dagUtil.h>
#include <libTools/dagFileRW/dagFileFormat.h>
#include <libTools/util/blockFileUtil.h>
#include <libTools/util/strUtil.h>
#include <util/dag_globDef.h>
#include <debug/dag_except.h>
#include <debug/dag_debug.h>
#include <osApiWrappers/dag_direct.h>

bool copy_dag_file_tex_subst(const char *src_name, const char *dst_name, dag::ConstSpan<const char *> srcTexName,
  dag::ConstSpan<const char *> destTexName)
{
  // get and patch dag texture names
  BlkFile dag(DAG_ID, true);
  G_ASSERT(srcTexName.size() == destTexName.size());

  DAGOR_TRY
  {
    dag.loadfile(src_name, 0);

    if (dag.getint() != DAG_ID)
      DAGOR_THROW(BlkFileException("Invalid DAG file"));

    for (; dag.rest();)
    {
      dag.getblk();
      int id = dag.getint();

      if (id == DAG_END)
      {
        break;
      }
      else if (id == DAG_TEXTURES)
      {
        int num = dag.getshort();
        String texname;

        for (int i = 0; i < num; ++i)
        {
          // get tex name
          int len = dag.getchar();
          texname.printf(len + 2, "%.*s", len, dag.ptr());

          // erase it
          dag.skip(-1);
          dag.erase(1 + len);

          // get new name
          bool found = false;
          for (int j = 0; j < srcTexName.size(); j++)
            if (stricmp(texname, srcTexName[j]) == 0)
            {
              texname = destTexName[j];
              found = true;
            }
          if (!found)
            debug("not found %s in %s", texname.str(), src_name);

          // write new name
          dag.putchar(texname.length());
          dag.insert(texname.length(), &texname[0]);
        }


y_status;
    uint16_t phy_control;

    /* Polling */
    struct ptimer_state *ptimer;

    /* Whether we should flush the rx queue when buffer becomes available. */
    bool need_flush;
};
typedef struct eTSEC eTSEC;

#define TYPE_ETSEC_COMMON "eTSEC"
OBJECT_DECLARE_SIMPLE_TYPE(eTSEC, ETSEC_COMMON)

#define eTSEC_TRANSMIT 1
#define eTSEC_RECEIVE  2

DeviceState *etsec_create(hwaddr        base,
                          MemoryRegion *mr,
                          NICInfo      *nd,
                          qemu_irq      tx_irq,
                          qemu_irq      rx_irq,
                          qemu_irq      err_irq);

void etsec_update_irq(eTSEC *etsec);

void etsec_walk_tx_ring(eTSEC *etsec, int ring_nbr);
void etsec_walk_rx_ring(eTSEC *etsec, int ring_nbr);
ssize_t etsec_rx_ring_write(eTSEC *etsec, const uint8_t *buf, size_t size);

void etsec_write_miim(eTSEC          *etsec,
                      eTSEC_Register *reg,
                      uint32_t        reg_index,
                      uint32_t        value);

void etsec_miim_link_status(eTSEC *etsec, NetClientState *nc);

#endif /* ETSEC_H */


nd(TextBox.TextProperty, new Binding
        {
            Source = this,
            Path = "BoardName",
            Mode = BindingMode.TwoWay
        });
    }

    public string BoardName
    {
        get => GetValue(BoardNameProperty);
        set => SetValue(BoardNameProperty, value);
    }

    public event EventHandler<RoutedEventArgs> ExportBoard
    {
        add => AddHandler(ExportBoardEvent, value);
        remove => RemoveHandler(ExportBoardEvent, value);
    }

    public event EventHandler<RoutedEventArgs> ImportBoard
    {
        add => AddHandler(ImportBoardEvent, value);
        remove => RemoveHandler(ImportBoardEvent, value);
    }

    private void ExportBoardButton_OnClick(object? sender, RoutedEventArgs e)
    {
        RaiseEvent(new RoutedEventArgs(ExportBoardEvent));
    }

    private void ImportBoardButton_OnClick(object? sender, RoutedEventArgs e)
    {
        RaiseEvent(new RoutedEventArgs(ImportBoardEvent));
    }
}


-- Copyright 2016-2018 Stan Grishin <stangri@melmac.net>
-- Licensed to the public under the Apache License 2.0.

local packageName = "simple-adblock"
local readmeURL = "https://docs.openwrt.melmac.net/" .. packageName .. "/"
local uci = require "luci.model.uci".cursor()
local util = require "luci.util"
local sys = require "luci.sys"
local jsonc = require "luci.jsonc"
local fs = require "nixio.fs"
local nutil = require "nixio.util"
local http = require "luci.http"
local dispatcher = require "luci.dispatcher"

function getPackageVersion()
	local opkgFile = "/usr/lib/opkg/status"
	local line
	local flag = false
	for line in io.lines(opkgFile) do
		if flag then
			return line:match('[%d%.$-]+') or ""
		elseif line:find("Package: " .. packageName:gsub("%-", "%%%-")) then
			flag = true
		end
	end
	return ""
end

function getFileLines(file)
	local f = io.open(file)
	if f then
		local t = f:read("*a")
		local _,n = t:gsub("\n","")
		f:close()
		return n
	else
		return "0"
	end
end

function checkDnsmasq() return fs.access("/usr/sbin/dnsmasq") end
function checkUnbound() return fs.access("/usr/sbin/unbound") end
function checkIpset()
	if fs.access("/usr/sbin/ipset") and sys.call("/usr/sbin/ipset help hash:net >/dev/null 2>&1") == 0 then
		return true
	else
		return false
	end
end

function checkDnsmasqIpset()
	if checkDnsmasq() then
		local o = util.trim(util.exec("/usr/sbin/dnsmasq -v 2>/dev/null"))
		if not o:match("no%-ipset") and o:match("ipset") and checkIpset() then
			return true
		else
			return false
		end
	else
		return false
	end
end

local enabledFlag = uci:get(packageName, "config", "enabled")
local command, outputFile, outputCache, outputGzip
local targetDNS = uci:get(packageName, "config", "dns")

if not targetDNS or targetDNS == "" then
	targetDNS = "dnsmasq.servers"
end

if targetDNS ~= "dnsmasq.addnhosts" and targetDNS ~= "dnsmasq.conf" and
	 targetDNS ~= "dnsmasq.ipset" and targetDNS ~= "dnsmasq.servers" and
	 targetDNS ~= "unbound.adb_list" then
	targetDNS = "dnsmasq.servers"
end

if targetDNS == "dnsmasq.addnhosts" then
	outputFile="/var/run/" .. packageName .. ".addnhosts"
	outputCache="/var/run/" .. packageName .. ".addnhosts.cache"
	outputGzip="/etc/" .. packageName .. ".addnhosts.gz"
elseif targetDNS == "dnsmasq.conf" then
	outputFile="/var/dnsmasq.d/" .. packageName .. ""
	outputCache="/var/run/" .. packageName .. ".dnsmasq.cache"
	outputGzip="/etc/" .. packageName .. ".dnsmasq.gz"
elseif targetDNS == "dnsmasq.servers" then
	outputFile="/var/run/" .. packageName .. ".servers"
	outputCache="/var/run/" .. packageName .. ".servers.cache"
	outputGzip="/etc/" .. packageName .. ".servers.gz"
elseif targetDNS == "unbound.adb_list" then
	outputFile="/var/lib/unbound/adb_list." .. packageName .. ""
	outputCache="/var/run/" .. packageName .. ".unbound.cache"
	outputGzip="/etc/" .. packageName .. ".unbound.gz"
end

local packageVersion = getPackageVersion()
local tmpfs, tmpfsMessage, tmpfsError, tmpfsStats, tmpfsStatus

if packageVersion == "" then
	tmpfsStatus = "statusNoInstall"
else
	tmpfsStatus = "statusStopped"
end

if fs.access("/var/run/" .. packageName .. "


the rectangle, a subsequent call to contains may
   * return false.
   *
   * @param x the X coordinate of the point to add to this rectangle
   * @param y the Y coordinate of the point to add to this rectangle
   */
  public void add(double newx, double newy)
  {
    double minx = Math.min(getX(), newx);
    double maxx = Math.max(getMaxX(), newx);
    double miny = Math.min(getY(), newy);
    double maxy = Math.max(getMaxY(), newy);
    setRect(minx, miny, maxx - minx, maxy - miny);
  }

  /**
   * Modifies this rectangle so that it represents the smallest rectangle
   * that contains both the existing rectangle and the specified point.
   * However, if the point falls on one of the two borders which are not
   * inside the rectangle, a subsequent call to contains may
   * return false.
   *
   * @param p the point to add to this rectangle
   * @throws NullPointerException if p is null
   */
  public void add(Point2D p)
  {
    add(p.getX(), p.getY());
  }

  /**
   * Modifies this rectangle so that it represents the smallest rectangle
   * that contains both the existing rectangle and the specified rectangle.
   *
   * @param r the rectangle to add to this rectangle
   * @throws NullPointerException if r is null
   * @see #union(Rectangle2D)
   */
  public void add(Rectangle2D r)
  {
    union(this, r, this);
  }

  /**
   * Return an iterator along the shape boundary. If the optional transform
   * is provided, the iterator is transformed accordingly. Each call returns
   * a new object, independent from others in use. This iterator is thread
   * safe; modifications to the rectangle do not affect the results of this
   * path instance.
   *
   * @param transform an optional transform to apply to the iterator
   * @return a new iterator over the boundary
   * @since 1.2
   */
  public PathIterator getPathIterator(final AffineTransform at)
  {
    final double minx = getX();
    final double miny = getY();
    final double maxx = minx + getWidth();
    final double maxy = miny + getHeight();
    return new PathIterator()
    {
      /** Current coordinate. */
      private int current = (maxx <= minx && maxy <= miny) ? 6 : 0;

      public int getWindingRule()
      {
        // A test program showed that Sun J2SE 1.3.1 and 1.4.1_01
        // return WIND_NON_ZERO paths.  While this does not really
        // make any difference for rectangles (because they are not
        // self-intersecting), it seems appropriate to behave
        // identically.

        return WIND_NON_ZERO;
      }

      public boolean isDone()
      {
        return current > 5;
      }

      public void next()
      {
        current++;
      }

      public int currentSegment(float[] coords)
      {
        switch (current)
          {
          case 1:
            coords[0] = (float) maxx;
            coords[1] = (float) miny;
            break;
          case 2:
            coords[0] = (float) maxx;
            coords[1] = (float) maxy;
            break;
          case 3:
            coords[0] = (float) minx;
            coords[1] = (float) maxy;
            break;
          case 0:
          case 4:
            coords[0] = (float) minx;
            coords[1] = (float) miny;
            break;
          case 5:
            return SEG_CLOSE;
          default:
            throw new NoSuchElementException("rect iterator out of bounds


w.rolling(window=period).sum()
    negative_sum = negative_flow.rolling(window=period).sum()
    mfi = 100 * positive_sum / (positive_sum + negative_sum + 1e-9)
    return mfi

def compute_CMF(high, low, close, volume, period=20):
    """CMF (Chaikin Money Flow)"""
    mf_multiplier = ((close - low) - (high - close)) / (high - low + 1e-9)
    mf_volume = mf_multiplier * volume
    cmf = mf_volume.rolling(window=period).sum() / volume.rolling(window=period).sum()
    return cmf

def compute_TRIX(series, period=15):
    """TRIX 三重指数平滑平均"""
    ema1 = series.ewm(span=period, adjust=False).mean()
    ema2 = ema1.ewm(span=period, adjust=False).mean()
    ema3 = ema2.ewm(span=period, adjust=False).mean()
    trix = (ema3.diff() / ema3.shift().replace(0,1e-9)) * 100
    return trix

def compute_ultimate_oscillator(high, low, close, short_period=7, medium_period=14, long_period=28):
    """UO 终极震荡指标"""
    bp = close - np.minimum(low.shift(1), close.shift(1))
    tr = np.maximum(high - low,
                    np.maximum(abs(high - close.shift(1)), abs(low - close.shift(1))))
    avg_s = bp.rolling(short_period).sum() / tr.rolling(short_period).sum().replace(0,1e-9)
    avg_m = bp.rolling(medium_period).sum() / tr.rolling(medium_period).sum().replace(0,1e-9)
    avg_l = bp.rolling(long_period).sum() / tr.rolling(long_period).sum().replace(0,1e-9)
    uo = 100 * ((4 * avg_s) + (2 * avg_m) + avg_l) / (4 + 2 + 1)
    return uo

def compute_chaikin_oscillator(high, low, close, volume, short_period=3, long_period=10):
    """Chaikin Osc (基于ADL的MACD式指标)"""
    adl_line = compute_ADL_line(high, low, close, volume)
    short_ema = adl_line.ewm(span=short_period, adjust=False).mean()
    long_ema = adl_line.ewm(span=long_period, adjust=False).mean()
    return short_ema - long_ema

def compute_ADL_line(high, low, close, volume):
    """ADL 累积/派发线"""
    mf_multiplier = ((close - low) - (high - close)) / (high - low + 1e-9)
    mf_volume = mf_multiplier * volume
    adl = mf_volume.cumsum()
    return adl

def compute_PPO(series, fast_period=12, slow_period=26):
    """PPO (百分比价格振荡器)"""
    fast_ema = series.ewm(span=fast_period, adjust=False).mean()
    slow_ema = series.ewm(span=slow_period, adjust=False).mean()
    ppo = (fast_ema - slow_ema) / slow_ema.replace(0,1e-9) * 100
    return ppo

def compute_DPO(series, period=20):
    """DPO 去趋势价格振荡器"""
    sma = series.rolling(window=period).mean()
    dpo = series.shift(int((period/2)+1)) - sma
    return dpo

def compute_KST(series, r1=10, r2=15, r3=20, r4=30, sma1=10, sma2=10, sma3=10, sma4=15):
    """KST (Know Sure Thing)"""
    roc1 = series.pct_change(r1)*100
    roc2 = series.pct_change(r2)*100
    roc3 = series.pct_change(r3)*100
    roc4 = series.pct_change(r4)*100

    sma_roc1 = roc1.rolling(sma1).mean()
    sma_roc2 = roc2.rolling(sma2).mean()
    sma_roc3 = roc3.rolling(sma3).mean()
    sma_roc4 = roc4.rolling(sma4).mean()

    kst = sma_roc1 + 2*sma_roc2 + 3*sma_roc3 + 4*sma_roc4
    signal = kst.rolling(9).mean()
    return kst, signal

def compute_KAMA(series, n=10, pow1=2, pow2=30):
    """KAMA 自适应移动平均"""
    change = (series - series.shift(n)).abs()
    volatility = series.diff().abs().rolling(n).sum()
    er = change / volatility.replace(0,1e-9)
    sc = (er * (2/(pow1+1) - 2/(pow2+1)) + 2/(pow2+1))**2

    kama = series.copy()
    for i in range(n, len(series)):
        kama.iloc[i] = kama.iloc[i-1] + sc.iloc[i]*(series.iloc[i]-kama.iloc[i-1])
    return kama

def compute_SMA(series, window):
    """简单移动平均 (SMA)"""
    return series.rolling(window=window, min_periods=1).mean()

def compute_EMA(series, span):
    """指数移动平均 (EMA)"""
    return series.ewm(span=span, adjust=False).mean()

def compute_PercentageB(close, upper_band, lower_band):
    """Bollinger %B"""
    band_range = upper_band - lower_band
    band_range = band_range.replace(0, np.nan)
    percent_b = (close - lower_band) / band_range
    return percent_b.fillna(0)

def compute_AccumulationDistribution(high, low, close, volume):
    """A/D 累积派发线"""
    denominator = (high - low).replace(0, np.nan)
    mfm = ((close - low) - (high - close)) / denominator
    mfm = mfm.fillna(0)
    mfv = mfm * volume
    return mfv.cumsum()

def compute_MoneyFlowIndex(high, low, close, volume, period=14):
    """MFI资金流量指标 (另一种实现)"""
    typical_price = (high + low + close) / 3
    money_flow = typical_price * volume
    positive_flow = money_flow.where(typical_price.diff() > 0, 0)
    negative_flow = money_flow.where(t


i in range(unit_index + 1, len(units)):
                next_u = units[i]
                next_top = next_u[0][1]
                if next_top > u_bottom:
                    break  # 下一块的顶部超过当前底部，结束本行
                row.append(next_u)  # 当前行添加块
                unit_index = i  # 步进 已遍历的块序号
            # ========== 查找当前行的间隙 row_gaps ==========
            row.sort(key=lambda x: (x[0][0], x[0][2]))  # 当前行中的块 从左到右排序
            row_gaps = []  # 当前行的间隙 [ ( ( 左边缘l, 右边缘r ), 开始行号) ]
            search_start = page_l  # 本轮搜索的线段起始点为页面左边缘
            for u in row:  # 遍历当前行的块
                l = u[0][0]  # 块左侧
                r = u[0][2]  # 块右侧
                # 若块起始点大于搜索起始点，那么将这部分加入到结果
                if l > search_start:
                    row_gaps.append((search_start, l, row_index))
                # 若块结束点大于搜索起始点，更新搜索起始点
                if r > search_start:
                    search_start = r
            # 页面右边缘 加入最后一个间隙
            row_gaps.append((search_start, page_r, row_index))
            # ========== 更新考察中的间隙组 ==========
            gaps, del_gaps = update_gaps(gaps, row_gaps)
            # gaps 中被移除的项，加入生成完毕的竖切线 completed_cuts
            row_max = row_index - 1  # 竖切线结束行号
            for dg1 in del_gaps:
                completed_cuts.append((*dg1, row_max))
            # ========== End ==========
            rows.append(row)  # 总行列表添加当前行
            unit_index += 1
            row_index += 1
        # 遍历结束，收集 gaps 中剩余的间隙，组成延伸到最后一行的竖切线
        row_max = len(rows) - 1  # 竖切线结束行号
        for g in gaps:
            completed_cuts.append((*g, row_max))
        completed_cuts.sort(key=lambda c: c[0])
        return completed_cuts, rows

    # ======================= 求布局树 =====================
    """
    一个布局树节点表示一个区块。定义：
    node = {
        "x_left": 节点左边缘x,
        "x_right": 右边缘x,
        "r_top": 顶部的行号,
        "r_bottom": 底部的行号,
        "units": [], # 节点内部的文本块列表（除了根节点为空，其它节点非空）
        "children": [], # 子节点，有序
    }
    """

    def _get_layout_tree(self, cuts, rows):
        # 竖切线，将一个横行切开，断开的区域为“间隙”。
        # 生成每一行对应的间隙 (左侧,右侧) 坐标列表
        rows_gaps = [[] for _ in rows]
        for g_i, cut in enumerate(cuts):
            for r_i in range(cut[2], cut[3] + 1):
                rows_gaps[r_i].append((cut[0], cut[1]))

        root = {  # 根节点
            "x_left": cuts[0][0] - 1,
            "x_right": cuts[-1][1] + 1,
            "r_top": -1,
            "r_bottom": -1,
            "units": [],
            "children": [],
        }
        completed_nodes = [root]  # 已经完成结束的节点
        now_nodes = []  # 当前正在考虑的节点。无顺序

        # ========== 结束一个节点，加入节点树 ==========
        def complete(node):
            node_r = node["x_right"] - 2  # 当前节点右边界
            max_nodes = []  # 符合父节点条件的，最低的完成节点列表
            max_r = -2  # 符合父节点条件的最低行数
            # 在完成列表中，寻找父节点
            for com_node in completed_nodes:
                # 父节点的垂直投影必须包含当前右界
                if node_r < com_node["x_left"] or node_r > com_node["x_right"] + 0.0001:
                    continue
                # 父节点底部必须在当前之上
                if com_node["r_bottom"] >= node["r_top"]:
                    continue
                # 遇到更低的符合条件节点
                if com_node["r_bottom"] > max_r:
                    max_r = com_node["r_bottom"]
                    max_nodes = [com_node]
                    continue
                # 遇到同样低的符合条件节点
                if com_node["r_bottom"] == max_r:
                    max_nodes.append(com_node)
                    continue
            # 在最低列表中，寻找最右的节点作为父节点
            max_node = max(max_nodes, key=lambda n: n["x_right"])
            max_node["children"].append(node)  # 加入父节点
            completed_nodes.append(node)  # 加入完成列表

        # ========== 遍历每行，更新节点树 ==========
        for r_i, row in enumerate(rows):
            row_gaps = rows_gaps[r_i]  # 当前行的间隙组
            u_i = g_i = 0  # 当前考察的 文本块、间隙下标

            # ========== 检查是否有正在考虑的节点 可以结束 ==========
            new_nodes = []
            for node in now_nodes:  # 遍历节点
                l_flag = r_flag = False  # 标记节点左右边缘是否延续
                completed_flag = False  # 标记节点是否可以结束
                x_left = node["x_left"]  # 左右边缘坐标
                x_right = node["x_right"]
                for gap in row_gaps:  # 遍历该行所有间隙
                    if gap[1] == x_left:  # 节点左边缘被间隙右侧延续
                        l_flag = True
                    if gap[0] == x_right:  # 右边缘被间隙左侧延续
                        r_flag = True
                    # 任意间隙在本节点下方，打断本节点
                    if x_left <


path, FilterQueryImpl<V>(context).apply(block), context))
	}

	@DangerousMongoApi
	@LowLevelApi
	private class ElementMatchBsonNodeNode<T>(
		val target: Path,
		val expression: BsonNode,
		context: BsonContext,
	) : FilterBsonNodeNode(context) {

		override fun simplify(): AbstractBsonNode =
			ElementMatchBsonNodeNode<T>(target, expression.simplify()
				?: OrFilterBsonNodeNode<T>(emptyList(), context), context)

		override fun write(writer: BsonFieldWriter) = with(writer) {
			writeDocument(target.toString()) {
				writeDocument("\$elemMatch") {
					expression.writeTo(this)
				}
			}
		}
	}

	// endregion
	// region $all

	@OptIn(LowLevelApi::class, DangerousMongoApi::class)
	@KtMongoDsl
	override infix fun <V> Field<T, Collection<V>>.containsAll(values: Collection<V>) {
		accept(ArrayAllBsonNodeNode(path, values, context))
	}

	@LowLevelApi
	private class ArrayAllBsonNodeNode<T>(
		val path: Path,
		val values: Collection<T>,
		context: BsonContext,
	) : FilterBsonNodeNode(context) {

		override fun write(writer: BsonFieldWriter) = with(writer) {
			writeDocument(path.toString()) {
				writeArray("\$all") {
					for (value in values) {
						writeObjectSafe(value)
					}
				}
			}
		}
	}

	// endregion
	// region $size

	@OptIn(LowLevelApi::class, DangerousMongoApi::class)
	@KtMongoDsl
	override fun Field<T, Collection<*>>.size(size: Int) {
		accept(ArraySizeBsonNode<T>(path, size, context))
	}

	@LowLevelApi
	private class ArraySizeBsonNode<T>(
		val path: Path,
		val size: Int,
		context: BsonContext,
	) : FilterBsonNodeNode(context) {

		override fun write(writer: BsonFieldWriter) = with(writer) {
			writeDocument(path.toString()) {
				writeInt32("\$size", size)
			}
		}
	}

	// endregion
	// region $expr

	@OptIn(LowLevelApi::class, DangerousMongoApi::class)
	@KtMongoDsl
	override fun expr(block: AggregationOperators.() -> Value<T & Any, Boolean>) {
		val value = ExprEvaluator(context).block()
		accept(ExprBsonNodeNode(value, context))
	}

	@LowLevelApi
	private class ExprEvaluator(override val context: BsonContext) : AggregationOperators

	@OptIn(LowLevelApi::class)
	private class ExprBsonNodeNode<T>(
		val value: Value<*, T>,
		context: BsonContext,
	) : FilterBsonNodeNode(context) {

		@LowLevelApi
		override fun write(writer: BsonFieldWriter) = with(writer) {
			write("\$expr") {
				value.writeTo(this)
			}
		}
	}

	// endregion

}

/**
 * Creates an empty [FilterQuery].
 */
@LowLevelApi
fun <T> FilterQuery(context: BsonContext): FilterQuery<T> =
	FilterQueryImpl(context)
/*
 * Copyright (c) 2024-2025, OpenSavvy and contributors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package opensavvy.ktmongo.dsl.aggregation

import opensavvy.ktmongo.bson.BsonContext
import opensavvy.ktmongo.bson.BsonFieldWriter
import opensavvy.ktmongo.bson.BsonValueWriteable
import opensavvy.ktmongo.bs


android.+(Gigaset)[\\s\\-]+(Q.+)\\s+build/i                           // Gigaset Tablets\n            ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n            /\\s(tablet|tab)[;\\/]/i,                                             // Unidentifiable Tablet\n            /\\s(mobile)(?:[;\\/]|\\ssafari)/i                                     // Unidentifiable Mobile\n            ], [[TYPE, util.lowerize], VENDOR, MODEL], [\n\n            /(android.+)[;\\/].+build/i                                          // Generic Android Device\n            ], [MODEL, [VENDOR, 'Generic']]\n\n\n        /*//////////////////////////\n            // TODO: move to string map\n            ////////////////////////////\n\n            /(C6603)/i                                                          // Sony Xperia Z C6603\n            ], [[MODEL, 'Xperia Z C6603'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [\n            /(C6903)/i                                                          // Sony Xperia Z 1\n            ], [[MODEL, 'Xperia Z 1'], [VENDOR, 'Sony'], [TYPE, MOBILE]], [\n\n            /(SM-G900[F|H])/i                                                   // Samsung Galaxy S5\n            ], [[MODEL, 'Galaxy S5'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n            /(SM-G7102)/i                                                       // Samsung Galaxy Grand 2\n            ], [[MODEL, 'Galaxy Grand 2'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n            /(SM-G530H)/i                                                       // Samsung Galaxy Grand Prime\n            ], [[MODEL, 'Galaxy Grand Prime'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n            /(SM-G313HZ)/i                                                      // Samsung Galaxy V\n            ], [[MODEL, 'Galaxy V'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n            /(SM-T805)/i                                                        // Samsung Galaxy Tab S 10.5\n            ], [[MODEL, 'Galaxy Tab S 10.5'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [\n            /(SM-G800F)/i                                                       // Samsung Galaxy S5 Mini\n            ], [[MODEL, 'Galaxy S5 Mini'], [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n            /(SM-T311)/i                                                        // Samsung Galaxy Tab 3 8.0\n            ], [[MODEL, 'Galaxy Tab 3 8.0'], [VENDOR, 'Samsung'], [TYPE, TABLET]], [\n\n            /(T3C)/i                                                            // Advan Vandroid T3C\n            ], [MODEL, [VENDOR, 'Advan'], [TYPE, TABLET]], [\n            /(ADVAN T1J\\+)/i                                                    // Advan Vandroid T1J+\n            ], [[MODEL, 'Vandroid T1J+'], [VENDOR, 'Advan'], [TYPE, TABLET]], [\n            /(ADVAN S4A)/i                                                      // Advan Vandroid S4A\n            ], [[MODEL, 'Vandroid S4A'], [VENDOR, 'Advan'], [TYPE, MOBILE]], [\n\n            /(V972M)/i                                                          // ZTE V972M\n            ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n\n            /(i-mobile)\\s(IQ\\


pg = pg or {}
pg.world_expedition_data = {
	[210000] = {
		id = 210000,
		expedition_sairenvalueC = 0,
		exp_player = 8000,
		failed_morale = 1,
		battle_spine_size = 0,
		bgm = "Battle-1",
		battle_character = "",
		morale_limit = 3,
		expedition_sairenvalueA = -2000,
		expedition_sairenvalueB = -2000,
		battle_type = 0,
		exp_world = {
			{
				1,
				200
			},
			{
				2,
				250
			},
			{
				3,
				300
			},
			{
				4,
				350
			},
			{
				5,
				400
			},
			{
				6,
				450
			},
			{
				7,
				500
			}
		},
		exp_commander_world = {
			{
				1,
				1
			},
			{
				2,
				1
			},
			{
				3,
				2
			},
			{
				4,
				2
			},
			{
				5,
				3
			},
			{
				6,
				3
			},
			{
				7,
				4
			}
		},
		award_display_world = {
			{
				1,
				{
					{
						2,
						150002
					},
					{
						2,
						150001
					},
					{
						2,
						150000
					},
					{
						12,
						201
					},
					{
						12,
						100
					}
				}
			},
			{
				2,
				{
					{
						2,
						150002
					},
					{
						2,
						150001
					},
					{
						2,
						150000
					},
					{
						12,
						201
					},
					{
						12,
						100
					}
				}
			},
			{
				3,
				{
					{
						2,
						150002
					},
					{
						2,
						150001
					},
					{
						2,
						150000
					},
					{
						12,
						201
					},
					{
						12,
						100
					}
				}
			},
			{
				4,
				{
					{
						2,
						150002
					},
					{
						2,
						150001
					},
					{
						2,
						150000
					},
					{
						12,
						201
					},
					{
						12,
						100
					}
				}
			},
			{
				5,
				{
					{
						2,
						150002
					},
					{
						2,
						150001
					},
					{
						2,
						150000
					},
					{
						12,
						201
					},
					{
						12,
						100
					}
				}
			},
			{
				6,
				{
					{
						2,
						150002
					},
					{
						2,
						150001
					},
					{
						2,
						150000
					},
					{
						12,
						201
					},
					{
						12,
						100
					}
				}
			},
			{
				7,
				{
					{
						2,
						150002
					},
					{
						2,
						150001
					},
					{
						2,
						150000
					},
					{
						12,
						201
					},
					{
						12,
						100
					}
				}
			},
			{
				8,
				{
					{
						2,
						150002
					},
					{
						2,
						150001
					},
					{
						2,
						150000
					},
					{


len() < 2 {
        panic!("Must have at least 2 samples");
    }

    let start = samples.first().unwrap().nm;
    let end = samples.last().unwrap().nm;
    // FIXME: try and round to integer wavelengths here?
    let interval = calculate_interval(samples);
    SpdShape::<f64> {
        start,
        end,
        interval,
    }
}

fn spd_to_xyz_integration(
    spd: &VSPD,
    illuminant: &VSPD,
    cmf: &CMF,
    shape: SpdShape<f64>,
) -> XYZf64 {
    // align everything to the default shape
    let cmf_x = cmf.x_bar.align(shape);
    let cmf_y = cmf.y_bar.align(shape);
    let cmf_z = cmf.z_bar.align(shape);
    let illuminant = illuminant.align(shape);
    let spd = spd.align(shape);

    // Since we're guaranteeing uniform SPDs the dw terms cancel out in the
    // integral, but we include them anyway since it keeps us closer to the
    // colour-science result
    let dw = match shape.interval {
        Interval::Uniform(i) => i,
        Interval::Varying => {
            panic!("Cannot integrate a varying VSPD");
        }
    };

    let k: f64 = 100.0f64
        / illuminant
            .values()
            .zip(cmf_y.values())
            .map(|(i, y)| i * y * dw)
            .sum::<f64>();

    let x = k * izip!(spd.values(), illuminant.values(), cmf_x.values())
        .map(|(s, i, c)| s * i * c * dw)
        .sum::<f64>();
    let y = k * izip!(spd.values(), illuminant.values(), cmf_y.values())
        .map(|(s, i, c)| s * i * c * dw)
        .sum::<f64>();
    let z = k * izip!(spd.values(), illuminant.values(), cmf_z.values())
        .map(|(s, i, c)| s * i * c * dw)
        .sum::<f64>();
    xyz(x, y, z)
}

fn spd_to_xyz_tristimulus_weighting_factors_astme308(
    spd: &VSPD,
    illuminant: &VSPD,
    cmf: &CMF,
) -> XYZf64 {
    // get interval - uniform only
    let interval = match spd.shape.interval {
        Interval::Uniform(i) => i,
        Interval::Varying => {
            panic!("sd_to_xyz_10nm requires a uniform SPD");
        }
    };

    // align illuminant to cmf
    let illuminant = if illuminant.shape != cmf.shape() {
        illuminant.align(cmf.shape())
    } else {
        illuminant.clone()
    };

    // trim spd to cmf boundaries
    let spd = spd.trim(cmf.shape());

    let w = tristimulus_weighting_factors_astme2022(
        &cmf,
        &illuminant,
        SpdShape::new(cmf.shape().start, cmf.shape().end, interval),
    );
    let start_w = cmf.shape().start;
    let end_w = cmf.shape().start + interval * (w.0.len() - 1) as f64;
    let w = adjust_tristimulus_weighting_factors_astme308(
        &w.0,
        &w.1,
        &w.2,
        SpdShape::new(start_w, end_w, interval),
        spd.shape,
    );

    let x =
        w.0.iter()
            .zip(spd.values())
            .map(|(w, r)| w * r)


5,6,7,8,9,10}

local PROOF_GEN_MULTI_OUT = O.from_hex('b1f468aec2001c4f54cb56f707c6222a43e5803a25b2253e67b2210ab2ef9eab52db2d4b379935c4823281eaf767fd37b08ce80dc65de8f9769d27099ae649ad4c9b4bd2cc23edcba52073a298087d2495e6d57aaae051ef741adf1cbce65c64a73c8c97264177a76c4a03341956d2ae45ed3438ce598d5cda4f1bf9507fecef47855480b7b30b5e4052c92a4360110c67327365763f5aa9fb85ddcbc2975449b8c03db1216ca66b310f07d0ccf12ab460cdc6003b677fed36d0a23d0818a9d4d098d44f749e91008cf50e8567ef936704c8277b7710f41ab7e6e16408ab520edc290f9801349aee7b7b4e318e6a76e028e1dea911e2e7baec6a6a174da1a22362717fbae1cd961d7bf4adce1d31c2ab')

local pg_multi_output = bbs.proof_gen(ciphersuite, O.from_hex(PUBLIC_KEY), VALID_MULTI_SIGNATURE, O.from_hex(HEADER), PRESENTATION_HEADER, MULTI_MSG_ARRAY, DISCLOSED_INDEXES)
assert(PROOF_GEN_MULTI_OUT == pg_multi_output)

print("Test ProofVerify")

assert( bbs.proof_verify(ciphersuite, O.from_hex(PUBLIC_KEY), pg_multi_output, O.from_hex(HEADER), PRESENTATION_HEADER, MULTI_MSG_ARRAY, DISCLOSED_INDEXES ) == true)

print("Test case 2 : disclose some messages")
--disclosed (messages in index 0, 2, 4 and 6, in that order)

local disclosed_some_indexes = {1,3,5,7}

local PROOF_GEN_MULTI_D_OUT = O.from_hex('a2ed608e8e12ed21abc2bf154e462d744a367c7f1f969bdbf784a2a134c7db2d340394223a5397a3011b1c340ebc415199462ba6f31106d8a6da8b513b37a47afe93c9b3474d0d7a354b2edc1b88818b063332df774c141f7a07c48fe50d452f897739228c88afc797916dca01e8f03bd9c5375c7a7c59996e514bb952a436afd24457658acbaba5ddac2e693ac481356918cd38025d86b28650e909defe9604a7259f44386b861608be742af7775a2e71a6070e5836f5f54dc43c60096834a5b6da295bf8f081f72b7cdf7f3b4347fb3ff19edaa9e74055c8ba46dbcb7594fb2b06633bb5324192eb9be91be0d33e453b4d3127459de59a5e2193c900816f049a02cb9127dac894418105fa1641d5a206ec9c42177af9316f433417441478276ca0303da8f941bf2e0222a43251cf5c2bf6eac1961890aa740534e519c1767e1223392a3a286b0f4d91f7f25217a7862b8fcc1810cdcfddde2a01c80fcc90b63


^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIiET_i_l178.omp_outlined
// CHECK19-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[A:%.*]], i32 noundef [[AA:%.*]], ptr noundef nonnull align 4 dereferenceable(40) [[B:%.*]]) #[[ATTR0]] {
// CHECK19-NEXT:  entry:
// CHECK19-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 4
// CHECK19-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 4
// CHECK19-NEXT:    [[A_ADDR:%.*]] = alloca i32, align 4
// CHECK19-NEXT:    [[AA_ADDR:%.*]] = alloca i32, align 4
// CHECK19-NEXT:    [[B_ADDR:%.*]] = alloca ptr, align 4
// CHECK19-NEXT:    [[DOTOMP_IV:%.*]] = alloca i64, align 8
// CHECK19-NEXT:    [[TMP:%.*]] = alloca i64, align 4
// CHECK19-NEXT:    [[DOTOMP_LB:%.*]] = alloca i64, align 8
// CHECK19-NEXT:    [[DOTOMP_UB:%.*]] = alloca i64, align 8
// CHECK19-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i64, align 8
// CHECK19-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
// CHECK19-NEXT:    [[I:%.*]] = alloca i64, align 8
// CHECK19-NEXT:    store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 4
// CHECK19-NEXT:    store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 4
// CHECK19-NEXT:    store i32 [[A]], ptr [[A_ADDR]], align 4
// CHECK19-NEXT:    store i32 [[AA]], ptr [[AA_ADDR]], align 4
// CHECK19-NEXT:    store ptr [[B]], ptr [[B_ADDR]], align 4
// CHECK19-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[B_ADDR]], align 4
// CHECK19-NEXT:    store i64 0, ptr [[DOTOMP_LB]], align 8
// CHECK19-NEXT:    store i64 6, ptr [[DOTOMP_UB]], align 8
// CHECK19-NEXT:    store i64 1, ptr [[DOTOMP_STRIDE]], align 8
// CHECK19-NEXT:    store i32 0, ptr [[DOTOMP_IS_LAST]], align 4
// CHECK19-NEXT:    [[TMP1:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 4
// CHECK19-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP1]], align 4
// CHECK19-NEXT:    call void @__kmpc_for_static_init_8(ptr @[[GLOB1]], i32 [[TMP2]], i32 34, ptr [[DOTOMP_IS_LAST]], ptr [[DOTOMP_LB]], ptr [[DOTOMP_UB]], ptr [[DOTOMP_STRIDE]], i64 1, i64 1)
// CHECK19-NEXT:    [[TMP3:%.*]] = load i64, ptr [[DOTOMP_UB]], align 8
// CHECK19-NEXT:    [[CMP:%.*]] = icmp sgt i64 [[TMP3]], 6
// CHECK19-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
// CHECK19:       cond.true:
// CHECK19-NEXT:    br label [[COND_END:%.*]]
// CHECK19:       cond.false:
// CHECK19-NEXT:    [[TMP4:%.*]] =


](https://github.com/Junnplus)! [#1880](https://github.com/wezterm/wezterm/pull/1880)
* Attaching multiplexer domains now attaches the first window as a tab in the active window, rather than opening a new window. [#1874](https://github.com/wezterm/wezterm/issues/1874)
* [AttachDomain](config/lua/keyassignment/AttachDomain.md) and [DetachDomain](config/lua/keyassignment/DetachDomain.md) key assignments
* Specifying a domain name in a [SpawnCommand](config/lua/SpawnCommand.md) will cause that domain to be attached if it is in the detached state. This is useful when combined with [SwitchToWorkspace](config/lua/keyassignment/SwitchToWorkspace.md).
* X11: wezterm now sets `_NET_WM_NAME` in addition to `WM_NAME` for clients that don't know how to fallback
* [treat_east_asian_ambiguous_width_as_wide](config/lua/config/treat_east_asian_ambiguous_width_as_wide.md) for control over how ambiguous width characters are resolved. [#1888](https://github.com/wezterm/wezterm/issues/1888)
* [clean_exit_codes](config/lua/config/clean_exit_codes.md) config to fine tune [exit_behavior](config/lua/config/exit_behavior.md) [#1889](https://github.com/wezterm/wezterm/issues/1889)
* [ClearSelection](config/lua/keyassignment/ClearSelection.md) key assignment [#1900](https://github.com/wezterm/wezterm/issues/1900)
* `wezterm cli list --format json` and `wezterm cli list-clients --format json` allow retrieving data in json format. Thanks to [@ratmice](https://github.com/ratmice)! [#1911](https://github.com/wezterm/wezterm/pull/1911)
* macOS, Windows, Wayland: you may now drag and drop files from other programs and have their paths paste into the terminal. The new [quote_dropped_files](config/lua/config/quote_dropped_files.md) option controls how the file names are quoted. Thanks to [@junnplus](https://github.com/junnplus), [@datasone](https://github.com/datasone) and [@Funami580](https://github.com/Funami580)! [#1868](https://github.com/wezterm/wezterm/pull/1868) [#1953](https://github.com/wezterm/wezterm/pull/1953) [#2148](https://github.com/wezterm/wezterm/pull/2148)
* The mouse scroll wheel now cycles between tabs when hovering over the tab. Thanks to [@junnplus](https://github.com/junnplus)! [#1726](https://github.com/wezterm/wezterm/issues/1726)
* Holding down `ALT` while dragging the left button will select a rectangular block. It is also possible to use `ALT+SHIFT` to select a rectangular block. [ExtendSelectionToMouseCursor](config/lua/keyassignment/ExtendSelectionToMouseCursor.md) and [SelectTextAtMouseCursor](config/lua/keyassignment/SelectTextAtMouseCursor.md) now accept `"Block"` as a selection mode. Thanks to [@Funami580](https://github.com/Funami580) for helping! [#1361](https://github.com/wezterm/wezterm/issues/1361)
* In Copy Mode, `CTRL-v` will enable rectangular block selection mode. [#1656](https://github.com/wezterm/wezterm/issues/1656)
* In Copy Mode, `SHIFT-v` will enable line selection mode. Thanks to [@bew](https://github.com/bew)! [#2086](https://github.com/wezterm/wezterm/pull/2086)
* In Copy Mode, `o` and `O` can be used to move the cursor to the other end of the selection, as in vim. Thanks to [@bew](https://github


.
    /// drop(block);
    ///
    /// // Use `instr_seq` to get the builder for the block again, and build
    /// // some more things onto it.
    /// let mut block = builder.instr_seq(id);
    /// block
    ///     .i32_const(42)
    ///     .drop();
    /// ```
    pub fn instr_seq(&mut self, id: InstrSeqId) -> InstrSeqBuilder {
        InstrSeqBuilder { id, builder: self }
    }

    /// Create a new instruction sequence that is unreachable.
    ///
    /// It is your responsibility to
    ///
    /// * make a `Instr::Block`, `Instr::Loop`, or `Instr::IfElse` that uses
    ///   this instruction sequence, and
    ///
    /// * append that `Instr` into a parent instruction sequence via
    ///   `InstrSeqBuilder::instr` or `InstrSeqBuilder::instr_at`
    ///
    /// or else this built up instruction sequence will never be used.
    ///
    /// # Example
    ///
    /// ```
    /// use walrus::ir::*;
    ///
    /// let mut module = walrus::Module::default();
    /// let mut builder = walrus::FunctionBuilder::new(&mut module.types, &[], &[]);
    ///
    /// // Create an empty, dangling instruction sequemce.
    /// let mut seq = builder.dangling_instr_seq(None);
    /// let seq_id = seq.id();
    ///
    /// // Do stuff with the sequence...
    /// drop(seq);
    ///
    /// // Finally, make our instruction sequence reachable by adding an
    /// // block/loop/if-else instruction that uses it to a reachable instruction
    /// // sequence.
    /// builder
    ///     .func_body()
    ///     .instr(Block { seq: seq_id });
    /// ```
    pub fn dangling_instr_seq(&mut self, ty: impl Into<InstrSeqType>) -> InstrSeqBuilder {
        let ty = ty.into();
        let id = self.arena.alloc_with_id(|id| InstrSeq::new(id, ty));
        InstrSeqBuilder { id, builder: self }
    }

    /// Finishes this builder, wrapping it all up and inserting it into the
    /// specified `Module`.
    ///
    /// # Example
    ///
    /// ```
    /// let mut module = walrus::Module::default();
    /// let mut builder = walrus::FunctionBuilder::new(&mut module.types, &[], &[]);
    ///
    /// builder
    ///     .func_body()
    ///     .i32_const(1234)
    ///     .drop();
    ///
    /// let function_id = builder.finish(vec![], vec![], &mut module.funcs);
    /// # let _ = function_id;
    /// ```
    pub fn finish(
        self,
        args: Vec<LocalId>,
        locals: Vec<LocalId>,
        funcs: &mut ModuleFunctions,
    ) -> FunctionId {
        let func = LocalFunction::new(args, locals, self);
        funcs.add_local(func)
    }

    /// Returns the [crate::LocalFunction] built by this builder.
    pub fn local_func(self, args: Vec<LocalId>, locals: Vec<LocalId>) -> LocalFunction {
        LocalFunction::new(args, locals, self)
    }
}

/// A builder returned by instruction sequence-construction methods to build up
/// instructions within a block/loop/if-else over time.
#[derive(Debug)]
pub struct InstrSeqBuilder<'a> {
    id: InstrSeqId,
    builder: &'a mut FunctionBuilder,
}

impl InstrSeqBuilder<'_> {
    /// Returns the id of the instruction sequence that we're building.
    #[inline]
    pub fn id(&self) -> InstrSeqId {
        self.id
    }

    /// Get this instruction sequence's instructions.
    pub fn instrs(&self) -> &[(Instr, InstrLocId)] {


from typing import List, Optional, Tuple
from sqlalchemy import select, update, func
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.document import DocumentDB, DocumentCreate
from app.repositories import BaseRepository
import time

class DocumentRepository(BaseRepository):
    """文档仓库，处理文档块的CRUD操作"""

    async def create(self, document: DocumentCreate) -> DocumentDB:
        """创建文档记录"""
        try:
            db = await self._ensure_session()

            current_time = int(time.time())
            db_document = DocumentDB(
                **document.model_dump(),
                create_time=current_time,
                update_time=current_time
            )
            db.add(db_document)
            await db.commit()
            await db.refresh(db_document)
            return db_document
        finally:
            await self._cleanup_session()

    async def create_many(self, documents: List[DocumentCreate]) -> List[DocumentDB]:
        """批量创建文档记录"""
        try:
            db = await self._ensure_session()

            current_time = int(time.time())
            db_documents = [
                DocumentDB(
                    **doc.model_dump(),
                    create_time=current_time,
                    update_time=current_time
                )
                for doc in documents
            ]
            db.add_all(db_documents)
            await db.commit()
            for doc in db_documents:
                await db.refresh(doc)
            return db_documents
        finally:
            await self._cleanup_session()

    async def get_by_file_id(self, file_id: int) -> List[DocumentDB]:
        """获取指定文件的所有文档块"""
        try:
            db = await self._ensure_session()

            query = select(DocumentDB).where(
                DocumentDB.file_id == file_id,
                DocumentDB.deleted == False
            ).order_by(DocumentDB.sequence)
            result = await db.execute(query)
            return list(result.scalars().all())
        finally:
            await self._cleanup_session()

    async def get_by_file_id_paginated(self, file_id: int, page: int = 1, page_size: int = 10) -> Tuple[List[DocumentDB], int]:
        """分页获取指定文件的文档块"""
        try:
            db = await self._ensure_session()

            # 计算总记录数
            count_query = select(func.count()).where(
                DocumentDB.file_id == file_id,
                DocumentDB.deleted == False
            )
            total_count = await db.execute(count_query)
            total_count = total_count.scalar() or 0

            # 如果没有记录，直接返回
            if total_count == 0:
                return [], 0

            # 计算偏移量
            offset = (page - 1) * page_size

            # 查询分页数据
            query = select(DocumentDB).where(
                DocumentDB.file_id == file_id,
                DocumentDB.deleted == False
            ).order_by(DocumentDB.sequence).offset(offset).limit(page_size)

            result = await db.execute(query)
            documents = list(result.scalars().all())

            return documents, total_count
        finally:
            await self._cleanup_session()

    async def get_by_id(self, document_id: int) -> Optional[DocumentDB]:
        """通过ID获取文档"""
        try:
            db = await self._ensure_session()

            query = select(DocumentDB).where(
                DocumentDB.id == document_id,
                DocumentDB.deleted == False
            )
            result = await db.execute(query)
            return result.scalar_one_or_none()
        finally:
            await self._cleanup_session()

    async def delete(self, document_id: int) -> bool:
        """软删除指定文档"""
        try:
            db = await self._ensure_session()

            current_time = int(time.time())
            stmt = update(DocumentDB).where(
                DocumentDB.id == document_id,
                DocumentDB.deleted == False
            ).values(
                deleted=True,
                update_time=current_time
            )
            result = await db.execute(stmt)
            await db.commit()
            return result.rowcount > 0
        finally:
            await self._cleanup_session()

    async def delete_by_file_id(self, file_id: int) -> int:
        """删除指定文件的


g = {
			Color = "ElementBorder",
		},
	})

	Element.Frame = New("TextButton", {
		Size = UDim2.new(1, 0, 0, 0),
		BackgroundTransparency = 0.89,
		BackgroundColor3 = Color3.fromRGB(130, 130, 130),
		Parent = Parent,
		AutomaticSize = Enum.AutomaticSize.Y,
		Text = "",
		LayoutOrder = 7,
		ThemeTag = {
			BackgroundColor3 = "Element",
			BackgroundTransparency = "ElementTransparency",
		},
	}, {
		New("UICorner", {
			CornerRadius = UDim.new(0, 4),
		}),
		Element.Border,
		Element.LabelHolder,
	})

	function Element:SetTitle(Set)
		Element.TitleLabel.Text = Set
	end

	function Element:SetDesc(Set)
		if Set == nil then
			Set = ""
		end
		if Set == "" then
			Element.DescLabel.Visible = false
		else
			Element.DescLabel.Visible = true
		end
		Element.DescLabel.Text = Set
	end

	function Element:Destroy()
		Element.Frame:Destroy()
	end

	Element:SetTitle(Title)
	Element:SetDesc(Desc)

	if Hover then
		local Themes = Root.Themes
		local Motor, SetTransparency = Creator.SpringMotor(
			Creator.GetThemeProperty("ElementTransparency"),
			Element.Frame,
			"BackgroundTransparency",
			false,
			true
		)

		Creator.AddSignal(Element.Frame.MouseEnter, function()
			SetTransparency(Creator.GetThemeProperty("ElementTransparency") - Creator.GetThemeProperty("HoverChange"))
		end)
		Creator.AddSignal(Element.Frame.MouseLeave, function()
			SetTransparency(Creator.GetThemeProperty("ElementTransparency"))
		end)
		Creator.AddSignal(Element.Frame.MouseButton1Down, function()
			SetTransparency(Creator.GetThemeProperty("ElementTransparency") + Creator.GetThemeProperty("HoverChange"))
		end)
		Creator.AddSignal(Element.Frame.MouseButton1Up, function()
			SetTransparency(Creator.GetThemeProperty("ElementTransparency") - Creator.GetThemeProperty("HoverChange"))
		end)
	end

	return Element
end


         let mut i = 0;
            let nav = nav;
            line.split(",")
                .collect::<Vec<&str>>()
                .into_iter()
                .for_each(|x| {
                    i += 1;
                    hash.insert(nav[i - 1].clone(), String::from(x));
                });
            return hash;
        })
        .collect()
}

fn show_help() {
    print!(
        "
                                               Created by perzanko
                                                              ----
 .o88b. .d8888. db    db .d888b.    d88b .d8888.  .d88b.  d8b   db
d8P  Y8 88'  YP 88    88 VP  `8D    `8P' 88'  YP .8P  Y8. 888o  88
8P      `8bo.   Y8    8P    odD'     88  `8bo.   88    88 88V8o 88
8b        `Y8b. `8b  d8'  .88'       88    `Y8b. 88    88 88 V8o88
Y8b  d8 db   8D  `8bd8'  j88.    db. 88  db   8D `8b  d8' 88  V888
 `Y88P' `8888Y'    YP    888888D Y8888P  `8888Y'  `Y88P'  VP   V8P

This tool provides simple and efficient csv to json conversion.

Usage: csv2json --input [path] --output [path]

  -h, --help                          print this help
  -i, --input                         input path of CSV file
  -o, --output                        output path of converted JSON

"
    )
}

fn is_str_empty(text: &String) -> bool {
    if text.trim().len() == 0 {
        true
    } else {
        false
    }
}

fn get_elapsed_time(start_time: Instant) -> String {
    let x = start_time.elapsed();
    ((x.as_secs() * 1_000) + (x.subsec_nanos() / 1_000_000) as u64).to_string()
}
<gh_stars>0
//! # Web Push
//!
//! A library for creating and sending push notifications to a web browser. For
//! content payload encryption it uses [RFC8188](https://datatracker.ietf.org/doc/html/rfc8188).
//! The client is asynchronous and can run on any executor. An optional [`hyper`](https://crates.io/crates/hyper) based client is
//! available with the feature `hyper-client`.
//!
//! # Example
//!
//! ```no_run
//! # use web_push::*;
//! # use base64::URL_SAFE;
//! # use std::fs::File;
//! # #[tokio::main]
//! # async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
//! let endpoint = "https://updates.push.services.mozilla.com/wpush/v1/...";
//! let p256dh = "key_from_browser_as_base64";
//! let auth = "auth_from_browser_as_base64";
//!
//! //You would likely get this by deserializing a browser `pushSubscription` object.
//! let subscription_info = SubscriptionInfo::new(
//!     endpoint,
//!     p256dh,
//!     auth
//! );
//!
//! //Read signing material for payload.
//! let file = File::open("private.pem").unwrap();
//! let mut sig_builder = VapidSignatureBuilder::from_pem(file, &subscription_info)?.build()?;
//!
//! //Now add payload and encrypt.
//! let mut builder = WebPushMessageBuilder::new(&subscription_info)?;
//! let content = "Encrypted payload to be sent in the notification".as_bytes();
//! builder


�市补给和接收囚犯。
- 曼斯菲尔德监狱是哥伦比亚某个州首都特批的“试点监狱”，实际上是典狱长伦道尔的“赚钱机器”，通过收钱提供优待或虐待，以及操控囚犯作为廉价劳动力。
- 监狱的医务室和停尸间是连在一起的，且医生和入殓师是同一个人，所以囚犯和狱警都戏称医务室为“停尸间”。
- 囚犯们会在监狱里偷偷制作武器。
- C区塔的顶部有一个不为人知的主控室，可以控制塔的快速下沉和监狱断电。
- 曼斯菲尔德监狱的山体下层有被废弃的建筑结构和通道，其中一条靠近停尸间，可以通往地表。
- 杰斯顿的身体经过改造，皮肤下有莱茵生命的金属板，能够抵御攻击。他曾向塞雷娅所在的防卫科投递简历但未被录取。
- 缪尔赛思与赫默会面时使用的是一个“分身”，本体不在现场，其分身可以化为水离开。
- 赫默的老师帕尔维斯曾给她一些关于公司和地方的数据，这些数据帮助她发现了西蒙家族的线索。
- 梅尔对能量科主任感到害怕，因为感觉对方只在意研究成果的用途和利益。
## 关键人物
赫默;缪尔赛思;梅尔;安东尼;卡夫卡;罗宾;杜玛;杰斯顿;塞雷娅;米娜;巴顿;伦道尔;斐尔迪南
## 角色剧情概括
-   **[赫默](../char_v3/char_108_silent.md)([v1](../chars/char_108_silent.md))**: 本次事件的主角之一，莱茵生命结构科研究员（现为罗德岛干员）。因对莱茵生命和哥伦比亚现实的怀疑（特别是“炎魔”事件后），她利用老师留下的数据追查到安东尼及其家族的线索，并策划了本次越狱以了解更多真相。她雇佣卡夫卡和米娜潜入监狱协助安东尼。与缪尔赛思会面时，她坦诚自己的动机和对公司的不信任，经历了得知哥伦比亚黑暗面的痛苦挣扎。最终，她拒绝了缪尔赛思以安东尼为筹码换取利益的提议，坚持认为安东尼是一个人而非线索，选择了自己


 - 100, If below x (depends upon personality) for 7 days, pet run aways | If x (depends upon personality), pet runs away instantly
  happinessCap: {
    type: Number,
    min: 30,
    max: 100,
    default: 100,
  }, // Cap for happiness, will decrease when pet is unfed
  hunger: {
    type: Number,
    default: 0,
    min: 0,
    max: 100,
  }, // If surpasses 100, your pet dies
  petUnhappyForHours: {
    type: Number,
    default: 0,
  }, // If x (depends upon personality), pet runs away
  toys: [String], // Toys will affect rate at which happiness drops/increases
});

// Schema Methods
petSchema.methods.petAge = async function() {
  this.age += 1;

  await this.save();
  return this.age;
};

petSchema.methods.notFedInHour = async function() {
  this.hunger +=
    this.personality === 1 || this.personality === 3
      ? 3
      : this.personality === 2 || this.personality === 4
      ? 5
      : 4;

  const hungerEndurability =
    this.personality === 1 || this.personality === 3
      ? 60
      : this.personality === 2 || this.personality === 4
      ? 40
      : 50;

  if (this.hunger >= hungerEndurability && this.happinessCap > 30)
    this.happinessCap -= 10;

  if (this.happinessCap < 30) this.happinessCap = 30;

  if (this.hunger > 100) this.hunger = 100;

  await this.save();
  return this.hunger;
};

petSchema.methods.notPlayedInHour = async function() {
  const Item = this.model('Item');
  const toys = await Item.find({ itemName: { $in: this.toys } });

  console.log(toys);

  let happinessToDeduct =
    this.personality === 2 || this.personality === 3
      ? 4
      : this.personality === 1 || this.personality === 4
      ? 6
      : 5;

  toys.forEach(t => {
    if (t.properties[2] === 'unhappiness_rate_decrease')
      happinessToDeduct -= t.properties[3];
  });

  this.happiness -= happinessToDeduct >= 1 ? happinessToDeduct : 1;

  if (this.happiness >= this.happinessCap) this.happiness = this.happinessCap;

  if (this.happiness < 0) this.happiness = 0;

  await this.save();
  return this.happiness;
};

petSchema.methods.petFed = async function() {
  this.hunger -=
    this.personality === 1 || this.personality === 3
      ? 40
      : this.personality === 2 || this.personality === 4
      ? 20
      : 30;

  const hungerEndurability =
    this.personality === 1 || this.personality === 3
      ? 70
      : this.personality === 2 || this.personality === 4
      ? 40
      : 50;

  if (this.hunger >= hungerEndurability) this.happinessCap = 100;

  if (this.huner < 0) this.hunger = 0;

  await this.save();
  return this.hunger;
};

petSchema.methods.petHappy = async function(rate) {
  const Item = this.model('Item');
  const toys = await Item.find({ itemName: { $in: this.toys } });

  let happinessToAdd =
    this.personality === 2 || this.personality === 3
      ? rate * 1.5
      : this.personality === 1 || this.personality === 4
      ? rate * 0.5
      : rate;

  if (toys.length > 0)
    toys.forEach(t => {
      if (t.properties[2] === 'happiness_increase')
        happinessToAdd += t.properties[3];
    });

  this.happiness += happinessToAdd;

  if (this.happiness >= this.happinessCap) this.happiness = this.h


 trị của các phần tử trong mảng. Dễ thấy, nếu \\(k\\) đủ nhỏ, độ phức tạp của sắp xếp nhanh sẽ hơn nhiều so với các thuật toán sắp xếp được nói ở trên.

## Thuật toán sắp xếp trong C++

Việc tự tay viết cả một thuật toán sắp xếp rất tốn thời gian và rất dễ xảy ra sai sót. Vì vậy ta có thể dùng hàm `sort` có sẵn trong thư viện C++.

Hàm `sort` của C++ sẽ sắp xếp các số trong khoảng \\([l, r)\\).

VD: sắp xếp các phần tử trong mảng `a` từ vị trí \\(0\\) đến \\(n - 1\\).
```C++
sort(a, a + n);
```

Hàm sort cũng có thể sắp xếp được `string`, với các kí tự được sắp xếp theo giá trị ASCII tương ứng:

```C++
string s = "sorting";
sort(s.begin(), s.end());
cout << s; // 'ginorst'
```

### Phép so sánh trong hàm sort C++

Hàm `sort` trong C++ yêu cầu một thao tác so sánh để có thể thực hiện việc so sánh các phần tử. Hầu hết các kiểu dữ liệu trong C++ đều có phép so sánh, ví dụ như `int` sắp xếp theo giá trị của nó.

Kiểu dữ liệu `pair` sẽ được sắp xếp theo giá trị của giá trị đầu tiên trong cặp giá trị: `first`. Nếu các `first` bằng nhau thì sẽ sắp xếp theo giá trị của `second`.

```C++
vector<pair<int, int>> v;
v.push_back({1, 5});
v.push_back({2, 3});
v.push_back({1, 2});
sort(v.begin(), v.end());
```

Sau khi sắp xếp xong mảng `v` sẽ có các phần tử được xắp xếp theo thứ tự lần lượt là `(1, 2)`, `(1, 5)`, `(2, 3)`.

### Hàm so sánh

Ta có thể viết hàm so sánh để sắp xếp các phần tử:

Ví dụ:

```C++
// Cấu trúc `phân số`
struct phanso {
	int x, y;
};

bool cmp(const phanso &a, const phanso &b){ // hàm so sánh
	return a.x * b.y < a.x * b.y;
}

int main(){
	vector<phanso> a = {{1, 2}, {2, 3}, {4, 2}};
	sort(a.


ession schemes are completely incompatible.

CAPABILITY_V0

public static final String[] CAPABILITY_V0

Values for capability indicator byte for Version 0

CAPABILITY_V1

public static final String[] CAPABILITY_V1

Values for capability indicator byte for Version 1.
  These are by bit position from right to left.

TILING_CAPABILITY_V1

public static final String[] TILING_CAPABILITY_V1

TILING_TYPE

public static final String[] TILING_TYPE

DQT_PRECISION

public static final String[] DQT_PRECISION

DAC_CLASS

public static final String[] DAC_CLASS

Skip navigation links

Overview

Package

Class

<a href="class-use/Jpeg


StackLimit = __rom_StackLimit;
	__StackTop = __rom_StackTop;
	PROVIDE(__stack = __rom_StackTop);
#endif

	/* Check if data + heap + stack exceeds RAM limit */
	ASSERT(__rom_StackLimit >= __rom_HeapLimit, "region RAM overflowed with stack")
	__free_rom_ram = __rom_StackLimit - __rom_HeapLimit;

	__rom_end = __rom_etext + SIZEOF(.rom_data);

	.rom_export_fn (ORIGIN(ROM) + LENGTH(ROM) - ROM_BUILD_INFO_SECTION_SIZE - ROM_EXPORT_FN_SECTION_SIZE - CRASH_DUMP_SECTION_SIZE
					- CUSTOM_PARAMETER_SECTION_SIZE) :
	{
		__export_fn_rom = .;
		KEEP(*(.export_fn))
		. = ROM_EXPORT_FN_SECTION_SIZE;
	} > ROM = 0x00000000

	.rom_build_info (ORIGIN(ROM) + LENGTH(ROM) - ROM_BUILD_INFO_SECTION_SIZE - CRASH_DUMP_SECTION_SIZE - CUSTOM_PARAMETER_SECTION_SIZE) :
	{
		KEEP(*(.build_info))
		. = ROM_BUILD_INFO_SECTION_SIZE;
	} > ROM = 0x00000000
	.crash_dump (ORIGIN(ROM) + LENGTH(ROM) - CRASH_DUMP_SECTION_SIZE - CUSTOM_PARAMETER_SECTION_SIZE) :
	{
		__crash_dump_start = .;
		. = CRASH_DUMP_SECTION_SIZE;
		__crash_dump_end = .;
	} > ROM = 0x00000000
	.custom_parameter (ORIGIN(ROM) + LENGTH(ROM) - CUSTOM_PARAMETER_SECTION_SIZE) :
	{
		__custom_parameter_start = .;
		. = CUSTOM_PARAMETER_SECTION_SIZE;
		__custom_parameter_end = .;
	} > ROM = 0x00000000

	ASSERT(ADDR(.rom_export_fn) >= __rom_end, "region ROM overflowed with .rom_export_fn")
	__free_rom = ADDR(.rom_export_fn) - __rom_end;
}


pi
import com.tencent.kuikly.compose.ui.node.KNode
import com.tencent.kuikly.compose.ui.node.RootNodeOwner
import com.tencent.kuikly.core.base.DeclarativeBaseView

/**
 * Composes the given composable into [RootNodeOwner]
 *
 * @param parent The parent composition reference to coordinate scheduling of composition updates
 *        If null then default root composition will be used.
 * @param getCompositionLocalContext getter for retrieving the top-level composition local context.
 * Can be backed by `mutableStateOf` to dynamically change top-level locals.
 * @param content A `@Composable` function declaring the UI contents
 */
@OptIn(ExperimentalComposeUiApi::class)
internal fun RootNodeOwner.setContent(
    parent: CompositionContext,
    getCompositionLocalContext: () -> CompositionLocalContext? = { null },
    content: @Composable () -> Unit,
): Composition {
    val applier =
        KuiklyApplier(owner.root) {
        }
    val composition = Composition(applier, parent)
    composition.setContent {
        getCompositionLocalContext().provide {
            ProvideCommonCompositionLocals(
                owner = owner,
                content = content,
            )
        }
    }
    return composition
}

@Composable
private fun CompositionLocalContext?.provide(content: @Composable () -> Unit) {
    if (this != null) {
        CompositionLocalProvider(this, content = content)
    } else {
        content()
    }
}

internal fun createSubcomposition(
    container: KNode<DeclarativeBaseView<*, *>>,
    parent: CompositionContext,
): ReusableComposition =
    ReusableComposition(
        KuiklyApplier(container) { },
        parent,
    )
/*
 * Copyright 2020 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.tencent.kuikly.compose.ui.node

import com.tencent.kuikly.compose.ui.geometry.MutableRect
import com.tencent.kuikly.compose.ui.geometry.Offset
import com.tencent.kuikly.compose.ui.graphics.Canvas
import com.tencent.kuikly.compose.ui.graphics.Matrix
import com.tencent.kuikly.compose.ui.graphics.ReusableGraphicsLayerScope
import com.tencent.kuikly.compose.ui.unit.IntOffset
import com.tencent.kuikly.compose.ui.unit.IntSize

/**
 * A layer returned by [Owner.createLayer] to separate drawn content.
 */
internal interface OwnedLayer {

    /**
     * Applies the new layer properties, causing this layer to be redrawn.
     */
    fun updateLayerProperties(scope: ReusableGraphicsLayerScope)

    /**
     * Returns `false` if [position] is outside the clipped region or `true` if clipping
     * is disabled or it is within the clipped region.
     */
    fun isInLayer(position: Offset): Boolean

    /**
     * Changes the position of the layer contents.
     */
    fun move(position: IntOffset)

    /**
     * Changes the size of the layer's drawn area.
     */
    fun resize(size: IntSize)

    /**
     * Causes the layer to be drawn into [canvas]
     */
    fun drawLayer(canvas: Canvas)

    /**
     * Updates the drawing on the current canvas.
     */
    fun updateDisplayList()

    /**
     * Asks to the layer to redraw itself without forcing all of its parents to red


entColor">
                        <path
                            d="M15 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm-9-2V7H4v3H1v2h3v3h2v-3h3v-2H6zm9 4c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" />
                    </svg>
                    Create Account

Get started with a new Nostr identity

                </button>

Connect with Nostr

                <button class="close-modal" onclick="hideConnectModal()">×</button>

Option 1: Use this connection string

                        Copy and paste this into any NIP-46 compatible app (nsec.app, Amber, etc.)

                    <textarea id="nostrConnectURI" readonly style="width: 100%; padding: 0.75rem; margin: 0.5rem 0; font-size: 0.875rem;
                                 height: 100px; resize: none; background: var(--bg-primary);
                                 color: var(--text-primary); border: 1px solid var(--border);
                                 border-radius: 8px; word-break: break-all;"></textarea>

                        <button class="copy-btn" onclick="copyNostrConnectURI()">Copy Connection String</button>
                        <button class="copy-btn" onclick="toggleQRDisplay()" style="background: var(--bg-secondary);">
                            Show QR Code
                        </button>

                        Listening for connection...

                        <div id="qrConnectionStatus" style="display: none; padding: 0.75rem;
                                                        background: var(--bg-primary);
                                                        border: 1px solid var(--accent);
                                                        border-radius: 8px; margin-top: 1rem;
                                                        color:


v, externalIP: %v, isSchedulable: %v", nodeList[i].ObjectMeta.Name, internalIP, externalIP, isSchedulable)
	}
	return nil
}

// IsNodeSchedulableAndUntainted returns true whether node is schedulable and untainted.
func IsNodeSchedulableAndUntainted(node *corev1.Node) bool {
	return isNodeSchedulable(node) && isNodeUntainted(node)
}

// Node is schedulable if:
// 1) doesn't have "unschedulable" field set
// 2) it's Ready condition is set to true
// 3) doesn't have NetworkUnavailable condition set to true
func isNodeSchedulable(node *corev1.Node) bool {
	nodeReady := isNodeConditionSetAsExpected(node, corev1.NodeReady, true)
	networkReady := isNodeConditionUnset(node, corev1.NodeNetworkUnavailable) ||
		isNodeConditionSetAsExpected(node, corev1.NodeNetworkUnavailable, false)
	return !node.Spec.Unschedulable && nodeReady && networkReady
}

// Tests whether node doesn't have any taint with "NoSchedule" or "NoExecute" effect.
func isNodeUntainted(node *corev1.Node) bool {
	for i := range node.Spec.Taints {
		if node.Spec.Taints[i].Effect == corev1.TaintEffectNoSchedule || node.Spec.Taints[i].Effect == corev1.TaintEffectNoExecute {
			return false
		}
	}
	return true
}

func isNodeConditionSetAsExpected(node *corev1.Node, conditionType corev1.NodeConditionType, wantTrue bool) bool {
	// Check the node readiness condition (logging all).
	for _, cond := range node.Status.Conditions {
		// Ensure that the condition type and the status matches as desired.
		if cond.Type == conditionType {
			if wantTrue == (cond.Status == corev1.ConditionTrue) {
				return true
			}
			klog.V(4).Infof("Condition %s of node %s is %v instead of %t. Reason: %v, message: %v",
				conditionType, node.Name, cond.Status == corev1.ConditionTrue, wantTrue, cond.Reason, cond.Message)
			return false
		}
	}
	klog.V(4).Infof("Couldn't find condition %v on node %v", conditionType, node.Name)
	return false
}

func isNodeConditionUnset(node *corev1.Node, conditionType corev1.NodeConditionType) bool {
	for _, cond := range node.Status.Conditions {
		if cond.Type == conditionType {
			return false
		}
	}
	return true
}

// GetMasterName returns master node name.
func GetMasterName(c clientset.Interface) (string, error) {
	nodeList, err := client.ListNodes(c)
	if err != nil {
		return "", err
	}
	for i := range nodeList {
		if system.IsMasterNode(nodeList[i].Name) {
			return nodeList[i].Name, nil
		}
	}
	return "", fmt.Errorf("master node not found")
}

// GetMasterIPs returns master node ips of the given type.
func GetMasterIPs(c clientset.Interface, addressType corev1.NodeAddressType) ([]string, error) {
	nodeList, err := client.ListNodes(c)
	if err != nil {
		return nil, err
	}
	var ips []string
	for i := range nodeList {
		if system.IsMasterNode(nodeList[i].Name) {
			for _, address := range nodeList[i].Status.Addresses {
				if address.Type == addressType && address.Address != "" {
					ips = append(ips, address.Address)
					break
				}
			}
		}
	}
	if len(ips) == 0 {
		return nil, fmt.Errorf("didn't find any %s master IPs", addressType)
	}
	return ips, nil


ool MyIconViewItem::acceptDrop(const QMimeSource *mime) const
{
    if (mime->provides("text/plain"))
        return true;
    return false;
}

void MyIconViewItem::dropped(QDropEvent *evt, const Q3ValueList<Q3IconDragItem>&)
{
    QString label;
    if (Q3TextDrag::decode(evt, label))
        setText(label);
}
//! [7]

//! [8]
(void) new Q3IconViewItem(myIconview, "The text of the item", aPixmap);
//! [8]
/****************************************************************************
**
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial Usage
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights.  These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3.0 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.  Please review the following information to
** ensure the GNU General Public License version 3.0 requirements will be
** met: http://www.gnu.org/copyleft/gpl.html.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
** $QT_END_LICENSE$
**
****************************************************************************/

//! [0]
QRegion r1(10, 10, 20, 20);
r1.isNull();                // false
r1.isEmpty();               // false

QRegion r2(40, 40, 20, 20);
QRegion r3;
r3.isNull();                // true
r3.isEmpty();               // true

r3 = r1.intersected(r2);    // r3: intersection of r1 and r2
r3.isNull();                // false
r3.isEmpty();               // true

r3 = r1.united(r2);         // r3: union of r1 and r2
r3.isNull();                // false
r3.isEmpty();               // false
//! [0]
/****************************************************************************
**
** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the documentation of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial Usage
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**


·至尊卡", "湖北银行·金融IC卡", "西藏银行·借记IC卡", "新疆汇和银行·汇和卡", "广东华兴银行·借记卡",
        "广东华兴银行·华兴银联公司卡", "广东华兴银行·华兴联名IC卡", "广东华兴银行·华兴金融IC借记卡", "濮阳银行·龙翔卡",
        "宁波通商银行·借记卡", "甘肃银行·神舟兴陇借记卡", "甘肃银行·甘肃银行神州兴陇IC卡", "枣庄银行·借记IC卡",
        "本溪市商业银行·借记卡", "盛京银行·医保卡", "上海农商银行·如意卡(银联卡)", "上海农商银行·如意卡(银联卡)",
        "上海农商银行·鑫通卡", "上海农商银行·国际如意卡", "上海农商银行·借记IC卡",
        "常熟市农村商业银行·粒金贷记卡(银联卡)", "常熟市农村商业银行·公务卡", "常熟市农村商业银行·粒金准贷卡",
        "常熟农村商业银行·粒金借记卡(银联卡)", "常熟农村商业银行·粒金IC卡", "常熟农村商业银行·粒金卡",
        "深圳农村商业银行·信通卡(银联卡)", "深圳农村商业银行·信通商务卡(银联卡)", "深圳农村商业银行·信通卡",
        "深圳农村商业银行·信通商务卡", "广州农村商业银行·福农太阳卡", "广东南海农村商业银行·盛通卡",
        "广东南海农村商业银行·盛通卡(银联卡)", "佛山顺德农村商业银行·恒通卡(银联卡)", "佛山顺德农村商业银行·恒通卡",
        "佛山顺德农村商业银行·恒通卡(银联卡)", "江阴农村商业银行·暨阳公务卡", "江阴市农村商业银行·合作贷记卡(银联卡)",
        "江阴农村商业


* @param value The describe to set.
     * @return This builder for chaining.
     */
    public Builder setDescribe(
        java.lang.String value) {
      if (value == null) { throw new NullPointerException(); }
      describe_ = value;
      bitField0_ |= 0x00000040;
      onChanged();
      return this;
    }
    /**
     * string describe = 7;
     * @return This builder for chaining.
     */
    public Builder clearDescribe() {
      describe_ = getDefaultInstance().getDescribe();
      bitField0_ = (bitField0_ & ~0x00000040);
      onChanged();
      return this;
    }
    /**
     * string describe = 7;
     * @param value The bytes for describe to set.
     * @return This builder for chaining.
     */
    public Builder setDescribeBytes(
        com.google.protobuf.ByteString value) {
      if (value == null) { throw new NullPointerException(); }
      checkByteStringIsUtf8(value);
      describe_ = value;
      bitField0_ |= 0x00000040;
      onChanged();
      return this;
    }

    private cool.scx.live_room_watcher.impl.tiktok_hack.proto_entity.webcast.data.Text displayText_;
    private com.google.protobuf.SingleFieldBuilder<
        cool.scx.live_room_watcher.impl.tiktok_hack.proto_entity.webcast.data.Text, cool.scx.live_room_watcher.impl.tiktok_hack.proto_entity.webcast.data.Text.Builder, cool.scx.live_room_watcher.impl.tiktok_hack.proto_entity.webcast.data.TextOrBuilder> displayTextBuilder_;
    /**
     * .tiktok_hack.Text displayText = 8;
     * @return Whether the displayText field is set.
     */
    public boolean hasDisplayText() {
      return ((bitField0_ & 0x00000080) != 0);
    }
    /**
     * .tiktok_hack.Text displayText = 8;
     * @return The displayText.
     */
    public cool.scx.live_room_watcher.impl.tiktok_hack.proto_entity.webcast.data.Text getDisplayText() {
      if (displayTextBuilder_ == null) {
        return displayText_ == null ? cool.scx.live_room_watcher.impl.tiktok_hack.proto_entity.webcast.data.Text.getDefaultInstance() : displayText_;
      } else {
        return displayTextBuilder_.getMessage();
      }
    }
    /**
     * .tiktok_hack.Text displayText = 8;
     */
    public Builder setDisplayText(cool.scx.live_room_watcher.impl.tiktok_hack.proto_entity.webcast.data.Text value) {
      if (displayTextBuilder_ == null) {
        if (value == null) {
          throw new NullPointerException();
        }
        displayText_ = value;
      } else {
        displayTextBuilder_.setMessage(value);
      }
      bitField0_ |= 0x00000080;
      onChanged();
      return this;
    }
    /**
     * .tiktok_hack.Text displayText = 8;
     */
    public Builder setDisplayText(
        cool.scx.live_room_watcher.impl.tiktok_hack.proto_entity.webcast.data.Text.Builder builderForValue) {
      if (displayTextBuilder_ == null) {
        displayText_ = builderForValue.build();
      } else {
        displayTextBuilder_.setMessage(builderForValue.build());
      }
      bitField0_ |= 0x00000080;
      onChanged();
      return this;
    }
    /**
     * .tiktok_hack.Text displayText = 8;
     */
    public Builder mergeDisplayText(cool.scx.


 arvude (aritmeetiline) keskmine.';
Blockly.Msg.MATH_ONLIST_TOOLTIP_MAX = 'Tagasta suurim arv loendis.';
Blockly.Msg.MATH_ONLIST_TOOLTIP_MEDIAN =
  'Tagasta loendis olevate arvude mediaan.';
Blockly.Msg.MATH_ONLIST_TOOLTIP_MIN = 'Tagasta väikseim arv loendis.';
Blockly.Msg.MATH_ONLIST_TOOLTIP_MODE =
  'Tagasta kõige sagedamini esinev(ad) väärtus(ed) loendis.';
Blockly.Msg.MATH_ONLIST_TOOLTIP_RANDOM = 'Tagasta juhuslik element listist.';
Blockly.Msg.MATH_ONLIST_TOOLTIP_STD_DEV =
  'Tagasta loendis olevate arvude standardhälve.';
Blockly.Msg.MATH_ONLIST_TOOLTIP_SUM = 'Tagasta loendis olevate arvude summa.';
Blockly.Msg.MATH_POWER_SYMBOL = '^';
Blockly.Msg.MATH_RANDOM_FLOAT_HELPURL = '';
Blockly.Msg.MATH_RANDOM_FLOAT_TITLE_RANDOM = 'juhuslik murdarv';
Blockly.Msg.MATH_RANDOM_FLOAT_TOOLTIP =
  'Tagasta murdarv vahemikus 0,0 (kaasa arvatud) ja 1,0 (kaasa arvatud).';
Blockly.Msg.MATH_RANDOM_INT_HELPURL = '';
Blockly.Msg.MATH_RANDOM_INT_TITLE = 'juhuslik täisarv vahemikus %1  – %2';
Blockly.Msg.MATH_RANDOM_INT_TOOLTIP =
  'Tagasta juhuslik täisarv etteantud vahemikus (vahemiku piirid kaasa arvatud).';
Blockly.Msg.MATH_ROUND_HELPURL = '';
Blockly.Msg.MATH_ROUND_OPERATOR_ROUND = 'ümarda';
Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDDOWN = 'ümarda alla';
Blockly.Msg.MATH_ROUND_OPERATOR_ROUNDUP = 'ümarda üles';
Blockly.Msg.MATH_ROUND_TOOLTIP = 'Ümarda arv üles või alla.';
Blockly.Msg.MATH_SINGLE_HELPURL = '';
Blockly.Msg.MATH_SINGLE_OP_ABSOLUTE = 'absoluutväärtus';
Blockly.Msg.MATH_SINGLE_OP_ROOT = 'ruutjuur';
Blockly.Msg.MATH_SINGLE_TOOLTIP_ABS = 'Tagasta arvu absoluutväärtus.';
Blockly.Msg.MATH_SINGLE_TOOLTIP_EXP = 'Tagastab e astmel antud arv.';
Blockly.Msg.MATH_SINGLE_TOOLTIP_LN = 'Tagasta arvu naturaallogaritm.';
Blockly.Msg.MATH_SINGLE_TOOLTIP_LOG10 = 'Tagasta arvu logaritm alusel 10.';
Blockly.Msg.MATH_SINGLE_TOOLTIP_NEG = 'Tagasta vastandarv.';
Blockly.Msg.MATH_SINGLE_TOOLTIP_POW10 = 'Tagasta 10 astmel antud arv.';
Blockly.Msg.MATH_SINGLE_TOOLTIP_ROOT = 'Tagasta arvu ruutjuur.';
Blockly.Msg.MATH_SUBTRACTION_SYMBOL = '-';
Blockly.Msg.MATH_TRIG_ACOS = 'acos';
Blockly.Msg.MATH_TRIG_ASIN = 'asin';
Blockly.Msg.MATH_TRIG_ATAN = 'atan';
Blockly.Msg.MATH_TRIG_COS = 'cos';
Blockly.Msg


椎
溉
傭
寢
摺
滯
瑣
蝸
諮
餡
嚀
薑
瀕
癢
刪
皂
迄
徊
崎
喲
賈
嘯
蔥
禧
謊
鵡
汲
炙
柵
徘
韌
稜
葵
蛻
屢
漩
駁
頹
齋
嚨
瀾
鹹
囑
纜
枸
炭
砌
苛
倖
哺
虔
紳
滄
廓
瘍
綴
蜿
嘮
墮
撈
螂
糙
蟑
檯
瀆
癒
竅
艦
聾
籤
侏
祀
秉
梗
蛀
孵
蜘
矯
繃
鴿
朧
饒
襪
纍
飆
毋
汐
咀
姍
悵
聆
趾
畸
裔
蔚
諱
駭
鵬
勻
軒
烽
舜
瑕
嫻
幟
摹
樞
鋸
鮑
斃
蟋
鍛
嬸
曠
藻
蘊
囂
蜒
屯
伶
肘
苔
惰
詠
楣
霁
尧
岫
淼
霏
闵
枢
昀
揖
饺
褚
浊
戬
邢
铨
麓
楹
匾
梓
呗
晦
拇
菇
诶
酱
檐
祠
冶
旻
亩
炖
恙
庐
轴
簪
琶
琵
昙
琅
旎
踱
楷
朔
芷
檀
磋
阐
猁
谕
猞
撅
椒
卯
菱
删
粤
咨
荟
嗒
衅
膳
掰
婧
捋
潺
壬
腭
摁
陕
骸
屉
乒
蒲
乓
嘞
煲
谳
沪
巅
亥
篱
锣
懿
垚
熠
崭
肴
掺
渭
琊
匀
蘸
笙
笆
缀
憬
憧
蘑
氅
嚯
圃
钮
榆
拈
漱
〇
凋
徜
徉
攥
蔼
馈
卤
曜
暄
沓
辖
褒
蹑
颐
琛
啜
阙
忿
蹊
帛
攒
绊
咂
呸
炬
哒
慷
肋
绢
瓢
粽
姝
孜
喱
矗
缎
蹙
唳
袄
摒
峦
缤
诲
惬
藕
黠
悻
铲
聋
肇
掂
誊
砚
喵
馅
淆
嫒
荔
亢
靴
跷
茬
翊
囔
捶
闰
弋
蜷
杠
斟
祟
敝
祯
廿
蛳
迸
刨
荤
挹


f teamsRes[key]['special'] == 1 else teamsRes[key][
                'predicted'],
            f"\033[92m{teamsRes[key]['prob']}\033[0m" if teamsRes[key]['special'] == 1 else teamsRes[key]['prob'],
            f"\033[92m{teamsRes[key]['actual']}\033[0m" if teamsRes[key]['special'] == 1 else teamsRes[key]['actual'],
            f"\033[92m{teamsRes[key]['ignScore']}\033[0m" if teamsRes[key]['special'] == 1 else teamsRes[key][
                'ignScore']
        ]
        for key in teamsRes
    ]
    # Define headers
    headers = ["Position", "Team", "Predicted", "Prob", "Actual", "IGN Score"]

    # Print the formatted table
    print(tabulate(table_data, headers=headers, tablefmt="fancy_grid"))

    # Print the skill score
    print(Fore.CYAN + f"\nSkill score: {skill}" + Style.RESET_ALL)

# Function:
#   - Print hashmaps of teams at mid-season
#     and ending of the season.
def printTeams(teams):
    print(Fore.LIGHTBLUE_EX + "======================" + Style.RESET_ALL)
    for key in teams:
        print(f"{teams[key]['position']}.-{key}: "
              f"{teams[key]['points']} pts | "
              f"{teams[key]['pointsBetO']:.2f} BO pts | "
              f"{teams[key]['pointsPerB']:.2f} PER pts")


 {
            console.error("Invalid linkage: columncount-exception.");
            return;
        }
        console.log("Everything ok - checked " + colNr + " columns.");
    })(t);
}

function checkTableSanity(t: Tablify.Table) {
    t.eachRow(function (row: Tablify.Row) {
        if (row.table !== t) {
            console.error("Invalid linkage: The row \"" + row.rowId + "\" doesn't reference it's parent table.");
            return;
        }
        row.eachCell(function (cell: Tablify.Cell) {
            if (cell.row !== row) {
                console.error("Invalid linkage: The cell in row \"" + row.rowId + "\" and column \"" + cell.column + "\" (?) doesn't reference it's parent row.");
                return;
            }
        });
    });
    t.eachColumn(function (col: Tablify.Column) {
        if (col.table !== t) {
            console.error("Invalid linkage: The column \"" + col.columnId + "\" doesn't reference it's parent table.");
            return;
        }
        col.eachCell(function (cell: Tablify.Cell) {
            if (cell.column !== col) {
                console.error("Invalid linkage: The cell in column \"" + col.columnId + "\" and row \"" + cell.row + "\" (?) doesn't reference it's parent column.");
                return;
            }
        });
    });
    console.log("Everything ok.");
}

function CHECK_ALL_TABLES() {
    Tablify.tableStore.eachTable(function (table) {
        console.info("Checking table " + table.tableId + "...", table);
        checkTableSanity(table);
        checkTableLinkage(table);
    });
}

function performRowOrderTest() {
    var table = new Tablify.Table(/** / "#content" /**/);
    table.addColumn({
        defaultTitleContent: "T",
        defaultBodyContent: "B",
        defaultFooterContent: "F"
    });

    table.addTitleRow("T");
    table.addBodyRow("B");
    table.addFooterRow("F");
    console.log("---");

    table.addBodyRow({ rowId: "a", content: "a" }, 0);
    table.addBodyRow({ rowId: "b", content: "b" }, 2);
    table.addBodyRow({ rowId: "c", content: "c" }, 1);
    table.addBodyRow({ rowId: "d", content: "d" }, 4);
    table.addBodyRow({ rowId: "e", content: "e" }, 8);
    table.addBodyRow({ rowId: "f", content: "f" }, -12);
    table.addBodyRow({ rowId: "g", content: "g" }, -1);         // TfacBbdegF
    table.addBodyRow({ rowId: "h", content: "h" }, "top");
    table.addBodyRow({ rowId: "i", content: "i" }, "bottom");   // ThfacBbdegiF
    checkTableLinkage(table);
    table.getBodyRow(0).move(1);
    table.getBodyRow(0).move(-1);                   //ThacBbdegifF
    table.getBodyRow(3).move("-1");                 //ThaBcbdegifF
    table.getBodyRow(8).move("bottom").move("+1");  //ThaBcbdegfiF
    table.getBodyRow(4).move("top");                //TbhaBcdegfiF
    table.getBodyRow(6).move(6);
    table.getBodyRow(5).move(table.getBodyRow(7));  //TbhaBcedgfiF
    table.getBodyRow(4).move("up").move("up");      //TbhcaBedgfiF
    table.getBodyRow(3).move("down");


:hover a,.o_tree ul li .active.o_tree_link:focus a{color:#23527c}.o_tree ul li .active_parent.o_tree_link{font-weight:bold}.o_tree ul li .active_parent.o_tree_link a{color:#666}.o_tree ul li .active_parent.o_tree_link a:hover,.o_tree ul li .active_parent.o_tree_link a:focus{color:#333}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l0{left:6px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l1{left:21px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l2{left:36px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l3{left:51px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l4{left:66px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l5{left:81px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l6{left:96px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l7{left:111px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l8{left:126px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l9{left:141px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l10{left:156px}.o_tree.o_tree_root_hidden ul li div .o_tree_oc_l11{left:171px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l0{padding:10px 2px 10px 20px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l1{padding:10px 2px 10px 35px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l2{padding:10px 2px 10px 50px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l3{padding:10px 2px 10px 65px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l4{padding:10px 2px 10px 80px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l5{padding:10px 2px 10px 95px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l6{padding:10px 2px 10px 110px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l7{padding:10px 2px 10px 125px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l8{padding:10px 2px 10px 140px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l9{padding:10px 2px 10px 155px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l10{padding:10px 2px 10px 170px}.o_tree.o_tree_root_hidden ul li div span.o_tree_l11{padding:10px 2px 10px 185px}.o_tree ul li .o_dnd_item{cursor:move;z-index:100}.o_tree ul li .o_dnd_proxy{filter:alpha(opacity=40);opacity:.4;background-color:#f2af40;padding:5px 10px 5px 10px;border:1px solid #ddd;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.o_tree ul li .o_dnd_item.o_dnd_over,.o_tree ul li .o_dnd_item.o_


正在修筑的龙潭水库工地参加劳动。第二阶段，（7月26日至9月1日），7月26日回县城。集中后，先由县委书记黄文韶传达贯彻中央《5(16通知》和区党委书记韦国清在区“文革”动员大会上的讲话，接着学习了6月1日《人民日报》发表的《横扫一切牛鬼蛇神》的社论，然后组织讨论，联系本县本地区本单位的实际，寻找本县的“资产阶级代表人物”，开展“大鸣、大放、大字报、大辩论”，“向反党反社会主义、反毛泽东思想的资产阶级代表人物和牛鬼蛇神猛烈开火。”共贴出大字报20237张，揭出所谓“走资派”、“牛鬼蛇神”、“黑帮分子”377名，占参加集训教师总数的26％。其中20名教师被打成反党反社会主义反毛泽东思想的“三反分子”，受到大小会的轮番批斗，并被强迫到侬门水库工地劳动改造。这些蒙受冤屈的教师，在“文革”后的“处遗”中，已全部给予平反。（县委永久第48卷）

   全县各校建立各种群众组织

   9月上旬，受北京、南宁等地的影响，大新中学以覃英普、许元杰（均是高中学生）为首组织“大中红卫兵”。接着，各中学也先后成立“红卫兵”，小学成立“红小兵”，教职工成立“红教工”等组织。当时学校已开学，但教学秩序混乱，中学生一般不听从老师指导，不愿到教室上课。

   所谓“破旧立新”的行动

   9月中旬，受外地的影响，各个“红卫兵”、“红小兵”组织，借横扫“四旧”之名，三五成群，上街头，下村屯，走家串户，大搞破旧立新的所谓革命行动。他们打烂神台和农户的香炉，抄走传统戏服、道具；烧毁各种旧书籍和各种民族装饰品，甚至连《红楼梦》、《三国演义》、《西游记》等古典文学作品也不幸免；他们推倒祠堂和寺庙，砸烂石狮子和其他古