":
				case "**":
				case "exp":
				case "exponent":
				case "exponentiate":
				case "raise":
				case "raise to":
				case "raised to":
					numberAdjusterVerb = "raising";
					numberAdjusterPreposition = "to";
					numberAdjusterReverseOrder = true;
					break;
				default:
					alert(`Invalid operation (defaulting to "add")!`);
					numberAdjusterMode = "add";
					numberAdjusterVerb = "adding";
					numberAdjusterPreposition = "to";
					numberAdjusterReverseOrder = false;
					break;
			};
			updateNumberAdjusterDescription();
			currentElement = "number_adjuster";
		};
		elements.number_adjuster = {
			color: "#7fff00",
			tool: function(pixel) {
				if(typeof(pixel[numberAdjusterProperty]) === "undefined") {
					pixel[numberAdjusterProperty] = 0;
				};
				if(typeof(pixel[numberAdjusterProperty]) === "number") {
					switch(numberAdjusterMode.toLowerCase()) {
						case "+":
						case "add":
						case "addition":
						case "plus":
						case "increase":
						case "increment":
							pixel[numberAdjusterProperty] += numberAdjusterValue;
							break;
						case "-":
						case "subtract":
						case "subtraction":
						case "minus":
						case "take away":
						case "takeaway":
						case "decrease":
						case "decrement":
							pixel[numberAdjusterProperty] -= numberAdjusterValue;
							break;
						case "*":
						case "x":
						case "×":
						case "multiply":
						case "multiplication":
						case "times":
						case "by":
							pixel[numberAdjusterProperty] *= numberAdjusterValue;
							break;
						case "/":
						case "÷":
						case "divide":
						case "division":
						case "divided by":
							pixel[numberAdjusterProperty] /= numberAdjusterValue;
							break;
						case "%":
						case "mod":
						case "modulo":
						case "modulus":
						case "modulo by":
							pixel[numberAdjusterProperty] %= numberAdjusterValue;
							break;
						case "=":
						case "set":
						case "equals":
						case "assign":
						case "assignment":
							pixel[numberAdjusterProperty] = numberAdjusterValue;
							break;
						case ">": //lower-bounds the color
						case ">=":
						case "min":
						case "minimum":
							pixel[numberAdjusterProperty] = Math.max(numberAdjusterValue,pixel[numberAdjusterProperty]);
							break;
						case "<":
						case "<=":
						case "max": //upper-bounds the color
						case "maximum":
							pixel[numberAdjusterProperty] = Math.min(numberAdjusterValue,pixel[numberAdjusterProperty]);
							break;
						case "^":
						case "**":
						case "exp":
						case "exponent":
						case "exponentiate":
						case "raise":
						case "raise to":
						case "raised to":
							pixel[numberAdjusterProperty] = pixel[numberAdjusterProperty] ** numberAdjusterValue;
							break;
						default:
							pixel[numberAdjusterProperty] += numberAdjusterValue;
					};
					pixelTempCheck(pixel);
				};
			},
			category: "tools",
			desc: `Changes properties of pixels.
Currently ${numberAdjusterVerb} ${numberAdjusterValue} ${numberAdjusterPreposition} ${numberAdjusterProperty}.
Press [Shift+,] or click he


20
 *  result => true

 *
  pattern = "NuPoEx"
 *  patternStart = 0
 *  patternEnd = 6
 *  name = NoPermissionException
 *  nameStart = 0
 *  nameEnd = 21
 *  result => false

 *
  pattern = "npe"
 *  patternStart = 0
 *  patternEnd = 3
 *  name = NullPointerException
 *  nameStart = 0
 *  nameEnd = 20
 *  result => false

 *
  pattern = "IPL3"
 *  patternStart = 0
 *  patternEnd = 3
 *  name = "IPerspectiveListener3"
 *  nameStart = 0
 *  nameEnd = 21
 *  result => true

 *
  pattern = "HM"
 *  patternStart = 0
 *  patternEnd = 2
 *  name = "HashMapEntry"
 *  nameStart = 0
 *  nameEnd = 12
 *  result => (samePartCount == false)

 *

 *
 * @see CharOperation#camelCaseMatch(char[], int, int, char[], int, int, boolean)
 * 	from which algorithm implementation has been entirely copied.
 *
 * @param pattern the given pattern
 * @param patternStart the start index of the pattern, inclusive
 * @param patternEnd the end index of the pattern, exclusive
 * @param name the given name
 * @param nameStart the start index of the name, inclusive
 * @param nameEnd the end index of the name, exclusive
 * @param samePartCount flag telling whether the pattern and the name should
 * 	have the same count of parts or not.

 * 	  For example:
 *

 *
'HM' type string pattern will match 'HashMap' and 'HtmlMapper' types,
 * 				but not 'HashMapEntry'

 *
'HMap' type string pattern will still match previous 'HashMap' and
 * 				'HtmlMapper' types, but not 'HighMagnitude'

 *

 * @return true if a sub-pattern matches the sub-part of the given name, false otherwise
 * @since 3.4
 */
public static final boolean camelCaseMatch(String pattern, int patternStart, int patternEnd, String name, int nameStart, int nameEnd, boolean samePartCount) {
	return StringOperation.getCamelCaseMatchingRegions(pattern, patternStart, patternEnd, name, nameStart, nameEnd, samePartCount) != null;
}

/**
 * Answers all the regions in a given name matching a given pattern using
 * a specified match rule.
 *

 * Each of these regions is made of its starting index and its length in the given
 * name. They are all concatenated in a single array of int
 * which therefore always has an even length.
 *

 * All returned regions are disjointed from each other. That means that the end
 * of a region is always different than the start of the following one.

 * For example, if two regions are returned:

 * { start1, length1, start2, length2 }

 * then start1+length1 will always be smaller than
 * start2.
 *

 * The possible comparison rules between the name and the pattern are:
 *

 *
{@link #R_EXACT_MATCH exact matching}

 *
{@link #R_PREFIX_MATCH prefix matching}

 *
{@link #R_PATTERN_MATCH pattern matching}

 *
{@link #R_CAMELCASE_MATCH camel case matching}

 *
{@link #R_CAMELCASE_SAME_PART_COUNT_MATCH camel case matching with same parts count}

 *

 * Eac


 addon settings for Voronoi Linker v"+txtAddonVer+"\n"
    import datetime
    txt_vasp += f"#Generated "+datetime.datetime.now().strftime("%Y.%m.%d")+"\n"
    txt_vasp += "\n"
    txt_vasp += "import bpy\n"
    #Сконструировать изменённые настройки аддона:
    txt_vasp += "\n"
    txt_vasp += "#Addon prefs:\n"
    txt_vasp += f"prefs = bpy.context.preferences.addons['{voronoiAddonName}'].preferences"+"\n\n"
    txt_vasp += "def SetProp(att, val):"+"\n"
    txt_vasp += "    if hasattr(prefs, att):"+"\n"
    txt_vasp += "        setattr(prefs, att, val)"+"\n\n"
    def AddAndProc(txt):
        nonlocal txt_vasp
        len = txt.find(",")
        txt_vasp += txt.replace(", ",","+" "*(42-len), 1)
    for pr in prefs.rna_type.properties:
        if not pr.is_readonly:
            #'_BoxDiscl'ы не стал игнорировать, пусть будут.
            if pr.identifier not in set_ignoredAddonPrefs:
                isArray = getattr(pr,'is_array', False)
                if isArray:
                    isDiff = not not [li for li in zip(pr.default_array, getattr(prefs, pr.identifier)) if li[0]!=li[1]]
                else:
                    isDiff = pr.default!=getattr(prefs, pr.identifier)
                if (True)or(isDiff): #Наверное сохранять только разницу небезопасно, вдруг не сохранённые свойства изменят своё значение по умолчанию.
                    if isArray:
                        #txt_vasp += f"prefs.{li.identifier} = ({' '.join([str(li)+',' for li in arr])})\n"
                        list_vals = [str(li)+"," for li in getattr(prefs, pr.identifier)]
                        list_vals[-1] = list_vals[-1][:-1]
                        AddAndProc(f"SetProp('{pr.identifier}', ("+" ".join(list_vals)+"))\n")
                    else:
                        match pr.type:
                            case 'STRING': AddAndProc(f"SetProp('{pr.identifier}', \"{getattr(prefs, pr.identifier)}\")"+"\n")
                            case 'ENUM':   AddAndProc(f"SetProp('{pr.identifier}', '{getattr(prefs, pr.identifier)}')"+"\n")
                            case _:        AddAndProc(f"SetProp('{pr.identifier}', {getattr(prefs, pr.identifier)})"+"\n")
    #Сконструировать все VL хоткеи:
    txt_vasp += "\n"
    txt_vasp += "#Addon keymaps:\n"
    #P.s. я не знаю, как обрабатывать только изменённые хоткеи; это выглядит слишком головной болью и дремучим лесом. #tovo0v6
    # Лень реверсинженерить '..\scripts\modules\bl_keymap_utils\io.py', поэтому просто сохранять всех.
    txt_vasp += GetVlKeyconfigAsPy() #Оно нахрен не работает; та часть, которая восстанавливает; сгенерированным скриптом ничего не сохраняется, только временный эффект.
    #Придётся ждать того героя, кто придёт и починит всё это.
    return txt_vasp

def GetFirstUpperLetters(txt):
    txtUppers = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" #"".join([chr(cyc) for cyc in range(65, 91)])
    list_result = []
    for ch1, ch2 in zip(" "+txt, txt):
        if (ch1 not in txtUppers)and(ch2 in txtUppers): #/(?<=[^A-Z])[A-Z]/
            list_result.append(ch2)
    return "".join(list_result)
def SolderClsToolNames():
    for cls in dict_vtClasses:
        cls.vlTripleName = GetFirstUpperLetters(cls.bl_label)+"T" #Изначально было создано "потому что прикольно", но теперь это нужно; см. SetPieData().
        cls.disclBoxPropName = cls.vlTripleName[:-1].lower()+"BoxDiscl"
        cls.disclBoxPropNameInfo = cls.disclBoxPropName+"Info"
SolderClsToolNames()

for cls in dict_vtClasses:
    exec(f"class VoronoiAddonPrefs(VoronoiAddonPrefs): {cls.disclBoxPropName}: bpy.props.BoolProperty(name=\"\", default=False)")
    exec(f"class VoronoiAddonPrefs(VoronoiAddonPrefs): {cls.disclBoxPropNameInfo}: bpy.props.BoolProperty(name=\"\", default=False)")

list_langDebEnumItems = []
for li in ["Free", "Special", "AddonPrefs"]+[cls.bl_label for cls in dict_vtClasses]:
    list_langDebEnumItems.append( (li.upper(), GetFirstUpperLetters(li), "") )

def VaUpdateTestDraw(self, context):
    TestDraw.Toggle(context, self.dsIsTestDrawing)
class VoronoiAddonPrefs(VoronoiAddonPrefs):
    vaLangDebDiscl: bpy.props.BoolProperty(name="Language bruteforce debug", default=False)
    vaLangDebEnum: bpy.props.EnumProperty(name="LangDebEnum", default='FREE', items=list_langDebEnumItems)
    dsIsFieldDebug: bpy.props.BoolProperty(name="Field debug", default=False)
    dsIsTestDrawing: bpy.props.BoolProperty(name="Testing draw", default=False, update=VaUpdateTestDraw)
    dsIncludeDev: bpy.props.BoolProperty(name="IncludeDev", de


-- F-15E Strike Eagle

local coerce_nil_to_string = PWDEV.Tools.coerce_nil_to_string
local send = PWDEV.Tools.SendData

PWDEV.FoundDCSModule = true

PWDEV.ConfigEveryFrameArguments =
{
	-- HUD
	[120] = "%.1f",		-- HUD Brightness Control
	[121] = "%.1f",		-- HUD Symbology Reject Mode
	[122] = "%d",		-- HUD DAY/AUTO/NIGHT Mode Selector

	[326] = "%d",		-- A/A Master Mode Selector light
	[327] = "%d",		-- A/G Master Mode Selector light
	[328] = "%d",		-- NAV Master Mode Selector light
	[329] = "%d",		-- INST Master Mode Selector light

	[130] = "%d",		-- AMAD Fire Push light
	[131] = "%d",		-- L ENGINE Fire Push light
	[132] = "%d",		-- R ENGINE Fire Push light
	[133] = "%d",		-- L BURN THRU red light
	[134] = "%d",		-- R BURN THRU red light

	[180] = "%.1f",		-- cockpit light green
	[181] = "%.1f",		-- L/R BURN THRU red light

	[196] = "%d",		-- SHOOT yellow light
	[197] = "%d",		-- READY green light (AR)

	[221] = "%.1f",		--
	[222] = "%.1f",		--
	[223] = "%.1f",		--
	[244] = "%.1f",		--
	[245] = "%.1f",		--
	[246] = "%.1f",		--
	[315] = "%d",		-- AMAD Fire Switch Cover
	[316] = "%d",		-- AMAD Fire Switch
	[317] = "%d",		-- Left Engine Switch Cover
	[318] = "%d",		-- Left Engine Switch
	[319] = "%d",		-- Right Engine Switch Cover
	[320] = "%d",		-- Right Engine Switch

	[321] = "%.1f",		-- Armament Jettison Selector
	[323] = "%d",		-- Master Arm

	[330] = "%.1f",		-- NOSE light red/green
	[331] = "%.1f",		-- LEFT light red/green
	[332] = "%.1f",		-- RIGHT light red/yellow/green

	[338] = "%d",		-- FLAP yellow light
	[339] = "%d",		-- FLAP green light

	-- PLT Fuel panel
	[381] = "%.1f",		-- Fuel Totalizer Selector
	[382] = "%d",		-- Fuel OFF Flag
	[383] = "%.2f",		-- Fuel Needle
	[384] = "%.2f",		-- Fuel Needle sel
	[385] = "%.1f",		-- Fuel Bingo knob

	-- PLT lights
	[402] = "%d",		-- MASTER CAUTION light
	[403] = "%d",		-- EMIS LMT light
	[404] = "%d",		-- AI light red
	[405] = "%d",		-- SAM light red
	[406] = "%d",		-- LOW ALT light red
	[429] = "%d",		-- OBST light red
	[407] = "%d",		-- TF FAIL light red
	[408] = "%d",		-- CAN UNLKD light red
	[409] = "%d",		-- LASER ARMED light red
	[410] = "%d",		-- A/P light green

	-- cautions
	[411] = "%d",		-- PROGRAM light


ne-long 0.75s;
          animation: swal2-toast-animate-success-line-long 0.75s;
}
.swal2-popup.swal2-toast.swal2-show {
  -webkit-animation: swal2-toast-show 0.5s;
          animation: swal2-toast-show 0.5s;
}
.swal2-popup.swal2-toast.swal2-hide {
  -webkit-animation: swal2-toast-hide 0.1s forwards;
          animation: swal2-toast-hide 0.1s forwards;
}

.swal2-container {
  display: grid;
  position: fixed;
  z-index: 1060;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  box-sizing: border-box;
  grid-template-areas: "top-start     top            top-end" "center-start  center         center-end" "bottom-start  bottom-center  bottom-end";
  grid-template-rows: minmax(-webkit-min-content, auto) minmax(-webkit-min-content, auto) minmax(-webkit-min-content, auto);
  grid-template-rows: minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);
  height: 100%;
  padding: 0.625em;
  overflow-x: hidden;
  transition: background-color 0.5s;
  -webkit-overflow-scrolling: touch;
}
.swal2-container.swal2-backdrop-show, .swal2-container.swal2-noanimation {
  background: rgba(0, 0, 0, 0.5);
}
.swal2-container.swal2-backdrop-hide {
  background: transparent !important;
}
.swal2-container.swal2-top-start, .swal2-container.swal2-center-start, .swal2-container.swal2-bottom-start {
  grid-template-columns: minmax(0, 1fr) auto auto;
}
.swal2-container.swal2-top, .swal2-container.swal2-center, .swal2-container.swal2-bottom {
  grid-template-columns: auto minmax(0, 1fr) auto;
}
.swal2-container.swal2-top-end, .swal2-container.swal2-center-end, .swal2-container.swal2-bottom-end {
  grid-template-columns: auto auto minmax(0, 1fr);
}
.swal2-container.swal2-top-start > .swal2-popup {
  align-self: start;
}
.swal2-container.swal2-top > .swal2-popup {
  grid-column: 2;
  align-self: start;
  justify-self: center;
}
.swal2-container.swal2-top-end > .swal2-popup, .swal2-container.swal2-top-right > .swal2-popup {
  grid-column: 3;
  align-self: start;
  justify-self: end;
}
.swal2-container.swal2-center-start > .swal2-popup, .swal2-container.swal2-center-left > .swal2-popup {
  grid-row: 2;
  align-self: center;
}
.swal2-container.swal2-center > .swal2-popup {
  grid-column: 2;
  grid-row: 2;
  align-self: center;
  justify-self: center


tries.GetOfflinePopulationMock.Set(func() census.OfflinePopulation { return offPop })
	ct := CensusTemplate{registries: registries}
	require.Equal(t, offPop, ct.GetOfflinePopulation())
}

func TestCTGetMisbehaviorRegistry(t *testing.T) {
	registries := census.NewVersionedRegistriesMock(t)
	mr := census.NewMisbehaviorRegistryMock(t)
	registries.GetMisbehaviorRegistryMock.Set(func() census.MisbehaviorRegistry { return mr })
	ct := CensusTemplate{registries: registries}
	require.Equal(t, mr, ct.GetMisbehaviorRegistry())
}

func TestCTGetMandateRegistry(t *testing.T) {
	registries := census.NewVersionedRegistriesMock(t)
	mr := census.NewMandateRegistryMock(t)
	registries.GetMandateRegistryMock.Set(func() census.MandateRegistry { return mr })
	ct := CensusTemplate{registries: registries}
	require.Equal(t, mr, ct.GetMandateRegistry())
}

func TestCTCreateBuilder(t *testing.T) {
	t.Skip("merge")
	// 	chronicles := &localChronicles{}
	// 	pn := pulse.Number(1)
	// 	sp := profiles.NewStaticProfileMock(t)
	// 	sp.GetStaticNodeIDMock.Set(func() insolar.ShortNodeID { return 0 })
	// 	population := &ManyNodePopulation{local: &updatableSlot{NodeProfileSlot: NodeProfileSlot{StaticProfile: sp}},
	// 		slots: []updatableSlot{{NodeProfileSlot: NodeProfileSlot{StaticProfile: sp}}}}
	//
	// 	ct := CensusTemplate{chronicles: chronicles, online: population}
	// 	builder := ct.CreateBuilder(context.Background(), pn)
	// 	require.Equal(t, pn, builder.GetPulseNumber())
}

func TestCTString(t *testing.T) {
	ct := CensusTemplate{}
	require.NotEmpty(t, ct.String())
}

func TestACTIsActive(t *testing.T) {
	act := ActiveCensusTemplate{}
	chronicles := &localChronicles{}
	act.chronicles = chronicles
	require.False(t, act.IsActive())

	act.chronicles.active = &act
	require.True(t, act.IsActive())
}

func TestACTGetExpectedPulseNumber(t *testing.T) {
	act := ActiveCensusTemplate{}
	act.pd.PulseNumber = pulse.MinTimePulse
	require.Panics(t, func() { act.GetExpectedPulseNumber() })

	act.pd.NextPulseDelta = 1
	require.Equal(t, pulse.MinTimePulse+pulse.Number(act.pd.NextPulseDelta), act.GetExpectedPulseNumber())
}

func TestACTGetCensusState(t *testing.T) {
	act := ActiveCensusTemplate{}
	require.Equal(t, census.SealedCensus, act.GetCensusState())
}

func TestACTGetPulseNumber(t *testing.T) {
	act := ActiveCensusTemplate{}
	pn := pulse.Number(1)
	act.pd.PulseNumber = pn
	require.Equal(t, pn, act.GetPulseNumber())
}

func TestACTGetPulseData(t *testing.T) {
	act := ActiveCensusTemplate{}
	pn := pulse.Number(1)
	act.pd.PulseNumber = pn
	pd := act.GetPulseData()
	require.Equal(t, pn, pd.GetPulseNumber())
}

func TestACTGetGlobulaStateHash(t *testing.T) {
	act := ActiveCensusTemplate{}
	require.Nil(t, act.GetGlobulaStateHash())
}

func TestACTGetCloudStateHash(t *testing.T) {
	act := ActiveCensusTemplate{}
	require.Nil


bnxError_IncompatSysVer);

    if (!serviceIsActive(&g_capsaAccessor))
        return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);

    return serviceDispatchIn(&g_capsaAccessor, 2005, stream);
}

Result capsaGetAlbumMovieReadStreamImageDataSize(u64 stream, u64 *size) {
    if (hosversionBefore(4,0,0))
        return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);

    if (!serviceIsActive(&g_capsaAccessor))
        return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);

    return serviceDispatchInOut(&g_capsaAccessor, 2006, stream, *size);
}

Result capsaReadImageDataFromAlbumMovieReadStream(u64 stream, s64 offset, void* buffer, size_t size, u64 *actual_size) {
    if (hosversionBefore(4,0,0))
        return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);

    if (!serviceIsActive(&g_capsaAccessor))
        return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);

    return _capsaReadImageDataFromAlbumMovieReadStream(stream, offset, buffer, size, actual_size);
}

Result capsaReadFileAttributeFromAlbumMovieReadStream(u64 stream, CapsScreenShotAttribute *attribute) {
    if (hosversionBefore(4,0,0))
        return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);

    if (!serviceIsActive(&g_capsaAccessor))
        return MAKERESULT(Module_Libnx, LibnxError_NotInitialized);

    return serviceDispatchInOut(&g_capsaAccessor, 2008, stream, *attribute);
}


ialValue
	if initialSplitPointsT == nil {
		keys := make([]float64, c.numControlPoints)
		if c.numControlPoints > 2 {
			// Initialize split points uniformly from rangeMin (-1.0) to rangeMax (1.0)
			rangeMin, rangeMax := c.pwl.rangeMin, c.pwl.rangeMax
			rangeLen := rangeMax - rangeMin
			for ii := range keys {
				keys[ii] = rangeLen*float64(ii)/float64(c.numControlPoints-1) + rangeMin
			}
		}
		initialSplitPointsT = tensors.FromValue(keys)
	}
	if c.pwl.splitPointsTrainable {
		// Trainable split points: one per input.
		// * We could also make it learn one per output ... at the cost of more parameters.
		splitPointsVar := ctx.WithInitializer(initializers.BroadcastTensorToShape(initialSplitPointsT)).
			VariableWithShape("kan_pwl_split_points", shapes.Make(dtype, numInputGroups, c.numControlPoints))
		if c.pwl.splitPointsFrozen {
			splitPointsVar.Trainable = false
		}
		splitPoints = splitPointsVar.ValueGraph(g)

		// At the end of each training step, project splitPoints back to monotonically increasing values, so they
		// don't overlap.
		train.AddPerStepUpdateGraphFn(ctx.In("kan_pwl_split_points_projection"), g, func(ctx *context.Context, g *Graph) {
			splitPoints := splitPointsVar.ValueGraph(g)
			margin := Scalar(g, splitPoints.DType(), c.pwl.splitPointsMargin)
			splitPoints = optimizers.MonotonicProjection(splitPoints, margin, -1)
			splitPointsVar.SetValueGraph(splitPoints)
		})

	} else {
		// Fixed split points.
		splitPoints = ConstCachedTensor(g, initialSplitPointsT)
		splitPoints = ConvertDType(splitPoints, dtype)
		splitPoints = Reshape(splitPoints, 1, c.numControlPoints)
	}

	// Calculate PiecewiseLinear function
	expandedX := InsertAxes(x, -1 /* numControlPoints */)
	expandedSplitPoints := InsertAxes(splitPoints, 0 /*batch*/, -2 /* inputGroupSize */)
	relativeX := Sub(expandedX, expandedSplitPoints)
	zero := ScalarZero(g, dtype)
	if c.pwl.linearExtrapolation {
		// Linear extrapolation:
		// - relativeX is not clipped at 0 for the first of the split-points.
		indicesShape := relativeX.Shape().Clone()
		indicesShape.DType = dtypes.Int32
		isFirstIndex := Equal(Iota(g, indicesShape, -1), ScalarZero(g, dtypes.Int32))
		relativeX = Where(isFirstIndex, relativeX, Max(relativeX, zero))
	} else {
		// Constant extrapolation:
		lastSplitPoint := SliceAxis(expandedSplitPoints, -1, AxisElem(-1))
		maxAllowedRelativeX := Sub(lastSplitPoint, expandedSplitPoints)
		relativeX = Max(relativeX, zero)
		relativeX = Min(relativeX, maxAllowedRelativeX)
	}
	//relativeX.SetLogged("clamped relativeX")

	// EinSum terms:
	// B -> batchSize
	// O -> numOutputNodes
	// I -> numInputGroups
	// G -> inputGroupSize
	// N -> numControlPoints
	output := Einsum("BIGN,OIN->BOIG", relativeX, controlPoints)
	expandedBias := InsertAxes(bias, 0, -1) // Expand to include batch (B) and input group axes (G).
	output = Add(output, expandedBias)

	output.AssertDims(batchSize, numOutputNodes, numInputGroups, inputGroupSize)
	output = Reshape(output, batchSize, numOutputNodes, numInputNodes) // De-group inputs.

	//


function()
            install_action.run()

            vim.api.nvim_input("<CR>")
            vim.api.nvim_input("dayjs")
            vim.api.nvim_input("<CR>")
        end)
    end)

    it("should not throw on development dependency install", function()
        file.create_package_json({ go = true })

        config.setup()
        core.load_plugin()

        assert.has_no.errors(function()
            install_action.run()

            vim.api.nvim_input("j")
            vim.api.nvim_input("<CR>")
            vim.api.nvim_input("prettier")
            vim.api.nvim_input("<CR>")
        end)
    end)
end)


y_nbg_bo", sp: "bowenlang", dir: "R", act: ["zixin_s", "zixin_l"], skin: "t2" },//休闲西装自信
    220026: { name: "博文朗", nbg: "story_nbg_bo", sp: "bowenlang", dir: "R", act: ["idle_s", "idle_l"], skin: "t2" },//休闲西装无言

    //杨晓东
    212001: { name: "杨晓东", nbg: "story_nbg_nan", sp: "yangxiaozhan", dir: "R", act: ["idle_s", "idle_l"], skin: "default" },
    212002: { name: "杨晓东", nbg: "story_nbg_nan", sp: "yangxiaozhan", dir: "R", act: ["xixiao_s", "xixiao_l"], skin: "default" },
    212003: { name: "杨晓东", nbg: "story_nbg_nan", sp: "yangxiaozhan", dir: "R", act: ["xixiao_l", "xixiao_l"], skin: "default" },
    //孟淑
    214001: { name: "孟淑", nbg: "story_nbg_nv", sp: "mengshu", dir: "R", act: ["idle_s", "idle_l"], skin: "default" },
    214002: { name: "女孩", nbg: "story_nbg_nv", sp: "mengshu", dir: "R", act: ["idle_s", "idle_l"], skin: "default" },
    //黄尚
    215001: { name: "黄尚", nbg: "story_nbg_gu", sp: "huangshang", dir: "R", act: ["idle_s", "idle_l"], skin: "default" },
    215002: { name: "油腻男士", nbg: "story_nbg_gu", sp: "huangshang", dir: "R", act: ["idle_s", "idle_l"], skin: "default" },
    //酒保
    216001: { name: "酒保", nbg: "story_nbg_nan", sp: "jiubao", dir: "R", act: ["idle_s", "idle_l"], skin: "default" },
    //相亲男
    218001: { name: "相亲男二", nbg: "story_nbg_nan", sp: "weisuonan", dir: "M", act: [], skin: "" },
    219001: { name: "相亲男一", nbg: "story_nbg_nan", sp: "tuhaonan", dir: "M", act: [], skin: "" },
    211101: { name: "相亲男三", nbg: "story_nbg_nan", sp: "youzhinan", dir: "M", act: [], skin: "" },
    //导游
    211201: { name: "汤米", nbg: "story_nbg_nan", sp: "daoyou", dir: "R", act: ["idle_s", "idle_l"], skin: "default" },
    211202: { name: "工作人员", nbg: "story_nbg_nan", sp: "daoyou", dir: "R", act: ["idle_s", "idle_l"], skin: "default" },
    211203: { name: "司机", nbg: "story_nbg_nan", sp: "daoyou", dir: "R", act: ["idle_s", "idle_l"], skin: "default" },
    //马丁内


x81\xe4\xba\x94",
     "\xe5\x8d\x83\xe5\x85\xab\xe7\x99\xbe\xe5\x9b\x9b\xe5\x8d\x81\xe5\x9b\x9b"
     "\xe4\xba\xac\xe5\x85\xad\xe5\x8d\x83\xe4\xb8\x83\xe7\x99\xbe\xe5\x9b\x9b"
     "\xe5\x8d\x81\xe5\x9b\x9b\xe5\x85\x86\xe4\xb8\x83\xe7\x99\xbe\xe4\xb8\x89"
     "\xe5\x8d\x81\xe4\xb8\x83\xe5\x84\x84\xe4\xb9\x9d\xe7\x99\xbe\xe4\xba\x94"
     "\xe5\x8d\x81\xe4\xba\x94\xe4\xb8\x87\xe5\x8d\x83\xe5\x85\xad\xe7\x99\xbe"
     "\xe5\x8d\x81\xe4\xba\x94",
     "18446744073709551615"},
    // "百億百"
    {"\xE7\x99\xBE\xE5\x84\x84\xE7\x99\xBE",
     "\xE7\x99\xBE\xE5\x84\x84\xE7\x99\xBE", "10000000100"},
    // "一千京"
    {"\xe4\xb8\x80\xe5\x8d\x83\xe4\xba\xac",
     "\xe4\xb8\x80\xe5\x8d\x83\xe4\xba\xac", "10000000000000000000"},

    // Old Kanji numbers
    // "零"
    {"\xE9\x9B\xB6", "\xE9\x9B\xB6", "0"},
    // "拾"
    {"\xe6\x8b\xbe", "\xe6\x8b\xbe", "10"},
    // "拾四"
    {"\xe6\x8b\xbe\xe5\x9b\x9b", "\xe6\x8b\xbe\xe5\x9b\x9b", "14"},
    // "廿"
    {"\xE5\xBB\xBF", "\xE5\xBB\xBF", "20"},
    // "廿万廿"
    {"\xe5\xbb\xbf\xe4\xb8\x87\xe5\xbb\xbf",
     "\xe5\xbb\xbf\xe4\xb8\x87\xe5\xbb\xbf", "200020"},
    // "弐拾参"
    {"\xe5\xbc\x90\xe6\x8b\xbe\xe5\x8f\x82",
     "\xe5\xbc\x90\xe6\x8b\xbe\xe5\x8f\x82", "23"},
    // "零弐拾参"
    {"\xe9\x9b\xb6\xe5\xbc\x90\xe6\x8b\xbe\xe5\x8f\x82",
     "\xe9\x9b\xb6\xe5\xbc\x90\xe6\x8b\xbe\xe5\x8f\x82", "23"},

    // Array of Kanji number digits
    // "〇"
    {"0", "\xe3\x80\x87", "0"},
    // "〇〇"
    {"00", "\xe3\x80\x87\xe3\x80\x87", "0"},
    // "二三五"
    {"\xe4\xba\x8c\xe4\xb8\x89\xe4\xba\x94",
     "\xe4\xba\x8c\xe4\xb8\x89\xe4\xba\x94", "235"


KeyInfo.Add(0x1B8739F92CDAD324, (377, "WOW-42850patch9.2.5_PTR", "Rabbit mount"));
            KeyInfo.Add(0x0947962739D1A90A, (378, "WOW-42850patch9.2.5_PTR", "Diablo 4 Amalgam of Rage"));
            KeyInfo.Add(0xCDD717BF616F1282, (379, "WOW-41962patch9.2.0_PTR", "Anduin Finale cinematic"));
            KeyInfo.Add(0xA8BBCCA0A621E518, (380, "WOW-41962patch9.2.0_PTR", "Jailer Intro cinematic"));
            KeyInfo.Add(0x7D38C6BF343CAB32, (381, "WOW-41962patch9.2.0_PTR", "Pelagos cinematic"));
            KeyInfo.Add(0xD01FFF442611F3C0, (382, "WOW-41962patch9.2.0_PTR", "Jailer Finale cinematic"));
            KeyInfo.Add(0x1E4534FEEC561A02, (384, "WOW-42850patch9.2.5_PTR", "Test key reused for Secrets of Azeroth Mount day 4"));
            KeyInfo.Add(0x1917CCB5CF95CD5E, (385, "WOW-42850patch9.2.5_PTR", "Trading post launch rewards"));
            KeyInfo.Add(0x77C4EB395B13E06C, (386, "WOW-42850patch9.2.5_PTR", "0 file(s) as of 10.1.0.48480"));
            KeyInfo.Add(0xB9A5FE4AAF12D195, (387, "WOW-42850patch9.2.5_PTR", "Tirisfal story content "));
            KeyInfo.Add(0x50F45BF6BC2B387D, (390, "WOW-42850patch9.2.5_PTR", "Tuskarr campaign"));
            KeyInfo.Add(0xC25003980457691D, (391, "WOW-44649patch10.0.0_Beta", "0 file(s) as of 10.1.0.48480"));
            KeyInfo.Add(0x103C4D80B653E8C5, (392, "WOW-42850patch9.2.5_PTR", "Anduin model"));
            KeyInfo.Add(0x7FC49C7CDE481335, (393, "WOW-42850patch9.2.5_PTR", "Tuskarr glider mount (Mainline)"));
            KeyInfo.Add(0x409FC8B6C2286508, (394, "WOW-43659patch3.4.0_Beta", "Tuskarr glider mount (Classic)"));
            KeyInfo.Add(0x11103693800FE621, (395, "WOW-42850patch9.2.5_PTR", "Ichabod battle pet"));
            KeyInfo.Add(0x70AEC09B193DE12B, (396, "WOW-42850patch9.2.5_PTR", "Gooey Slimesaber Mount"));
            KeyInfo.Add(0xCAC9A9AD68A71FD3, (397, "WOW-42850patch9.2.5_PTR", "Bear cub battle pet"));
            KeyInfo.Add(0x6BBB68F40F470401, (398, "WOW-42850patch9.2.5_PTR", "Nethergorged greatwyrm mount"));
            KeyInfo.Add(0x7B7CF6626F5CF873, (399, "WOW-42850patch9.2.5_PTR", "Item set"));
            KeyInfo.Add(0x3146CA370908382D, (401, "WOW-42850patch9.2.5_PTR", "0 file(s) as of 10.1.0.48480"));
            KeyInfo.Add(0xA2798DFCB1


from schema.reservas_sch import reservas_schema
from sqlmodel import Session, select
from models.Reserva import Reserva

#--------------------------------TAULA-RESERVA---------------------------------------------------#
def get_all_reservas(db: Session):
    sql_read = select(Reserva)
    reservas = db.exec(sql_read).all()
    return reservas_schema(reservas)

def get_reserva(id_reserva: int, db: Session):
    sql_read = select(Reserva).where(Reserva.id_reserva == id_reserva)
    reserva = db.exec(sql_read).one()
    return reserva.dict()

def add_new_reserva(id_reserva: int, nom: str, estat: str, numPersona: int, telefon: str, data: str, id_client: int, db: Session):
    db_reserva = Reserva(
        id_reserva=id_reserva,
        nom=nom,
        estat=estat,
        numPersona=numPersona,
        telefon=telefon,
        data=data,
        id_client=id_client
    )
    db.add(db_reserva)
    db.commit()
    db.refresh(db_reserva)
    return {"Missatge": "Reserva creada correctament"}

def update_reserva(
    id_reserva: int,
    nom: str,
    estat: str,
    numPersona: int,
    telefon: str,
    data: str,
    id_client: int,
    db: Session
):
    sql_select = select(Reserva).where(Reserva.id_reserva == id_reserva)
    reserva_db = db.exec(sql_select).one()

    reserva_db.nom = nom
    reserva_db.estat = estat
    reserva_db.numPersona = numPersona
    reserva_db.telefon = telefon
    reserva_db.data = data
    reserva_db.id_client = id_client

    db.add(reserva_db)
    db.commit()
    db.refresh(reserva_db)
    return {"Missatge": "Reserva actualitzada correctament"}

def update_reserva_field(id_reserva: int, data: dict, db: Session):
    sql_select = select(Reserva).where(Reserva.id_reserva == id_reserva)
    reserva_db = db.exec(sql_select).one_or_none()

    if not reserva_db:
        return None

    for key, value in data.items():
        if hasattr(reserva_db, key) and key != "id_reserva":
            setattr(reserva_db, key, value)

    db.add(reserva_db)
    db.commit()
    db.refresh(reserva_db)
    return {"Missatge": "Camp(s) de la reserva actualitzat(s) correctament"}

def delete_reserva(id_reserva: int, db: Session):
    sql_select = select(Reserva).where(Reserva.id_reserva == id_reserva)
    reserva_db = db.exec(sql_select).one()

    db.delete(reserva_db)
    db.commit()
    return {"Missatge": "Reserva esborrada correctament"}
#-----------------------------final-TAULA-RESERVA------------------------------------------------#


vH9fnTmRIbG8XvG4rNYP3vxFdd+fcbGz+ZMynw7YunyuLsH6X1rF/wyfLH6mN0UTQ8CihNGh5qm/05deaAWMgoWDR0BEQkZBBQBBYIjYgmhg4eAREJGQUVABQBAYIrYgGVg4eAREJGQUVAAQBIaILcgGFg4eAREJGQUVAASBIWILioGFg0dAREJGQQUAQWCI2ILNwCIgIiGjPHkdNNz98K9+2zG4HgA=) format("woff2");
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
}
/* latin-ext */
@font-face {
  font-family: "Baloo 2";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url(data:font/woff2;base64,d09GMgABAAAAADq8ABAAAAAAmUwAADpZAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGjQbryocfgZgP1NUQVQuAIYKEQgKgcV8gaIPC4YcAAE2AiQDjDQEIAWDegeabgwHGyeDB/CcCe/uVqUiPhDwoxDYOECAZIujqCZFUfz/n5NU5DCNSdNtAP8PJbGRRMgynA6y++hWn3B0jcJWYSsYzhIk5UAP2ve5vkGFidEzGMKhcHI3u0SFSWdfqaJwKvgQboVC4TE2dLopOmTSWzBxNrvW+36ClkpUIorfgySy0c844/RE4b5Qi6/lavlBkedPraQ7FN4WJz1CY5/k8iD4F9RLPgYrgeVWcgWow50n/vfjvnPvwyffgtlIQgLjbimqas47m51BluSk4flt9lBC+PQnlFQRAQORMooSlJBPKGBjY9eqXUS5zNt2EbU7t4vc+ja3vrvx/D+HYfe9PzOpzQLcNFy6UE4wHJGIVN/FCrS4BJXah0LmLKFw7eU7QsdubmpyGoUnpyaEJ2oFgHDxi3M2hRRGyp1A+BnDkB2O1tKNixHAKkZEqBiXCAvU2soK1yoiRRjACdCG9+dhv5c5oDnY/b8C+N/8zZ+UG4E0FUV0Kk/0z47czXPGp+0VdOlS/gcAFEAAyuA+AQywmBuY5xTbYl9dF3iIhzpTsotSnAJuADACgO4uyYOdOH0XYZVWeY39wDS2Hbamk3O22tY+C8P2jQYW5u+N7fRsmtIIAiOAwJYtlVptS0cGoumh4izYWecNRE0dgukJ8P4ZwMHI7f8dQ4oi3rsfhXniw+Ix76+a+l27p6ftkWLXRoYAa/c7sKdk4Y7kyn2BDnf


x. It also shows how to remove the default columns of the **Table** , add specific columns, and print the values of the corresponding properties of these items.

```vb
Sub RemoveAllAndAddColumns()

 'Declarations

 Dim Filter As String

 Dim oRow As Outlook.Row

 Dim oTable As Outlook.Table

 Dim oFolder As Outlook.Folder

 'Get a Folder object for the Inbox

 Set oFolder = Application.Session.GetDefaultFolder(olFolderInbox)

 'Define Filter to obtain items last modified after May 1, 2005

 Filter = "[LastModificationTime] > '5/1/2005'"

 'Restrict with Filter

 Set oTable = oFolder.GetTable(Filter)

 'Remove all columns in the default column set

 oTable.Columns.RemoveAll

 'Specify desired properties

 With oTable.Columns

 .Add ("Subject")

 .Add ("LastModificationTime")

 'PR_ATTR_HIDDEN referenced by the MAPI proptag namespace

 .Add ("http://schemas.microsoft.com/mapi/proptag/0x10F4000B")

 End With

 'Enumerate the table using test for EndOfTable

 Do Until (oTable.EndOfTable)

 Set oRow = oTable.GetNextRow()

 Debug.Print (oRow("Subject"))

 Debug.Print (oRow("LastModificationTime"))

 Debug.Print (oRow("http://schemas.microsoft.com/mapi/proptag/0x10F4000B"))

 Loop

End Sub
```

## See also

#### Concepts

[Columns Object](columns-object-outlook.md)

---
title: SharingItem.Unload Event (Outlook)
ms.prod: outlook
api_name:
- Outlook.SharingItem.Unload
ms.assetid: b79a4c94-46cc-5571-a36d-ad537db97bcc
ms.date: 06/08/2017
---

# SharingItem.Unload Event (Outlook)

Occurs before an Outlook item is unloaded from memory, either programmatically or by user action.

## Syntax

 _expression_ . **Unload**

 _expression_ An expression that returns a **SharingItem** object.

## Remarks

This event occurs after the  **Close** event for the Outlook item occurs, but before the Outlook item is unloaded from memory, allowing an add-in to release any resources related to the object. Although the event occurs before the Outlook item is unloaded from memory, this event cannot be canceled.

 **Note**  This event is meant only as a notification event, so that an add-in can dereference the object. An error occurs if any property or method for this object is called within the  **Unload** event.

## See also

#### Concepts

[SharingItem Object](sharingitem-object-outlook.md)

---
title: ContactItem.CustomAction Event (Outlook)
ms.prod: outlook
api_name:
- Outlook.ContactItem.CustomAction
ms.assetid: e2f6da0c-0470-8cbd-ce31-2e2a6e0e5353
ms.date: 06/08/2017
---

# ContactItem.CustomAction Event (Outlook)

Occurs when a custom action of an item (which is an instance of the parent object) executes.

## Syntax

 _expression_ . **CustomAction**( **_Action_** , **_Response_** , **_Cancel_** )

 _expression_ A variable that represents a **ContactItem** object.

### Parameters

|**Name**|**Required/Optional**|**Data Type**|**Description**|
|:-----|:-----|:-----|:-----|
| _Action_|Required| **Object**|The  **[Action](action-object-outlook.md)** object.|
| _Response_|Required| **Object**|The newly created item resulting from the custom action.|
| _Cancel_|Required| **Boolean**|(Not used in VBScript).  **False** when the event occurs. If the event procedure sets this argument to **True** , the custom action is not completed.|

## Rem


content .mt-card-social>ul>li>a.mt-card-btn{color:#fff}.mt-element-card .mt-card-item .mt-card-content .mt-card-social>ul>li>a.mt-card-btn:hover{color:#36c6d3}.mt-element-card .mt-card-item .mt-card-content .mt-card-social>ul>li>a:hover{color:#F1C40F}.mt-element-card.mt-card-round .mt-card-item{padding:40px 40px 10px}.mt-element-card.mt-card-round .mt-card-item .mt-card-avatar{border-radius:50%!important;-webkit-mask-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAA5JREFUeNpiYGBgAAgwAAAEAAGbA+oJAAAAAElFTkSuQmCC)}.mt-element-card.mt-card-round .mt-card-item .mt-card-avatar .mt-overlay{-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%}.mt-element-overlay .mt-overlay-1{width:100%;height:100%;float:right;overflow:hidden;position:relative;text-align:center;cursor:default}.mt-element-overlay .mt-overlay-1 img{display:block;position:relative;-webkit-transition:all .4s linear;transition:all .4s linear;width:100%;height:auto}.mt-element-overlay .mt-overlay-1 h2{text-transform:uppercase;color:#fff;text-align:center;position:relative;font-size:17px;background:rgba(0,0,0,.6);-webkit-transform:translatey(-100px) translateZ(0);-ms-transform:translatey(-100px) translateZ(0);transform:translatey(-100px) translateZ(0);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;padding:10px}.mt-element-overlay .mt-overlay-1 .mt-info{text-decoration:none;display:inline-block;text-transform:uppercase;color:#fff;background-color:transparent;opacity:0;filter:alpha(opacity=0);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;padding:0;margin:auto;position:absolute;top:50%;right:0;left:0;transform:translateY(-50%) translateZ(0);-webkit-transform:translateY(-50%) translateZ(0);-ms-transform:translateY(-50%) translateZ(0)}.mt-element-overlay .mt-overlay-1 .mt-info>li{list-style:none;display:inline-block;margin:0 3px}.mt-element-overlay .mt-overlay-1 .mt-info>li:hover{-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;cursor:pointer}.mt-element-overlay .mt-overlay-1:hover .mt-overlay{opacity:1;filter:alpha(opacity=100);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}.mt-element-overlay .mt-overlay-1:hover img{-ms-transform:scale(1.2) translateZ(0);-webkit-transform:scale(1.2) translateZ(0);transform:scale(1.2) translateZ(0)}.mt-element-overlay .mt-overlay-1:hover .mt-info{opacity:1;filter:alpha(opacity=100);-webkit-transition-delay:.2s;transition-delay:.2s}.mt-element-overlay .mt-overlay-1 .mt-overlay{width:100%;height:100%;position:absolute;overflow:hidden;top:0


iption = '',
    this.status = 'TASK_STATUS_PENDING',
    this.priority = 'TASK_PRIORITY_MEDIUM',
    List<String>? tags,
    this.createdBy = 'system',
    this.assignedTo = '',
  }) : tags = tags ?? [];

  factory Task.fromMap(Map<String, dynamic> map) {
    return Task(
      id: map['id'] ?? '',
      title: map['title'] ?? '',
      description: map['description'] ?? '',
      status: map['status'] ?? 'TASK_STATUS_PENDING',
      priority: map['priority'] ?? 'TASK_PRIORITY_MEDIUM',
      tags: List<String>.from(map['tags'] ?? []),
      createdBy: map['created_by'] ?? 'system',
      assignedTo: map['assigned_to'] ?? '',
    );
  }

  Map<String, dynamic> toMap() => {
        'id': id,
        'title': title,
        'description': description,
        'status': status,
        'priority': priority,
        'tags': tags,
        'created_by': createdBy,
        'assigned_to': assignedTo,
      };
}

class TaskEvent {
  final String eventType;
  final Task task;

  TaskEvent({
    required this.eventType,
    required this.task,
  });

  factory TaskEvent.fromMap(Map<String, dynamic> map) {
    return TaskEvent(
      eventType: map['event_type'] ?? '',
      task: Task.fromMap(map['task'] ?? {}),
    );
  }
}

class TaskGrpcClient {
  late ClientChannel _channel;
  late _TaskServiceClient _client;

  TaskGrpcClient({String host = 'localhost', int port = 50051}) {
    _channel = ClientChannel(
      host,
      port: port,
      options: const ChannelOptions(
        credentials: ChannelCredentials.insecure(),
      ),
    );
    _client = _TaskServiceClient(_channel);
  }

  // Server streaming: List tasks
  Stream<Task> listTasks({
    String? status,
    String? assignedTo,
    List<String>? tags,
  }) {
    final request = {
      if (status != null) 'status': status,
      if (assignedTo != null) 'assigned_to': assignedTo,
      if (tags != null && tags.isNotEmpty) 'tags': tags,
    };

    return _client.listTasks(request).map((response) {
      return Task.fromMap(response);
    });
  }

  // Unary call: Get single task
  Future<Task> getTask(String id) async {
    final response = await _client.getTask({'id': id});
    return Task.fromMap(response);
  }

  // Unary call: Create task
  Future<Task> createTask({
    required String title,
    String? description,
    String? priority,
    List<String>? tags,
    String? assignedTo,
  }) async {
    final task = Task(
      id: '', // Will be generated server-side
      title: title,
      description: description ?? '',
      priority: priority ?? 'TASK_PRIORITY_MEDIUM',
      tags: tags,
      assignedTo: assignedTo ?? '',
    );

    final response = await _client.createTask({'task': task.toMap()});
    return Task.fromMap(response);
  }

  // Unary call: Update task
  Future<Task> updateTask(
    String id, {
    String? title,
    String? description,
    String? status,
    String? priority,
    List<String>? tags,
    String? assignedTo,
    List<String>? updateMask,
  }) async {
    final task = Task(
      id: id,
      title: title ?? '',
      description: description ?? '',
      status: status ?? '',
      priority: priority ?? '',
      tags: tags,
      assignedTo: assignedTo ?? '',
    );

    final request = {
      'task': task.toMap(),
      if (updateMask != null


= ns.CreateCheckBox(parent, "afk_spin_camera")
	afk_spin_camera:SetPoint("TOPLEFT", shift_marking, "BOTTOMLEFT", 0, 0)

	local quest_auto_button = ns.CreateCheckBox(parent, "quest_auto_button")
	quest_auto_button:SetPoint("TOPLEFT", afk_spin_camera, "BOTTOMLEFT", 0, 0)

	local item_level = ns.CreateCheckBox(parent, "item_level")
	item_level:SetPoint("TOPLEFT", quest_auto_button, "BOTTOMLEFT", 0, 0)

	local click_cast = ns.CreateCheckBox(parent, "click_cast")
	click_cast:SetPoint("TOPLEFT", item_level, "BOTTOMLEFT", 0, 0)

	local click_cast_filter = ns.CreateCheckBox(parent, "click_cast_filter")
	click_cast_filter:SetPoint("TOPLEFT", click_cast, "BOTTOMLEFT", 20, 0)

	click_cast.children = {click_cast_filter}

	local chars_currency = ns.CreateCheckBox(parent, "chars_currency")
	chars_currency:SetPoint("TOPLEFT", click_cast_filter, "BOTTOMLEFT", -20, 0)

	local classic = {
		chars_currency
	}

	if IsVanillaBuild() or IsTBCBuild() then
		HideOptions(classic)
	end
end

----------------------------------------------------------------------------------------
--	Skin extra frames
----------------------------------------------------------------------------------------
local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_LOGIN")
f:SetScript("OnEvent", function()
	if not ShestakUI then return end
	T, C = unpack(ShestakUI)

	SpellList:StripTextures()
	SpellList:CreateBackdrop("Transparent")
	SpellList.backdrop:SetPoint("TOPLEFT", -18, 0)
	SpellList.backdrop:SetPoint("BOTTOMRIGHT", 0, 9)

	SpellListScrollFrameSpellList:StripTextures()
	SpellListScrollFrameSpellList:CreateBackdrop("Overlay")
	SpellListScrollFrameSpellList.backdrop:SetPoint("TOPLEFT", 2, 3)
	SpellListScrollFrameSpellList.backdrop:SetPoint("BOTTOMRIGHT", 2, -3)
	T.SkinCloseButton(SpellListCloseButton)

	SpellListScrollFrameSpellList.ScrollBar:SetPoint("TOPLEFT", SpellListScrollFrameSpellList, "TOPRIGHT", 9, 3)
	SpellListScrollFrameSpellList.ScrollBar:SetPoint("BOTTOMLEFT", SpellListScrollFrameSpellList, "BOTTOMRIGHT", 9, -4)
	T.SkinScrollBar(SpellListScrollFrameSpellList.ScrollBar)

	T.SkinEditBox(SpellListTextInput)
	T.SkinEditBox(SpellListTextInput2)

	ProfileList:StripTextures()
	ProfileList:CreateBackdrop("Transparent")
	ProfileList.backdrop:SetPoint("TOPLEFT", -18, 0)
	ProfileList.backdrop:SetPoint("BOTTOMRIGHT", 0, 9)
	T.SkinCloseButton(ProfileListCloseButton)

	ProfileListPanel:CreateBackdrop("Overlay")

	ShestakUIInfoFrame:SetTemplate("Overlay")

	ShestakUIProfileFrame:SetTemplate("Transparent")
	T.SkinScrollBar(ShestakUIProfileFrameScroll.ScrollBar)
	ShestakUIProfileFrameScroll:CreateBackdrop("Overlay")
	ShestakUIProfileFrameScroll.backdrop:SetPoint("TOPLEFT", -4, 4)
	ShestakUIProfileFrameScroll.backdrop:SetPoint("BOTTOMRIGHT", 4, -4)

	C_Timer.After(3, function()
		local dropdown = ShestakUIOptionsPanelgeneralchoose_profileDropDown
		if dropdown then
			T.SkinDropDownBox(dropdown)
		end


    if (info.HandleType.IsSubclassOf(typeof(DbObjectSmartUpdate))) {
                if (info.HasRelation) {
                    return new RelationModelSaver(info, composer, provider, handler);
                }
                return new DbModelSaver(info, composer, provider, handler);
            }
            if (info.HasSystemKey) {
                return new DbObjectSaver(info, composer, provider, handler);

            }
            return new SimpleObjectSaver(info, composer, provider, handler);
        }
    }
}


Chain::class,
        Chain.Currency::class,
        TransactionLocal::class
    ], version = HeimdallDatabase.LATEST_DB_VERSION
)
@TypeConverters(
    BigIntegerConverter::class,
    SolidityAddressConverter::class,
    OwnerTypeConverter::class,
    EncryptedByteArray.NullableConverter::class,
    EncryptedString.NullableConverter::class,
    RpcAuthenticationConverter::class,
    ChainFeaturesConverter::class
)
abstract class HeimdallDatabase : RoomDatabase() {

    abstract fun safeDao(): SafeDao

    abstract fun ownerDao(): OwnerDao

    abstract fun chainDao(): ChainDao

    abstract fun transactionLocalDao(): TransactionLocalDao

    companion object {
        const val DB_NAME = "safe_db"
        const val LATEST_DB_VERSION = 10

        val MIGRATION_1_2 = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL(
                    """DROP TABLE IF EXISTS `erc20_tokens`"""
                )
            }
        }

        val MIGRATION_2_3 = object : Migration(2, 3) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL(
                    """CREATE TABLE IF NOT EXISTS `${Owner.TABLE_NAME}` (`${Owner.COL_ADDRESS}` TEXT NOT NULL, `${Owner.COL_NAME}` TEXT, `type` INTEGER NOT NULL, `private_key` TEXT, PRIMARY KEY(`${Owner.COL_ADDRESS}`))"""
                )
            }
        }

        val MIGRATION_3_4 = object : Migration(3, 4) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL(
                    """ALTER TABLE `${Owner.TABLE_NAME}` ADD COLUMN `${Owner.COL_SEED_PHRASE}` TEXT"""
                )
            }
        }

        val MIGRATION_4_5 = object : Migration(4, 5) {
            override fun migrate(database: SupportSQLiteDatabase) {
                val defaultChainId = BigIntegerConverter().toHexString(BuildConfig.CHAIN_ID.toBigInteger())
                database.execSQL(
                    """CREATE TABLE IF NOT EXISTS `${Chain.TABLE_NAME}` (`${Chain.COL_CHAIN_ID}` TEXT NOT NULL, `${Chain.COL_CHAIN_NAME}` TEXT NOT NULL, `${Chain.COL_TEXT_COLOR}` TEXT NOT NULL, `${Chain.COL_BACKGROUND_COLOR}` TEXT NOT NULL, `${Chain.COL_RPC_URI}` TEXT NOT NULL, `${Chain.COL_RPC_AUTHENTICATION}` INTEGER NOT NULL, `${Chain.COL_BLOCK_EXPLORER_TEMPLATE_ADDRESS}` TEXT NOT NULL, `${Chain.COL_BLOCK_EXPLORER_TEMPLATE_TX_HASH}` TEXT NOT NULL, `${Chain.COL_ENS_REGISTRY_ADDRESS}` TEXT, PRIMARY KEY(`${Chain.COL_CHAIN_ID}`))"""
                )
                database.execSQL(
                    """CREATE TABLE IF NOT EXISTS `${Chain.Currency.TABLE_NAME}` (`${Chain.Currency.COL_CHAIN_ID}` TEXT NOT NULL, `${Chain.Currency.COL_NAME}` TEXT NOT NULL, `${Chain.Currency.COL_SYMBOL}` TEXT NOT NULL, `${Chain.Currency.COL_DECIMALS}` INTEGER NOT NULL, `${Chain.Currency.COL_LOGO_URI}` TEXT NOT NULL, PRIMARY KEY(`${Chain.Currency.COL_CHAIN_ID}`), FOREIGN KEY(`${Chain.Currency.COL_CHAIN_ID}`) REFERENCES `${Chain.TABLE_NAME}`(`${Chain.COL_CHAIN_ID}`) ON UPDATE CASCADE ON DELETE CASCADE )"""
                )

                database.execSQL(
                    """DROP TABLE IF EXISTS 'safe_meta_data'"""
                )

                // Add CHAIN_ID column and add it to primary key
                database.execSQL(
                    """ALTER TABLE `${Safe.TABLE_NAME}` ADD COLUMN `${Safe.COL_CHAIN_ID}` TEXT NOT NULL DEFAULT `${defaultChainId}`"""


wn",
"25c0": "arrow_backward",
"1f53c": "arrow_up_small",
"1f53d": "arrow_down_small",
"27a1": "arrow_right",
"2b05": "arrow_left",
"2b06": "arrow_up",
"2b07": "arrow_down",
"21aa": "arrow_right_hook",
"21a9": "leftwards_arrow_with_hook",
"1f500": "twisted_rightwards_arrows",
"1f501": "repeat",
"1f502": "repeat_one",
"1f504": "arrows_counterclockwise",
"1f503": "arrows_clockwise",
"1f3b5": "musical_note",
"1f3b6": "notes",
"1f7f0": "heavy_equals_sign",
"267e": "infinity",
"1f4b2": "heavy_dollar_sign",
"1f4b1": "currency_exchange",
"00a9": "copyright",
"00ae": "registered",
"27b0": "curly_loop",
"27bf": "loop",
"1f51a": "end",
"1f519": "back",
"1f51b": "on",
"1f51d": "top",
"1f51c": "soon",
"1f518": "radio_button",
"26aa": "white_circle",
"26ab": "black_circle",
"1f534": "red_circle",
"1f535": "blue_circle",
"1f7e4": "brown_circle",
"1f7e3": "purple_circle",
"1f7e2": "green_circle",
"1f7e1": "yellow_circle",
"1f7e0": "orange_circle",
"1f53a": "small_red_triangle",
"1f53b": "small_red_triangle_down",
"1f538": "small_orange_diamond",
"1f539": "small_blue_diamond",
"1f536": "large_orange_diamond",
"1f537": "large_blue_diamond",
"1f533": "white_square_button",
"1f532": "black_square_button",
"25aa": "black_small_square",
"25ab": "white_small_square",
"25fe": "black_medium_small_square",
"25fd": "white_medium_small_square",
"25fc": "black_medium_square",
"25fb": "white_medium_square",
"2b1b": "black_large_square",
"2b1c": "white_large_square",
"1f7e7": "orange_square",
"1f7e6": "blue_square",
"1f7e5": "red_square",
"1f7eb": "brown_square",
"1f7ea": "purple_square",
"1f7e9": "green_square",
"1f7e8": "yellow_square",
"1f508": "speaker",
"1f507": "mute",
"1f509": "sound",
"1f50a": "loud_sound",
"1f514": "bell",
"1f515": "no_bell",
"1f4e3": "mega",
"1f4e2": "loudspeaker",
"1f5e8": "speech_left",
"1f441-1f5e8": "eye_in_speech_bubble",
"1f4ac": "speech_balloon",
"1f4ad": "thought_balloon",
"1f5ef": "anger_right",
"1f0cf": "black_joker",
"1f3b4": "flower_playing_cards",
"


tiplier = 0.6,
		},
		defensive_3 = {
			toughness_damage_taken_modifier = -0.15,
		},
		coop_1 = {
			damage = 0.15,
			duration = 5,
			toughness_percent_regenerated = 0.5,
		},
		coop_2 = {
			corruption_heal_amount_increased = 1.5,
			interval = 1,
			percent_increase_visualizer = 0.5,
		},
		coop_3 = {
			cooldown_duration = 8,
			damage_taken_multiplier = 0.4,
			duration = 4,
		},
		spec_passive_1 = {
			cooldown_time = 0.5,
		},
		spec_passive_2 = {
			crit_chance = 0.1,
		},
		spec_passive_3 = {},
		combat_ability_1 = {
			max_time_per_hit = 2,
			multiplier_per_hit = 0.9,
		},
		combat_ability_2 = {},
		combat_ability_3 = {
			duration = 8,
		},
		bolstering_prayer = {
			self_toughness = 0.5,
			team_toughness = 0.25,
			tick_rate = 0.8,
			toughness_bonus = 15,
			toughness_duration = 10,
			toughness_percentage = 0.2,
			toughness_stacks = 5,
		},
		combat_ability_cd_restore_on_damage = {
			cooldown_regen = 0.5,
			damage_taken_to_ability_cd_percentage = 0.01,
			max_health = 0.25,
		},
		zealot_backstab_kills_restore_cd = {
			combat_ability_cd_percentage = 0.1,
		},
		quickness = {
			dodge_stacks = 3,
			increased_duration = 10,
			max_stacks = 20,
			toughness_percentage = 0.02,
		},
	},
}

return talent_settings


beq	.L391
.L384:
	ldp	x19, x20, [sp, 16]
	ldp	x21, x22, [sp, 32]
	ldr	x23, [sp, 48]
	ldp	x29, x30, [sp], 64
	ret
	.p2align 3
.L391:
	mov	w1, 36
	mov	w0, 26
	bl	HI_ADSP_MALLOC
	mov	x23, x0
	cbz	x0, .L384
	ldr	x3, .LC6
	mov	x2, 36
	mov	w1, 0
	ldr	x3, [x3, 40]
	blr	x3
	str	w20, [x23, 8]
	stp	w22, w21, [x23]
	str	wzr, [x23, 32]
	str	x23, [x19]
	ldp	x19, x20, [sp, 16]
	ldp	x21, x22, [sp, 32]
	ldr	x23, [sp, 48]
	ldp	x29, x30, [sp], 64
	ret
	.size	FADE_Create, .-FADE_Create
	.align	3
.LC6:
	.xword	g_AdspOsalFunc
	.global	_mcount
	.align	2
	.p2align 3,,7
	.global	FADE_Flush
	.type	FADE_Flush, %function
FADE_Flush:
	stp	x29, x30, [sp, -48]!
	add	x29, sp, 0
	stp	x19, x20, [sp, 16]
	stp	x21, x22, [sp, 32]
	mov	x19, x0
	mov	x0, x30
	mov	w20, w1
	mov	w22, w2
	mov	w21, w3
	bl	_mcount
	mov	w0, 60927
	sub	w1, w20, #1
	movk	w0, 0x2, lsl 16
	cmp	w1, w0
	bhi	.L392
	and	w0, w22, -9
	cmp	w0, 16
	bne	.L392
	sub	w0, w21, #1
	cmp	w0, 1
	ccmp	w21, 8, 4, hi
	cset	w1, ne
	cmp	x19, xzr
	cset	w0, ne
	cmp	w1, w0
	bcs	.L392
	ldp	w1, w0, [x19]
	cmp	w21, w0
	beq	.L403
.L396:
	stp	w22, w21, [x19]
	str	w20, [x19, 8]
	ldr	w0, [x19, 12]
	ldr	w2, [x19, 32]
	cbz	x19, .L392
	str	wzr, [x19, 20]
	cbnz	w0, .L397
	str	wzr, [x19, 24]
.L398:
	cmp	w2, 1
	beq	.L404
	cmp	w2, 2
	beq	.L405
.L392:
	ldp	x19, x20, [sp, 16]
	ldp	x21, x22, [sp, 32]
	ldp	x29, x30, [sp], 48
	ret
	.p2align 3
.L403:
	ldr	w0, [x19, 8]
	cmp	w20, w0
	bne	.L396
	cmp	w22, w1
	beq	.L392
	b	.L396
	.p2align 3
.L397:
	mul	w20, w20, w0
	mov	w0, 188


һ֣ѭСmidֱֵarr[mid]ڲֵͷء

##2.3ʵ

```
 public static void main(String[] args){
    	  int arr[]={5,6,7,1,2,3,4};
    	  int out = VariantBinaryFind(arr,arr.length-1,1);
    	  System.out.println("±Ϊ "+ out);
      }
      /**
       * @param a
       * @param len 鳤
       * @param x ҵԪ
       * @return زֵ±꣬ڷ -1
       */
      public static int VariantBinaryFind(int arr[],int len,int x){
    	  int left = 0;
    	  int right = len;
    	  while(left<=right){
    		  int mid = left + (right -left)/2;
    		  if(arr[mid]==x){
    			  return mid;
    		  }
    		  if(arr[mid] >= arr[left]) //mid
    	        {
    	            if(arr[left] > x || arr[mid] < x)
    	                left = mid + 1;  //xұ
    	            else
    	                right = mid - 1;  //x
    	        }
    	        else //midұ
    	        {
    	            if(arr[right] < x || arr[mid] > x)
    	                right = mid - 1;  //x
    	            else
    	                left = mid + 1;  //xұ
    	        }
    	    }
    	    return -1;
      }
```

н

![дͼƬ](http://img.blog.csdn.net/20160611115200340)#1.ͼĶ

 ͼGɶϣԼ֮ĹϵɣļϼΪV֮ĹϵɱߵļEG=(V,E).

ͼÿ߹涨һôõͼΪ**ͼ**ҲΪߡͼУһڵıгߺ֣֮һ߹Ҳʼյ֮֡෴ûзͼΪ**ͼ**

#.ͼĴ洢

һͼĴ洢ַʽ

1)ڽӱҪһ˳洢Ķÿϵıߵӱ

2)ھһֱߵ

![дͼƬ](http://img.blog.csdn.net/20160613103617205)

ͼչʾֱʾͼķ

![дͼƬ](http://img.blog.csdn.net/20160613103702050)

#.ͼı

١DFSDepth First SearchΪÿһʱ־Ƚͼÿķʱ־Ϊ FALSE,  ֮ͼÿ㣬δʣԸöΪʼ㣬б

ǰʵĶڽӶδʵģѡһ֮֮˻صʹĶ㣻ֱʼͨȫ㶼ϣ

> ͼĹʵǶÿڽӵḶ́ķѵʱȡõĴ洢ṹ
ͼеÿ1DFS㷨Ϊһĳѷʹٴ

> ڽʾÿڽӵʱΪO(e)eΪ()㷨


учаи помогут избежать регрессий и убедиться, что мы не сломали работу кода в «экзотических» обстоятельствах. («Экзотические» баги чинить сложнее.[^debugit])

Чем крайние случаи разнообразнее, тем легче подобрать и систематизировать тестовые данные для различных ситуаций. Знания о поведении приложения в этих ситуациях пригодится нам и в будущем, после рефакторинга.

### Определить явные и неявные входные данные

Явные входные данные — это аргументы функций или методов. Неявные — зависимости, общее или глобальное состояние, контекст работы функций и методов. Систематизация входных данных упростит составление тест-кейсов.

### Конкретизировать желаемый результат

Во время рефакторинга мы не меняем функциональность, поэтому желаемый результат — это фактическое поведение программы. Зафиксировать это поведение мы можем в виде данных (например, результата работы функции) или желаемого побочного эффекта (изменения состояния или вызова API).

В идеале результат должен находиться _на границе_ части кода, которую мы рефакторим. Проверять такой результат проще, а количество затронутого кода будет минимально.

Если результат находится на границе, его проще проверять

### Настроить автотесты

Нам потребуется тестировать _каждое_ изменение. Тестирование вручную будет утомлять, из-за чего мы можем начать лениться или забывать о проверке изменений.

У автоматических тестов таких проблем нет. Мы можем настроить перезапуск тестов на каждое сохранение кода и запустить их перед началом рефакторинга. Так результат проверки всегда будет перед глазами, и мы раньше заметим, какое изменение сломало работу кода.

Как выбрать вид тестов, зависит от ситуации и не так важно, как их наличие. Если можно обойтись юнит-тестами, то я предпочту использовать их. Если приходится тестировать работу нескольких модулей, может понадобиться интеграционный или E2E тест.

Основной смысл — именно в автоматизации. Чем меньше проверок мы будем делать руками, тем меньше будет вероятность человеческой ошибки.

## Ужесточить настройки линтеров и компилятора

Этот пункт опциональный, но очень нравится мне лично.

Более агрессивные настройки линтера или компилятора помогают подмечать случайные ошибки и плохие практики. «Более агре


hy-font-family, Roboto, sans-serif));font-size:0.875rem;font-size:var(--mdc-typography-button-font-size, 0.875rem);line-height:2.25rem;line-height:var(--mdc-typography-button-line-height, 2.25rem);font-weight:500;font-weight:var(--mdc-typography-button-font-weight, 500);letter-spacing:0.0892857143em;letter-spacing:var(--mdc-typography-button-letter-spacing, 0.0892857143em);text-decoration:none;-webkit-text-decoration:var(--mdc-typography-button-text-decoration, none);text-decoration:var(--mdc-typography-button-text-decoration, none);text-transform:uppercase;text-transform:var(--mdc-typography-button-text-transform, uppercase);border-radius:24px;padding:0 20px;width:auto;max-width:100%;height:48px;line-height:normal}.mdc-fab--extended .mdc-fab__ripple{border-radius:24px}.mdc-fab--extended .mdc-fab__icon{margin-left:-8px;margin-right:12px}[dir=rtl] .mdc-fab--extended .mdc-fab__icon,.mdc-fab--extended .mdc-fab__icon[dir=rtl]{margin-left:12px;margin-right:-8px}.mdc-fab--extended .mdc-fab__label+.mdc-fab__icon{margin-left:12px;margin-right:-8px}[dir=rtl] .mdc-fab--extended .mdc-fab__label+.mdc-fab__icon,.mdc-fab--extended .mdc-fab__label+.mdc-fab__icon[dir=rtl]{margin-left:-8px;margin-right:12px}.mdc-fab--touch{margin-top:4px;margin-bottom:4px;margin-right:4px;margin-left:4px}.mdc-fab--touch .mdc-fab__touch{position:absolute;top:50%;right:0;height:48px;left:50%;width:48px;transform:translate(-50%, -50%)}.mdc-fab::before{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;border:1px solid transparent;border-radius:inherit;content:""}.mdc-fab__label{justify-content:flex-start;text-overflow:ellipsis;white-space:nowrap;overflow-x:hidden;overflow-y:visible}.mdc-fab__icon{transition:transform 180ms 90ms cubic-bezier(0, 0, 0.2, 1);fill:currentColor;will-change:transform}.mdc-fab .mdc-fab__icon{display:inline-flex;align-items:center;justify-content:center}.mdc-fab--exited{transform:scale(0);opacity:0;transition:opacity 15ms linear 150ms,transform 180ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-fab--exited .mdc-fab__icon{transform:scale(0);transition:transform 135ms 0ms cubic-bezier(0.4, 0, 1, 1)}.mdc-fab{--mdc-ripple-fg-size: 0;--mdc-ripple-left: 0;--mdc-ripple-top: 0;--mdc-ripple-fg-scale: 1;--mdc-ripple-fg-translate-end: 0;--mdc-ripple-fg-translate-start: 0;-webkit-tap-highlight-color:rgba(0,0,0,0)}.mdc-fab .mdc-fab__ripple::before,.mdc-fab .mdc-


_EXPLOSION104
	.byt $4c,$5a,$37,$37,$80,$04,$ac,$01,$a5,$40,$00,$20,$42,$06,$30,$05
	.byt $60,$45,$0f,$c0,$4b,$ad,$60,$20,$b0,$57,$70,$1f,$c0,$78,$1f,$c0
	.byt $7c,$de,$50,$b0,$7f,$7a,$4a,$6a,$62,$80,$41,$7f,$f7,$75,$5f,$7f
	.byt $72,$80,$43,$7f,$7a,$7f,$7d,$7f,$62,$80,$45,$7f,$75,$7f,$7f,$62
	.byt $80,$93,$43,$7f,$00,$00,$62,$80,$47,$0f,$10,$62,$80,$4b,$b6,$1f
	.byt $00,$7e,$7e,$1f,$b0,$77,$7d,$1f,$b0,$7f,$b5,$7e,$c3,$70,$57,$4f
	.byt $10,$7f,$50,$f4,$60,$4f,$6a,$0f,$20,$68,$1f,$c0,$74,$3f,$b0,$7f
	.byt $7a,$7f,$b0,$81,$7f,$c1,$70,$1f,$30,$40,$70,$5f,$30,$a1,$70,$5f
	.byt $20,$7e,$54,$c1,$70,$1f,$d0,$6f,$4f,$30,$78,$65,$51,$5f,$5f,$30
	.byt $88,$c1,$60,$1f,$40,$80,$50,$41,$1f,$d0,$8e,$30,$e1,$60,$45,$00
	.byt $0f,$40,$42,$51,$3e,$21,$42,$81,$be,$40,$62,$61,$fe,$10,$82,$20
	.byt $50,$e5,$41,$1e,$11,$22,$21,$e5,$41,$6b,$7e,$01,$7b,$1f,$70,$20
	.byt $7e,$50,$00,$61,$6e,$50,$c2,$51,$1f,$60,$54,$1f,$c0,$03,$32,$15
	.byt $55,$de,$10,$5d,$1f,$70,$4a,$fe,


9a1 1 0 0 0 2 0V9a1 1 0 0 0-2 0Z'/%3E%3Cpath d='M6 9a1 1 0 0 0 .707-.293l3.586-3.586a1.025 1.025 0 0 1 1.414 0l2.172 2.172a3 3 0 0 0 4.242 0l5.586-5.586A1 1 0 0 0 22.293.293L16.707 5.878a1 1 0 0 1-1.414 0L13.121 3.707a3 3 0 0 0-4.242 0L5.293 7.293A1 1 0 0 0 6 9Z'/%3E%3C/svg%3E");
}

/* Bold Glyph */
body:not(.no-svg-replace) svg.bold-glyph {
  -webkit-mask-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' id='Outline' viewBox='0 0 24 24' width='100%25' height='100%25'%3E%3Cpath d='M17.954 10.663A6.986 6.986 0 0 0 12 0H5A2 2 0 0 0 3 2V22a2 2 0 0 0 2 2H15a6.994 6.994 0 0 0 2.954-13.337ZM7 4h5a3 3 0 0 1 0 6H7Zm8 16H7V14h8a3 3 0 0 1 0 6Z'/%3E%3C/svg%3E");
}

/* Box Glyph */
body:not(.no-svg-replace) svg.box-glyph {
  -webkit-mask-image: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg xmlns='http://www.w3.org/2000/svg' id='Outline' viewBox='0 0 24 24' width='100%25' height='100%25'%3E%3Cpath d='M9 14h6a1 1 0 0 0 0-2H9a1 1 0 0 0 0 2Z'/%3E%3Cpath d='M19 0H5A5.006 5.006 0 0 0 0 5V6A3 3 0 0 0 1 8.234V19a5.006 5.006 0 0 0 5 5H18a5.006 5.006 0 0 0 5-5V8.234A3 3 0 0 0 24 6V5A5.006 5.006 0 0 0 19 0ZM2 5A3 3 0 0 1 5 2H19a3 3 0 0 1 3 3V6a1 1 0 0 1-1 1H3A1 1 0 0 1 2 6ZM21 19a3 3 0 0 1-3 3H6a3 3 0 0 1-3-3V9H21Z'/%3E%3C/svg%3E");
}

/* Bracket Glyph */
body:not(.no-svg-replace) svg.bracket-glyph {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='100%25' height='100%25' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M2 17.5V18.9999C2 19.7955 2.31607 20.5586 2.87868 21.1212C3.44129 21.6838 4.20435 21.9999 5 21.9999H7C7.26522 21.9999 7.51957 22.1052 7.70711 22.2928C7.89464 22.4803 8 22.7346 8 22.9999C8 23.2651 7.89464 23.5194 7.70711 23.707C7.51957 23.89


�上下文理解、速度与质量

### **上下文优化**

- 补全功能可利用浏览文件、终端命令、Cascade 会话等信号
- 剪贴板上下文（默认关闭，可在高级设置中启用）
- 上下文长度扩展，提升补全效果

### **质量提升**

- 自动选择插入补全 vs 编辑补全更加精准
- Tab to Jump 跳转范围翻倍
- 提高缩进与排版质量

### **性能提升**

- 预测触发补全，连贯完成多轮建议
- 增强服务器能力与推理速度
- 网络优化，延迟更低

### **Tab 使用体验升级**

- 接受的补全高亮为绿色（可关闭）

- Tab to Jump 与 Tab to Import 小部件视觉更清晰、可点击

### **其他改进**

- 自动修复 Lint 模式中信用扣除更准确
- 终端命令现可作为上下文
- Debug Console 中 Tab 键支持补全
- Cascade 差异审查体验优化
- 修复信用不足提示、补全速度设置等问题
- 快捷设置下拉菜单改进
- 提升 CPU 和内存使用效率
- 新增 Neon 数据库作为 MCP 模板

## **v 1.4.6**

2025年3月10日

### **修复内容**

- 修复 Sonnet 3.7 网页搜索问题
- 修复代理设置问题

## v 1.4.4 修复

2025年3月6日

- 重新添加设置项至设置面板（代理设置、索引大小）

## v 1.4.3

### **2025年3月5日**

### **Windsurf 预览、自动 Linter、新 MCP 服务**

#### **Windsurf 预览（测试版）**

- Cascade 支持在 IDE 或浏览器中预览本地网站
- 可选中 React 或 HTML 元素作为上下文提供给 Cascade
- 错误信息也可传递作为上下文
- 可通过“启动 Web 应用”或工具栏图标激活预览
- 支持在 Chrome、Arc、Chromium 浏览器中展示
- 可在设置中关闭

#### **Cascade 自动 Linter**

- Cascade 现在自动修复自己生成代码中的 lint 错误
- 每步中 lint 修复不计入积分消耗
- 示例：若某次修改包含4个 lint 错误，将自动尝试修复，无额外消耗
- 可在设置中关闭

#### **新 MCP 服务支持**

- 可将 Cascade 配置为调用可信 MCP 工具服务器
- Windsurf 设置页提供常用 MCP 服务器列表
- 新用户界面便于添加和配置 MCP
- 设置页中仍支持用户自定义 JSON
- 专


nd going through those tutorials first.

We will be implementing the same code to build the below database for the International Language School, but this time doing it via Python using MySQL Connector.

[![Entity Relationship Diagram for Database][erd]][link1]

[erd]: ./img/ERD.png
[link1]: https://towardsdatascience.com/designing-a-relational-database-and-creating-an-entity-relationship-diagram-89c1c19320b2

-----------------

### Methods used
* Defining functions in Python
* Database Implementation
* Creating, Reading, Updating and Deleting data using SQL and Python

### Technologies used
* [MySQL Community Server](https://dev.mysql.com/downloads/mysql/)
* [MySQL Python Connector](https://dev.mysql.com/doc/connector-python/en/)
* [PopSQL](https://popsql.com/)
* [Jupyter Notebook](https://jupyter.org/)
* [pandas](https://pandas.pydata.org/)

### Data sources
The data used were created by myself for an earlier [project](https://github.com/thecraigd/SQL_School_Tutorial).
Some participant names were created using [Fake Name Generator](https://www.fakenamegenerator.com/).

### Getting started

1. Clone this repo (for help see this [tutorial](https://help.github.com/articles/cloning-a-repository/)).
2. All code is contained within the [Jupyter Notebook](https://github.com/thecraigd/Python_SQL/blob/master/mysql.ipynb) for this project, stored in the root folder as mysql.ipynb

## Featured Notebooks
* [mysql](https://github.com/thecraigd/Python_SQL/blob/master/mysql.ipynb)

* [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/thecraigd/Python_SQL/master)

## Contact
All feedback is warmly received. Craig Dickson can be contacted at [craigdoesdata.com](https://www.craigdoesdata.com/contact.html).
# go-notify

[![PkgGoDev](https://pkg.go.dev/badge/github.com/TheCreeper/go-notify)](https://pkg.go.dev/github.com/TheCreeper/go-notify)

Package notify provides an implementation of the Gnome DBus
[Notifications Specification](https://developer.gnome.org/notification-spec).

## Examples

Display a simple notification.
```Go
ntf := notify.NewNotification("Test Notification", "Just a test")
if _, err := ntf.Show(); err != nil {
	return
}
```

Display a notification with an icon. Consult the
[Icon Naming Specification](http://standards.freedesktop.org/icon-naming-spec).
```Go
ntf := notify.NewNotification("Test Notification", "Just a test")
ntf.AppIcon = "network-wireless"
if _, err := ntf.Show(); err != nil {
	return
}
```


../g', bases[3], 'fred:///s/g'],
  // may change to fred:///s//a/../../../g
  ['../../../../g', bases[3], 'fred:///g'],

  // http://gbiv.com/protocols/uri/test/rel_examples5.html
  // double and triple slash, well-known scheme
  ['g:h', bases[4], 'g:h'],
  ['g', bases[4], 'http:///s//a/b/g'],
  ['./g', bases[4], 'http:///s//a/b/g'],
  ['g/', bases[4], 'http:///s//a/b/g/'],
  ['/g', bases[4], 'http:///g'],  // may change to http:///s//a/g
  ['//g', bases[4], 'http://g/'],   // may change to http:///s//g
  ['//g/x', bases[4], 'http://g/x'], // may change to http:///s//g/x
  ['///g', bases[4], 'http:///g'],
  ['./', bases[4], 'http:///s//a/b/'],
  ['../', bases[4], 'http:///s//a/'],
  ['../g', bases[4], 'http:///s//a/g'],
  ['../../', bases[4], 'http:///s//'],
  ['../../g', bases[4], 'http:///s//g'],
  // may change to http:///s//a/../../g
  ['../../../g', bases[4], 'http:///s/g'],
  // may change to http:///s//a/../../../g
  ['../../../../g', bases[4], 'http:///g'],

  // from Dan Connelly's tests in http://www.w3.org/2000/10/swap/uripath.py
  ['bar:abc', 'foo:xyz', 'bar:abc'],
  ['../abc', 'http://example/x/y/z', 'http://example/x/abc'],
  ['http://example/x/abc', 'http://example2/x/y/z', 'http://example/x/abc'],
  ['../r', 'http://ex/x/y/z', 'http://ex/x/r'],
  ['q/r', 'http://ex/x/y', 'http://ex/x/q/r'],
  ['q/r#s', 'http://ex/x/y', 'http://ex/x/q/r#s'],
  ['q/r#s/t', 'http://ex/x/y', 'http://ex/x/q/r#s/t'],
  ['ftp://ex/x/q/r', 'http://ex/x/y', 'ftp://ex/x/q/r'],
  ['', 'http://ex/x/y', 'http://ex/x/y'],
  ['', 'http://ex/x/y/', 'http://ex/x/y/'],
  ['', 'http://ex/x/y/pdq', 'http://ex/x/y/pdq'],
  ['z/', 'http://ex/x/y/', 'http://ex/x/y/z/'],
  ['#Animal',
   'file:/swap/test/animal.rdf',
   'file:/swap/test/animal.rdf#Animal'],
  ['../abc', 'file:/e/x/y/z', 'file:/e/x/abc'],
  ['/example/x/abc', 'file:/example2/x/y/z', 'file:/example/x/abc'],
  ['../r', 'file:/ex/x/y/z', 'file:/ex/x/r'],
  ['/r', 'file:/ex/x/y/z', 'file:/r'],
  ['q/r', 'file:/ex/x/y', 'file:/ex/x/q/r'],
  ['q/r#s', 'file:/ex/x/y'


   private final ReferenceFrame centerOfMassFrame;
   private final PoseReferenceFrame planeFrame;

   private final YoFramePoint2D desiredCoP;
   private final YoFramePoint2D previousCoP;

   private final YoBoolean deactivateRhoWhenNotInContact;

   private final YoBoolean[] rhoEnabled;
   private final FramePoint3D[] basisVectorsOrigin;
   private final FrameVector3D[] basisVectors;
   private final YoDouble[] maxContactForces;
   private final YoDouble[] rhoWeights;

   private final RotationMatrix normalContactVectorRotationMatrix = new RotationMatrix();

   private final FramePoint2D contactPoint2d = new FramePoint2D();
   private final FrictionConeRotationCalculator coneRotationCalculator;
   private final CoPObjectiveCalculator copObjectiveCalculator = new CoPObjectiveCalculator();

   public PlaneContactStateToWrenchMatrixHelper(ContactablePlaneBody contactablePlaneBody, ReferenceFrame centerOfMassFrame, int maxNumberOfContactPoints,
                                                int numberOfBasisVectorsPerContactPoint, FrictionConeRotationCalculator coneRotationCalculator,
                                                YoRegistry parentRegistry)
   {
      List<? extends FramePoint2DReadOnly> contactPoints2d = contactablePlaneBody.getContactPoints2D();

      if (contactPoints2d.size() > maxNumberOfContactPoints)
         throw new RuntimeException("Unexpected number of contact points: " + contactPoints2d.size());

      this.centerOfMassFrame = centerOfMassFrame;
      this.maxNumberOfContactPoints = maxNumberOfContactPoints;
      this.numberOfBasisVectorsPerContactPoint = numberOfBasisVectorsPerContactPoint;
      this.coneRotationCalculator = coneRotationCalculator;

      rhoSize = maxNumberOfContactPoints * numberOfBasisVectorsPerContactPoint;
      basisVectorAngleIncrement = 2.0 * Math.PI / numberOfBasisVectorsPerContactPoint;

      rhoMatrix = new DMatrixRMaj(rhoSize, 1);
      wrenchJacobianInCoMFrame = new DMatrixRMaj(SpatialForce.SIZE, rhoSize);
      copRegularizationJacobian = new DMatrixRMaj(2, rhoSize);
      copRegularizationObjective = new DMatrixRMaj(2, 1);
      copRegularizationObjective.zero();
      copRateRegularizationJacobian = new DMatrixRMaj(2, rhoSize);
      copRateRegularizationObjective = new DMatrixRMaj(2, 1);
      copRateRegularizationObjective.zero();
      wrenchJacobianInPlaneFrame = new DMatrixRMaj(Wrench.SIZE, rhoSize);

      rhoMaxMatrix = new DMatrixRMaj(rhoSize, 1);
      rhoWeightMatrix = new DMatrixRMaj(rhoSize, rhoSize);
      rhoRateWeightMatrix = new DMatrixRMaj(rhoSize, rhoSize);

      activeRhoMatrix = new DMatrixRMaj(rhoSize, 1);
      CommonOps_DDRM.fill(activeRhoMatrix, 1.0);

      CommonOps_DDRM.fill(rhoMaxMatrix, Double.POSITIVE_INFINITY);

      String bodyName = contactablePlaneBody.getName();
      String namePrefix = bodyName + "WrenchMatrixHelper";
      YoRegistry registry = new YoRegistry(namePrefix);

      RigidBodyBasics rigidBody = contactablePlaneBody.getRigidBody();
      planeFrame = new PoseReferenceFrame(namePrefix + "ContactFrame", rigidBody.getBodyFixedFrame());
      planeFrame.setPoseAndUpdate(contactablePlaneBody.getContactFrame().getTransformToDesiredFrame(rigidBody.getBodyFixedFrame()));
      yoPlaneContactState = new YoPlaneContactState(namePrefix, rigidBody, planeFrame, contactPoints2d, 0.0, registry);
      yoPlaneContactState.clear();
      yoPlaneContactState.computeSupportPolygon();

      hasReset =


Composable
fun MapButton(icon: ImageVector, contentDescription: String?, modifier: Modifier = Modifier, onClick: () -> Unit = {}) {
    FloatingActionButton(onClick = onClick, modifier = modifier) {
        Icon(imageVector = icon, contentDescription = contentDescription, modifier = Modifier.size(24.dp))
    }
}

@PreviewLightDark
@Composable
private fun MapButtonPreview() {
    AppTheme { MapButton(icon = Icons.Outlined.Layers, contentDescription = R.string.map_style_selection) }
}
/*
 * Copyright (c) 2025 Meshtastic LLC
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package org.meshtastic.feature.map.node

import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.navigation.toRoute
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asFlow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.toList
import org.meshtastic.core.common.BuildConfigProvider
import org.meshtastic.core.data.repository.MeshLogRepository
import org.meshtastic.core.data.repository.NodeRepository
import org.meshtastic.core.navigation.NodesRoutes
import org.meshtastic.core.prefs.map.MapPrefs
import org.meshtastic.core.proto.toPosition
import org.meshtastic.feature.map.model.CustomTileSource
import org.meshtastic.proto.MeshProtos.Position
import org.meshtastic.proto.Portnums.PortNum
import javax.inject.Inject

@HiltViewModel
class NodeMapViewModel
@Inject
constructor(
    savedStateHandle: SavedStateHandle,
    nodeRepository: NodeRepository,
    meshLogRepository: MeshLogRepository,
    buildConfigProvider: BuildConfigProvider,
    private val mapPrefs: MapPrefs,
) : ViewModel() {
    private val destNum = savedStateHandle.toRoute<NodesRoutes.NodeDetailGraph>().destNum

    val node =
        nodeRepository.nodeDBbyNum
            .mapLatest { it[destNum] }
            .distinctUntilChanged()
            .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000L), null)

    val applicationId = buildConfigProvider.applicationId

    val positionLogs: StateFlow<List<Position>> =
        meshLogRepository
            .getMeshPacketsFrom(destNum!!, PortNum.POSITION_APP_VALUE)
            .map { packets ->
                packets
                    .mapNotNull { it.toPosition() }
                    .asFlow()
                    .distinctUntilChanged { old, new ->
                        old.time == new.time || (old.latitudeI == new.latitudeI && old.longitudeI == new.longitudeI)
                    }
                    .toList()
            }
            .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000L), emptyList())

    val tileSource
        get() = CustomTileSource.getTileSource(mapP


_044_mvl/mxv
	.byte	W01
	.byte		        44*seq_044_mvl/mxv
	.byte	W02
	.byte		        45*seq_044_mvl/mxv
	.byte	W04
	.byte		        48*seq_044_mvl/mxv
	.byte	W01
	.byte		        49*seq_044_mvl/mxv
	.byte	W02
	.byte		        50*seq_044_mvl/mxv
	.byte	W01
	.byte		        51*seq_044_mvl/mxv
	.byte	W02
	.byte		        51*seq_044_mvl/mxv
	.byte	W01
	.byte		        52*seq_044_mvl/mxv
	.byte	W02
	.byte		        53*seq_044_mvl/mxv
	.byte	W02
	.byte		        55*seq_044_mvl/mxv
	.byte	W01
	.byte		        56*seq_044_mvl/mxv
	.byte	W02
	.byte		        57*seq_044_mvl/mxv
	.byte	W01
	.byte		        58*seq_044_mvl/mxv
	.byte	W02
	.byte		        59*seq_044_mvl/mxv
	.byte	W01
	.byte		        60*seq_044_mvl/mxv
	.byte	W02
	.byte		        61*seq_044_mvl/mxv
	.byte	W02
	.byte	PEND
	.byte	PATT
	 .word	seq_044_6 + 0x98
	.byte		EOT   , Gs3
	.byte	PATT
	 .word	seq_044_6 + 0x3B3
	.byte	PATT
	 .word	seq_044_6 + 0x98
	.byte		EOT   , Fs3
	.byte	PATT
	 .word	seq_044_6 + 0x434
	.byte	PATT
	 .word	seq_044_6 + 0x98
	.byte		EOT   , Gs3
	.byte	PATT
	 .word	seq_044_6 + 0x3B3
	.byte	PATT
	 .word	seq_044_6 + 0x98
	.byte		EOT   , Fs3
	.byte	PATT
	 .word	seq_044_6 + 0x434
	.byte	PATT
	 .word	seq_044_6 + 0x98
	.byte		EOT   , Gs3
	.byte	PATT
	 .word	seq_044_6 + 0x3B3
	.byte	PATT
	 .word	seq_044_6 + 0x98
	.byte		EOT   , Fs3
	.byte	PATT
	 .word	seq_044_6 + 0x434
	.byte	W36
	.byte	W02
	.byte		VOL   , 58*seq_044_mvl/mxv
	.byte	W03
	.byte		        57*seq_044_mvl/mxv
	.byte	W02
	.byte		        56*seq_044_mvl/mxv
	.byte	W03
	.byte		        55*seq_044_mvl/mxv
	.byte	W02
	.byte		        54*seq_044_mvl/mxv
	.byte	W03
	.byte		        53*seq_044_mvl/mxv
	.byte	W02
	.byte		        52*seq_044_mvl/mxv
	.byte	W03
	.byte		        51*seq_044_mvl/mxv
	.byte	W05
	.byte		        49*seq_044_mvl/mxv
	.byte	W02
	.byte		        47*seq_044_mvl/mxv
	.byte	W02
	.byte		        45*seq_044_mvl/mxv
	.byte	W01
	.byte		        44*seq_04


,.tox .tox-textfield,.tox .tox-toolbar-textfield{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#2b3b4e;border-color:#000;border-radius:3px;border-style:solid;border-width:1px;box-shadow:none;box-sizing:border-box;color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;font-size:16px;line-height:24px;margin:0;outline:0;padding:5px 4.75px;resize:none;width:100%}.tox .tox-textarea[disabled],.tox .tox-textfield[disabled]{background-color:#222f3e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-selectfield select:focus,.tox .tox-textarea:focus,.tox .tox-textfield:focus{border-color:#207ab7;box-shadow:none;outline:0}.tox .tox-toolbar-textfield{border-width:0;margin-bottom:3px;margin-top:2px;max-width:250px}.tox .tox-naked-btn{background-color:transparent;border:0;border-color:transparent;box-shadow:unset;color:#207ab7;cursor:pointer;display:block;margin:0;padding:0}.tox .tox-naked-btn svg{display:block;fill:#fff}.tox:not([dir=rtl]) .tox-toolbar-textfield+*{margin-left:4px}.tox[dir=rtl] .tox-toolbar-textfield+*{margin-right:4px}.tox .tox-selectfield{cursor:pointer;position:relative}.tox .tox-selectfield select[disabled]{background-color:#19232e;color:rgba(255,255,255,.85);cursor:not-allowed}.tox .tox-selectfield select::-ms-expand{display:none}.tox .tox-selectfield svg{pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.tox:not([dir=rtl]) .tox-selectfield select[size="0"],.tox:not([dir=rtl]) .tox-selectfield select[size="1"]{padding-right:24px}.tox:not([dir=rtl]) .tox-selectfield svg{right:8px}.tox[dir=rtl] .tox-selectfield select[size="0"],.tox[dir=rtl] .tox-selectfield select[size="1"]{padding-left:24px}.tox[dir=rtl] .tox-selectfield svg{left:8px}.tox .tox-textarea{-webkit-appearance:textarea;-moz-appearance:textarea;appearance:textarea;white-space:pre-wrap}.tox-fullscreen{border:0;height:100%;left:0;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;position:fixed;top:0;touch-action:pinch-zoom;width:100%}.tox-fullscreen .tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-fullscreen .tox.tox-tinymce.tox-fullscreen{z-index:1200}.tox-fullscreen .tox.tox-tinymce-aux{z-index:1201}.tox .tox-image-tools{width:100%}.tox .tox-image-tools__toolbar{align-items:center;display:flex;justify-content:center}.tox .tox-image-tools__image{background-color:#666;height:380px;overflow:auto;position:relative;width:100%}.tox .tox-image-tools__image,.tox .tox-image-tools__image+.tox-image-tools__toolbar{margin-top:8px}.tox .tox-image-tools__image-bg{background


亦刑叔伯 如跌扑血光之灾 多应玄武昏惨 及赤脉之露出 法令燥炎 多主狎侠之损 一为间接谋而有障碍 应汤火者颇多
耳根黑子 倒死路旁 承浆纹陷 恐投浪里
耳根黑子 主聪明多疾 及有专长之特别技艺 又主水上惊恐之灾 亦主享盛名 其倒死路傍之说不验 承浆直纹主添寿 横纹主水惊 反纹主水死
眼堂过厚 亦主贪淫 人中太偏 必多刑克
眼堂过厚 主子女多而相刑 其气厚而淫 人中偏左妨父 偏右妨母 然偏左先得子而子多 偏右先得女而女多 有刑有旺 不是刑克专部 为参考之部也
鬼牙尖露 诡谲奸贪 神眉睁嵘 凶豪恶死
鬼牙尖长 不平不固 高低不一 其人刑克重而刑父母 又主本身恶梦多 为愚鲁之人 神眉是否露煞而浓 交叉而胡 主性刚而骄可矣 凶死者 当有别部参合
人形似鬼 衣食不丰 生相若僲 平生闲逸
鬼形为惨暗之客 寒滞之类 主冷退而忧愁度日也 仙形清秀之貌 慈和之例 主安闲而多福泽也
谷道乱毛 号曰淫秒 耳根高骨 号曰寿根
谷道乱毛 多聪明而刑妻 有生离者 贪淫亦合 其谷道无毛 亦主凶死 当以少而柔细者刀古 耳后高骨 是为寿徵之一 又主寿而劳心也
骨格神清 瘦亦可取 肉流浊厚 肥何足夸
木形清瘦 自古有遗迹流芳者 多出木形 或文章诗词鸣世及仙品 亦为木形居多 故肥厚而流浊 皆贱恶之品
目浮四白 主孤克而凶愚 鼻曲三凹 必贫穷而孤苦
目圆浮白 主凶死居多 其寿亦不永 骄而淫乱 不主愚 鼻曲三凹 主刑人丁 不主苦 此二者为相法之忌 虽他部奇特 亦不完善也
三尖六削 虽奸巧而受穷 四正五端 纵愚诚而多福
三尖为发


truct switchdev_trans *trans)
{
	struct dsa_notifier_mdb_info info = {
		.sw_index = dp->ds->index,
		.port = dp->index,
		.trans = trans,
		.mdb = mdb,
	};

	return dsa_port_notify(dp, DSA_NOTIFIER_MDB_ADD, &info);
}

int dsa_port_mdb_del(struct dsa_port *dp,
		     const struct switchdev_obj_port_mdb *mdb)
{
	struct dsa_notifier_mdb_info info = {
		.sw_index = dp->ds->index,
		.port = dp->index,
		.mdb = mdb,
	};

	return dsa_port_notify(dp, DSA_NOTIFIER_MDB_DEL, &info);
}

int dsa_port_vlan_add(struct dsa_port *dp,
		      const struct switchdev_obj_port_vlan *vlan,
		      struct switchdev_trans *trans)
{
	struct dsa_notifier_vlan_info info = {
		.sw_index = dp->ds->index,
		.port = dp->index,
		.trans = trans,
		.vlan = vlan,
	};

	return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_ADD, &info);
}

int dsa_port_vlan_del(struct dsa_port *dp,
		      const struct switchdev_obj_port_vlan *vlan)
{
	struct dsa_notifier_vlan_info info = {
		.sw_index = dp->ds->index,
		.port = dp->index,
		.vlan = vlan,
	};

	return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_DEL, &info);
}


0>=hb-1) break; GHinit;
        _m0=SET(M0[y]); _m1=SET(M1[y]);
        if(hasLf) { _m=SET(0,0,ms[1],ms[0]);
          GH(H0+O0[y],_m,_m0); GH(H0+O1[y],_m,_m1); }
        if(hasRt) { _m=SET(0,0,ms[3],ms[2]);
          GH(H0+O0[y]+hb,_m,_m0); GH(H0+O1[y]+hb,_m,_m1); }
      }
      // final rows, no bottom bin
      for( ; y<h0; y++ ) {
        yb0 = (int) yb; GHinit;
        if(hasLf) { H0[O0[y]]+=ms[0]*M0[y]; H0[O1[y]]+=ms[0]*M1[y]; }
        if(hasRt) { H0[O0[y]+hb]+=ms[2]*M0[y]; H0[O1[y]+hb]+=ms[2]*M1[y]; }
      }
      #undef GHinit
      #undef GH
    }
  }
  alFree(O0); alFree(O1); alFree(M0); alFree(M1);
  // normalize boundary bins which only get 7/8 of weight of interior bins
  if( softBin%2!=0 ) for( int o=0; o<nOrients; o++ ) {
    x=0; for( y=0; y<hb; y++ ) H[o*nb+x*hb+y]*=8.f/7.f;
    y=0; for( x=0; x<wb; x++ ) H[o*nb+x*hb+y]*=8.f/7.f;
    x=wb-1; for( y=0; y<hb; y++ ) H[o*nb+x*hb+y]*=8.f/7.f;
    y=hb-1; for( x=0; x<wb; x++ ) H[o*nb+x*hb+y]*=8.f/7.f;
  }
}

/******************************************************************************/

// HOG helper: compute 2x2 block normalization values (padded by 1 pixel)
float* hogNormMatrix( float *H, int nOrients, int hb, int wb, int bin ) {
  float *N, *N1, *n; int o, x, y, dx, dy, hb1=hb+1, wb1=wb+1;
  float eps = 1e-4f/4/bin/bin/bin/bin; // precise backward equality
  N = (float*) wrCalloc(hb1*wb1,sizeof(float)); N1=N+hb1+1;
  for( o=0; o<nOrients; o++ ) for( x=0; x<wb; x++ ) for( y=0; y<hb; y++ )
    N1[x*hb1+y] += H[o*wb*hb+x*hb+y]*H[o*wb*hb+x*hb+y];
  for( x=0; x<wb-1; x++ ) for( y=0; y<hb-1; y++ ) {
    n=N1+x*hb1+y; *n=1/float(sqrt(n[0]+n[1]+n[hb1]+n[hb1+1]+eps)); }
  x=0;     dx= 1; dy= 1; y=0;                  N[x*hb1+y]=N[(x+dx)*hb1+y+dy];
  x=0;     dx= 1; dy= 0; for(y=0; y<hb1; y++)  N[x*hb1+y]=N[(x+dx)*hb1+y+dy];
  x=0;     dx= 1; dy=-1; y=hb1-1;              N[x*hb1+y]=N[(x+dx)*hb1+y+dy];
  x=wb1-1; dx=-1


#!/usr/bin/env python
# coding: utf-8
# Copyright (c) Saga Inc.
# Distributed under the terms of the GNU Affero General Public License v3.0 License.

# Copyright (c) Mito.
# Distributed under the terms of the Modoried BSD License.

"""
Contains tests for the AND function.
"""

import pytest
import pandas as pd

from mitosheet.public.v1.sheet_functions.control_functions import AND
from mitosheet.tests.test_utils import create_mito_wrapper

# Raw function tests

AND_TESTS = [
    (pd.Series(data=[True]), pd.Series(data=[True]), pd.Series(data=[True])),
    (pd.Series(data=[True, True]), pd.Series(data=[True, True]), pd.Series(data=[True, True])),
    (pd.Series(data=[False, True]), pd.Series(data=[True, True]), pd.Series(data=[False, True])),
    (pd.Series(data=[True, False]), pd.Series(data=[True, True]), pd.Series(data=[True, False])),
    (pd.Series(data=[True, True]), pd.Series(data=[False, True]), pd.Series(data=[False, True])),
    (pd.Series(data=[True, True]), pd.Series(data=[True, False]), pd.Series(data=[True, False])),
    (pd.Series(data=[True, False]), pd.Series(data=[True, False]), pd.Series(data=[True, False])),
    (pd.Series(data=[False, False]), pd.Series(data=[False, False]), pd.Series(data=[False, False])),
    (pd.Series(data=[0, 0]), pd.Series(data=[1, 1]), pd.Series(data=[False, False])),
    (pd.Series(data=[0, 0]), pd.Series(data=[1, 1]), pd.Series(data=[False, False])),
]
@pytest.mark.parametrize("series_one,series_two,result", AND_TESTS)
def test_and_direct(series_one, series_two, result):
    assert AND(series_one, series_two).equals(result)

@pytest.mark.parametrize("series_one,series_two,result", AND_TESTS)
def test_and_in_mitosheet(series_one,series_two,result):
    mito = create_mito_wrapper(pd.DataFrame(data={
        'A': series_one,
        'B': series_two,
    }))
    mito.set_formula('=AND(A, B)', 0, 'C', add_column=True)
    assert mito.get_column(0, 'C', as_list=False).equals(result)

AND_CONDITION_CONSTANT_TESTS = [
    (pd.Series(data=[1, 1]), '=AND(A == 1, A == 2)', pd.Series(data=[False, False])),
    (pd.Series(data=[3, 2]), '=AND(A == 1, A == 2)', pd.Series(data=[False, False])),
    (pd.Series(data=[3, 2]), '=AND(A == 10, A == 11)', pd.Series(data=[False, False])),
    (pd.Series(data=[1, 2, 3]), '=AND(A == 1, A == 2, A == 3)', pd.Series(data=[False, False, False])),
    (pd.Series(data=[1, 2, 3]), '=AND(A > 0, A < 4, A < 100)', pd.Series(data=[True, True, True])),
    (pd.Series(data=[1, 2, 3]), '=AND(A > 1, A < 3, A == 2)', pd.Series(data=[False, True, False])),
]
@pytest.mark.parametrize("A, and_formula, result", AND_CONDITION_CONSTANT_TESTS)
def test_or_conditions_constant(A, and_formula, result):
    mito = create_mito_wrapper(pd.DataFrame(data={
        'A': A
    }))
    mito.set_formula(f'{and_formula}', 0, 'B', add_column=True)
    assert mito.get_column(0, 'B', as_list=False).equals(result)


SulfurTigerTail),
            LibDdon.Enemy.CreateAuto(EnemyId.SulfurSaurian, 30, 6)
                .SetNamedEnemyParams(NamedParamId.Strange),
            LibDdon.Enemy.CreateAuto(EnemyId.SulfurSaurian, 30, 7)
                .SetNamedEnemyParams(NamedParamId.Strange),
            LibDdon.Enemy.CreateAuto(EnemyId.SnowHarpy, 28, 3),
            LibDdon.Enemy.CreateAuto(EnemyId.SnowHarpy, 28, 4),
        };

        var dropsTable = LibDdon.Enemy.GetDropsTable(enemies[0]).Clone()
            .AddDrop(ItemId.CrestOfBurning0, 1, 1, DropRate.UNCOMMON)
            .AddDrop(ItemId.CrestOfFireWarding0, 1, 1, DropRate.UNCOMMON);
        enemies[0].SetDropsTable(dropsTable);

        AddEnemies(enemies);
    }
}

return new MonsterSpotInfo();


pin_code_fields 2.3.0+2

<!DOCTYPE html>

  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, user-scalable=no">
  <meta name="description" content="API docs for the longestLine property from the Paragraph class, for the Dart programming language.">
  <title>longestLine property - Paragraph class - dart:ui library - Dart API</title>

  <base href="../..">

  <link href="https://fonts.googleapis.com/css?family=Source+Code+Pro:500,400i,400,300|Source+Sans+Pro:400,300,700" rel="stylesheet">
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
  <link rel="stylesheet" href="static-assets/github.css">
  <link rel="stylesheet" href="static-assets/styles.css">
  <link rel="icon" href="static-assets/favicon.png">

  <button id="sidenav-left-toggle" type="button"> </button>

pin_code_fields

dart:ui

Paragraph

longestLine property

longestLine

  <form class="search navbar-right" role="search">
    <input type="text" id="search-box" autocomplete="off" disabled class="form-control typeahead" placeholder="Loading search...">
  </form>

      <form class="search-sidebar" role="search">
        <input type="text" id="search-sidebar" autocomplete="off" disabled class="form-control typeahead" placeholder="Loading search...">
      </form>

pin_code_fields

dart:ui

Paragraph

longestLine property

Paragraph class

        Properties

alphabeticBaseline</a


// SPDX-FileCopyrightText: © 2019-2023 The Apache Software Foundation
//
// SPDX-License-Identifier: Apache-2.0
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF 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.
 */
#ifndef TVM_META_SCHEDULE_MODULE_EQUALITY_H_
#define TVM_META_SCHEDULE_MODULE_EQUALITY_H_

#include <tvm/ir/module.h>

#include <memory>
#include <string>

namespace tvm {
namespace meta_schedule {

/*! \brief Method to compute hash and determine equality of modules  */
class ModuleEquality {
 public:
  virtual ~ModuleEquality() = default;

  virtual size_t Hash(IRModule mod) const = 0;
  virtual bool Equal(IRModule lhs, IRModule rhs) const = 0;
  virtual String GetName() const = 0;

  /*!
   * \brief Create a ModuleEquality instance
   * \param mod_eq_name A string to specify the module equality testing and hashing method.
   *  It must be one of the followings:
   *    - "structural": Use StructuralEqual/Hash
   *    - "ignore-ndarray": Same as "structural", but ignore ndarray raw data during
   *                        equality testing and hashing.
   *    - "anchor-block": Apply equality testing and hashing on the anchor block extracted from a
   *                      given module. The "ignore-ndarray" varint is used for the extracted blocks
   *                      or in case no anchor block is found.
   *                      For the definition of the anchor block, see tvm/tir/analysis.h.
   * \return An owning pointer to the created instance
   */
  static std::unique_ptr<ModuleEquality> Create(const std::string& mod_eq_name);
};

/*! \brief Functor to compute hash a module using the provided method. */
class ModuleHash {
 public:
  explicit ModuleHash(const ModuleEquality& mod_eq) : mod_eq_(mod_eq) {}
  size_t operator()(const IRModule& mod) const { return mod_eq_.Hash(mod); }

 private:
  const ModuleEquality& mod_eq_;
};

/*! \brief Functor to determine equality of modules using the provided method. */
class ModuleEqual {
 public:
  explicit ModuleEqual(const ModuleEquality& mod_eq) : mod_eq_(mod_eq) {}
  bool operator()(const IRModule& lhs, const IRModule& rhs) const {
    return mod_eq_.Equal(lhs, rhs);
  }

 private:
  const ModuleEquality& mod_eq_;
};

}  // namespace meta_schedule
}  // namespace tvm

#endif  // TVM_META_SCHEDULE_MODULE_EQUALITY_H_


-12 of another fildl
	fsub	fv_v+0(%edx)	// (i0v0-i2v0) | i0v0
		movl	mtri_vertindex-16+4(%ebx,%ebp,),%esi
		shll	$(fv_shift),%esi
		addl	%edi,%esi
	fildl	fv_v+4(%ecx)	// i0v1 | (i0v0-i2v0) | i0v0
	fld		%st(0)			// i0v1 | i0v1 | (i0v0-i2v0) | i0v0
	fsub	fv_v+4(%esi)	// (i0v1-i1v1) | i0v1 | (i0v0-i2v0) | i0v0
	fmulp	%st(0),%st(2)	// i0v1 | (i0v1-i1v1)*(i0v0-i2v0) | i0v0
	fsub	fv_v+4(%edx)	// (i0v1-i2v1) | (i0v1-i1v1)*(i0v0-i2v0) | i0v0
	fxch	%st(2)			// i0v0 | (i0v1-i1v1)*(i0v0-i2v0) | (i0v1-i2v1)
	fsub	fv_v+0(%esi)	// (i0v0-i1v0) | (i0v1-i1v1)*(i0v0-i2v0) | (i0v1-i2v1)
		movl	fv_v+16(%ecx),%eax
		andl	$0xFF00,%eax
	fmulp	%st(0),%st(2)	// (i0v1-i1v1)*(i0v0-i2v0) | (i0v0-i1v0)*(i0v1-i2v1)
		addl	C(acolormap),%eax
	fsubp	%st(0),%st(1)	// (i0v1-i1v1)*(i0v0-i2v0)-(i0v0-i1v0)*(i0v1-i2v1)
		movl	%eax,C(d_pcolormap)
	fstps	Ltemp
		movl	Ltemp,%eax
		subl	$0x80000001,%eax
		jc		Lskip

//		if (ptri[i].facesfront)
//		{
//			D_PolysetRecursiveTriangle(index0->v, index1->v, index2->v);
	movl	mtri_facesfront-16(%ebx,%ebp,),%eax
	testl	%eax,%eax
	jz		Lfacesback

	pushl	%edx
	pushl	%esi
	pushl	%ecx
	call	C(D_PolysetRecursiveTriangle)

	subl	$16,%ebp
	jnz		Llooptop
	jmp		Ldone2

//		}
//		else
//		{
Lfacesback:

//			s0 = index0->v[2];
//			s1 = index1->v[2];
//			s2 = index2->v[2];
	movl	fv_v+8(%ecx),%eax
	pushl	%eax
	movl	fv_v+8(%esi),%eax
	pushl	%eax
	movl	fv_v+8(%edx),%eax
	pushl	%eax
	pushl	%ecx
	pushl	%edx

//			if (index0->flags & ALIAS_ONSEAM)
//				index0->v[2] += r_affinetridesc.seamfixupX16;
	movl	C(r_affinetridesc)+atd_seamfixupX16,%eax
	testl	$(ALIAS_ONSEAM),fv_flags(%ecx)
	jz		Lp11
	addl	%eax,fv_v+8(%ecx)
Lp11:

//			if (index1->flags & ALIAS_ONSEAM)
//				index1->v[2] += r_affinetridesc.seamfixupX16;
	testl	$(ALIAS_ONSEAM


ancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_close.png', sizingMethod='scale'); }

.fancybox-ie6 #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_left.png', sizingMethod='scale'); }
.fancybox-ie6 #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_right.png', sizingMethod='scale'); }

.fancybox-ie6 #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_over.png', sizingMethod='scale'); zoom: 1; }
.fancybox-ie6 #fancybox-title-float-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_left.png', sizingMethod='scale'); }
.fancybox-ie6 #fancybox-title-float-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_main.png', sizingMethod='scale'); }
.fancybox-ie6 #fancybox-title-float-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_right.png', sizingMethod='scale'); }

.fancybox-ie6 #fancybox-bg-w, .fancybox-ie6 #fancybox-bg-e, .fancybox-ie6 #fancybox-left, .fancybox-ie6 #fancybox-right, #fancybox-hide-sel-frame {
	height: expression(this.parentNode.clientHeight + "px");
}

#fancybox-loading.fancybox-ie6 {
	position: absolute; margin-top: 0;
	top: expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px');
}

#fancybox-loading.fancybox-ie6 div	{ background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_loading.png', sizingMethod='scale'); }

/* IE6, IE7, IE8 */

.fancybox-ie .fancybox-bg { background: transparent !important; }

.fancybox-ie #fancybox-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_n.png', sizingMethod='scale'); }
.fancybox-ie #fancybox-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_ne.png', sizingMethod='scale'); }
.fancybox-ie #fancybox-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_e.png', sizingMethod='scale'); }
.fancybox-ie #fancybox-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_se.png', sizingMethod='scale'); }
.fancybox-ie #fancybox-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_s.png', sizingMethod='scale'); }
.fancybox-ie #fancybox-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_sw.


grid-column: 1 / 3;
  }

  .special-img{
    height: 60rem;
    width: 60%;
  }

}

/**
 * responsive for larger than 992px screen
 */
 @media(max-width: 992px){

  /* BREAD AND CHEESE IN ABOUT SECTION */

  /* .combine-bread-and-cheese{
    display: grid;
    gap: 10%;
  } */

  .bread-and-cheese{
    margin-top: 10%;
  }

  .special-dish-banner{
    display: flex;
  }

  /* .special-img-tel{
    height: 50rem;
    width: 100%;
  } */

}
@media (min-width: 992px) {

  /**
   * CUSTOM PROPERTY
   */

  :root {

    /**
     * spacing
     */

    --section-space: 100px;

  }

  /**
   * REUSED STYLE
   */

  :is(.service, .event) .container {
    max-width: unset;
  }

  :is(.service, .event) .grid-list {
    grid-template-columns: repeat(3, 1fr);
  }

  :is(.service, .event) .grid-list li:last-child {
    grid-column: auto;
    width: 100%;
  }

  /**
   * TOPBAR
   */

  .topbar-item:not(.link) {
    display: flex;
  }

  .topbar .item-2 {
    margin-inline-end: auto;
  }

  /**
   * SERVICE
   */

  .service .shape {
    display: block;
  }

  .service .shape-1 {
    bottom: 0;
    left: 0;
  }

  .service .shape-2 {
    top: 0;
    right: 0;
  }

  /*menu-section images*/

  /*item-1*/

  .item1 .menu-img-1 {
    height: 80rem;
  }

  .item1 .menu-img-2 {
    height: 80rem;
    top: 82rem;
  }

  /* .item2 */

  .item2 .menu-img-3 {
    height: 90rem;
  }

  .item2 .menu-img-4 {
    height: 80rem;
    top: 92rem;
  }

  /* .item3 */

  .item3 .menu-img-5 {
    height: 120rem;
  }

  .item3 .menu-img-6 {
    height: 80rem;
    top: 121rem;
  }

  /* .item4 */

  .item4 .menu-img-7 {
    height: 60rem;
  }

  /* .item5 */

  .item5 .menu-img-8 {
    height: 80rem;
  }

  .item5 .menu-img-9 {
    height: 80rem;
    top: 82rem;
  }

  /* .item6 */

  .item6 .menu-img-10 {
    height: 80rem;
  }

  .item6 .menu-img-11 {
    height: 80rem;
    top: 82rem;
  }

  /* .item7 */

  .item7 .menu-img-12 {
    height: 120rem;
  }

  /* .item8 */

  .item8 .menu-img-13 {
    height: 130rem;
  }

  .item8 .menu-img-14 {
    height: 130rem;
    top: 132rem;
  }

  .item8 .menu-img-15 {
    height: 150rem;
    top: 264rem
  }

  .item8 .menu-img-16 {
    height: 80rem;
    top: 416rem;
  }

  /* .item9 */

  .item9 .menu-img-17 {
    height: 130rem;
  }

  /**
   * SPECIAL DISH
   */

   .special-dish {
    display: grid;
    grid-template-columns: 1fr 1fr;
    text-align: left;
  }

  .special-dish-content {
    padding-inline: 50px 25px;
  }