        bean2.setType(PromoteType.AUTO);
        bean2.setPred_stage("xxx");
        bean2.setQueue_size(Constants.DEFAULT_PROMOTE_QUEUE_SIZE);
        bean2.setDisable_policy(Constants.DEFAULT_PROMOTE_DISABLE_POLICY);
        bean2.setFail_policy(Constants.DEFAULT_PROMOTE_FAIL_POLICY);
        bean2.setLast_operator("system");
        bean2.setLast_update(now);
        bean2.setDelay(0);
        promoteDAO.update("env1", bean2);

        PromoteBean bean22 = promoteDAO.getById("env1");
        assertTrue(EqualsBuilder.reflectionEquals(bean2, bean22));

        List<String> ids = promoteDAO.getAutoPromoteEnvIds();
        assertEquals(ids.size(), 1);

        promoteDAO.delete("env1");
        assertEquals(promoteDAO.getById("env1"), null);
    }

    @Test
    public void testGroupDAO() throws Exception {
        groupDAO.addGroupCapacity("env-id3", "group3");
        groupDAO.addGroupCapacity("env-id4", "group4");
        groupDAO.addGroupCapacity("env-id5", "group3");

        List<String> envids = groupDAO.getEnvsByGroupName("group3");
        assertEquals(envids.size(), 2);
        HashSet<String> target_ids = new HashSet<>();
        target_ids.addAll(envids);
        assertTrue(target_ids.contains("env-id3"));
        assertTrue(target_ids.contains("env-id5"));

        List<String> groups = groupDAO.getAllEnvGroups();
        assertEquals(groups.size(), 2);
    }

    @Test
    public void testUserRolesDAO() throws Exception {
        UserRolesBean bean = new UserRolesBean();
        bean.setUser_name("test");
        bean.setResource_id("envTest");
        bean.setResource_type(AuthZResource.Type.ENV);
        bean.setRole(TeletraanPrincipalRole.ADMIN);
        userRolesDAO.insert(bean);
        UserRolesBean bean2 =
                userRolesDAO.getByNameAndResource("test", "envTest", AuthZResource.Type.ENV);
        assertEquals(bean2.getRole(), TeletraanPrincipalRole.ADMIN);
    }

    @Test
    public void testGroupRolesDAO() throws Exception {
        GroupRolesBean bean = new GroupRolesBean();
        bean.setGroup_name("group");
        bean.setResource_id("123");
        bean.setResource_type(AuthZResource.Type.ENV);
        bean.setRole(TeletraanPrincipalRole.ADMIN);
        groupRolesDAO.insert(bean);
        GroupRolesBean bean2 =
                groupRolesDAO.getByNameAndResource("group", "123", AuthZResource.Type.ENV);
        assertEquals(bean2.getRole(), TeletraanPrincipalRole.ADMIN);
    }

    @Test
    public void testTokenRolesDAO() throws Exception {
        TokenRolesBean bean = new TokenRolesBean();
        bean.setScript_name("test");
        bean.setToken("token");
        bean.setResource_id("envTest");
        bean.setResource_type(AuthZResource.Type.ENV);
        bean.setRole(TeletraanPrincipalRole.ADMIN);
        bean.setExpire_date(System.currentTimeMillis());
        tokenRolesDAO.insert(bean);
        TokenRolesBean bean2 =
                tokenRolesDAO.getByNameAndResource("test", "envTest", AuthZResource.Type.ENV);
        assertEquals(bean2.getRole(), TeletraanPrincipalRole.ADMIN);
    }

    @Test
    public void testConfigHistoryDAO() throws Exception {
        ConfigHistoryBean bean = new ConfigHistoryBean();
        bean.setChange_id("id-1");
        bean.setConfig_id("group-1");
        bean.setConfig_change("Test config change");
        bean.setCreation_time(S


R PURPOSE.  See the GNU General Public License
# for more details.
#
# Under Section 7 of GPL version 3, you are granted additional
# permissions described in the GCC Runtime Library Exception, version
# 3.1, as published by the Free Software Foundation.
#
# You should have received a copy of the GNU General Public License and
# a copy of the GCC Runtime Library Exception along with this program;
# see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
# <http://www.gnu.org/licenses/>.

	.section .init
	mov r0, 0
	sub r63,r0,1


(id)}/config',
      headers: headers,
      payload: fieldLevelEncryptionProfileConfig
          .toXml('FieldLevelEncryptionProfileConfig'),
      exceptionFnMap: _exceptionFns,
    );
    final $elem = await _s.xmlFromResponse($result);
    return UpdateFieldLevelEncryptionProfileResult(
      fieldLevelEncryptionProfile: FieldLevelEncryptionProfile.fromXml($elem),
      eTag: _s.extractHeaderStringValue($result.headers, 'ETag'),
    );
  }

  /// Update public key information. Note that the only value you can change is
  /// the comment.
  ///
  /// May throw [AccessDenied].
  /// May throw [CannotChangeImmutablePublicKeyFields].
  /// May throw [InvalidArgument].
  /// May throw [InvalidIfMatchVersion].
  /// May throw [IllegalUpdate].
  /// May throw [NoSuchPublicKey].
  /// May throw [PreconditionFailed].
  ///
  /// Parameter [id] :
  /// ID of the public key to be updated.
  ///
  /// Parameter [publicKeyConfig] :
  /// Request to update public key information.
  ///
  /// Parameter [ifMatch] :
  /// The value of the ETag header that you received when
  /// retrieving the public key to update. For example:
  /// E2QWRUHAPOMQZL.
  Future<UpdatePublicKeyResult> updatePublicKey2019_03_26({
    required String id,
    required PublicKeyConfig publicKeyConfig,
    String? ifMatch,
  }) async {
    final headers = <String, String>{
      if (ifMatch != null) 'If-Match': ifMatch.toString(),
    };
    final $result = await _protocol.sendRaw(
      method: 'PUT',
      requestUri: '/2019-03-26/public-key/${Uri.encodeComponent(id)}/config',
      headers: headers,
      payload: publicKeyConfig.toXml('PublicKeyConfig'),
      exceptionFnMap: _exceptionFns,
    );
    final $elem = await _s.xmlFromResponse($result);
    return UpdatePublicKeyResult(
      publicKey: PublicKey.fromXml($elem),
      eTag: _s.extractHeaderStringValue($result.headers, 'ETag'),
    );
  }

  /// Update a streaming distribution.
  ///
  /// May throw [AccessDenied].
  /// May throw [CNAMEAlreadyExists].
  /// May throw [IllegalUpdate].
  /// May throw [InvalidIfMatchVersion].
  /// May throw [MissingBody].
  /// May throw [NoSuchStreamingDistribution].
  /// May throw [PreconditionFailed].
  /// May throw [TooManyStreamingDistributionCNAMEs].
  /// May throw [InvalidArgument].
  /// May throw [InvalidOriginAccessIdentity].
  /// May throw [TooManyTrustedSigners].
  /// May throw [TrustedSignerDoesNotExist].
  /// May throw [InconsistentQuantities].
  ///
  /// Parameter [id] :
  /// The streaming distribution's id.
  ///
  /// Parameter [streamingDistributionConfig] :
  /// The streaming distribution's configuration information.
  ///
  /// Parameter [ifMatch] :
  /// The value of the ETag header that you received when
  /// retrieving the streaming distribution's configuration. For example:
  /// E2QWRUHAPOMQZL.
  Future<UpdateStreamingDistributionResult>
      updateStreamingDistribution2019_03_26({
    required String id,
    required StreamingDistributionConfig streamingDistributionConfig,
    String? ifMatch,
  }) async {
    final headers = <String, String>{
      if (ifMatch != null) 'If-Match': ifMatch.toString(),
    };
    final $result = await _protocol.sendRaw(
      method: 'PUT',
      requestUri:
          '/2019-03-26/streaming-distribution/${Uri.encodeComponent(id)}/config',
      headers: headers,
      payload: streamingDistributionConfig.toXml('StreamingDistributionConfig'),
      exceptionFnMap: _exceptionFns,
    );
    final $ele


革命的浪潮，基本已经得到人们的普遍认可，但是越是革命性的事物，道路越是艰难；不过道路越是艰难，收获越是巨大。人工智能对我们生产生活的改造将是全方位的，不管你现在身处什么领域，总能找到和人工智能结合的机会，期待将来人工智能科技革命的浪潮中看到你的身影。

2019年，如果你也想进入人工智能领域，欢迎你留言和我聊聊你的想法，希望你的思考也可以帮助到更多同学。
<audio id="audio" title="21 | 从阿里内部产品看海量数据处理系统的设计（上）：Doris的立项" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/ca/78/cab1834b7604435e435cdf128244d278.mp3"></audio>

从今天开始，我会分两期内容来讨论阿里巴巴的一个海量数据处理系统的设计，这个系统的名字叫Doris，它是阿里巴巴的一个内部产品。前面专栏曾经提到过，2010年前后是各种NoSQL系统爆发的一个时期，各种开源NoSQL在这个时期发布出来，当时阿里巴巴也开发了自己的NoSQL系统Doris。

Doris的设计目标是支持海量的KV结构的数据存储，访问速度和可靠性要高于当时主流的NoSQL数据库，系统要易于维护和伸缩。和当时众多NoSQL系统相比，Doris在架构设计上颇具独特性，路由算法、失效转移、集群扩容也有自己的创新之处，并成功申请三项技术专利。

**在我们开始讨论Doris项目前，我想先跟你聊聊大公司是如何看待内部技术产品这件事**。事实上，阿里巴巴内部底层技术产品的研发决策思路也颇有值得借鉴之处，你可以吸收其中好的经验，并把它转化到你所开发的产品上。

我们知道一家互联网公司主要靠自己的互联网产品盈利，比如阿里巴巴主要靠淘宝、天猫、阿里巴巴B2B网站等产品赚钱，而公司的工程师主要也是开发这些产品，但是这些产品通常都需要处理海


import numpy as np

readout_len = 1000

config = {
    "version": 1,
    "controllers": {
        "con1": {
            "analog_outputs": {
                1: {"offset": +0.0},
            },
            "analog_inputs": {
                1: {"offset": +0.0},
            },
        }
    },
    "elements": {
        "qe1": {
            "singleInput": {"port": ("con1", 1)},
            "outputs": {"output1": ("con1", 1)},
            "intermediate_frequency": 100e6,
            "operations": {
                "readout": "readout_pulse",
                "long_readout": "long_readout_pulse",
            },
            "time_of_flight": 24,
            "smearing": 0,
        },
    },
    "pulses": {
        "readout_pulse": {
            "operation": "measure",
            "length": readout_len,
            "waveforms": {"single": "ramp_wf"},
            "digital_marker": "ON",
            "integration_weights": {"cos": "cosine_weights", "sin": "sine_weights"},
        },
        "long_readout_pulse": {
            "operation": "measure",
            "length": 2 * readout_len,
            "waveforms": {"single": "ramp_wf2"},
            "digital_marker": "ON",
            "integration_weights": {
                "cos": "long_cosine_weights",
                "sin": "sine_weights",
            },
        },
    },
    "waveforms": {
        "const_wf": {"type": "constant", "sample": 0.2},
        "ramp_wf": {
            "type": "arbitrary",
            "samples": np.linspace(0, -0.5, readout_len).tolist(),
        },
        "ramp_wf2": {
            "type": "arbitrary",
            "samples": np.linspace(0, -0.5, readout_len).tolist() + np.linspace(0, -0.5, readout_len).tolist(),
        },
    },
    "digital_waveforms": {
        "ON": {"samples": [(1, 0)]},
    },
    "integration_weights": {
        "cosine_weights": {
            "cosine": [(1.0, readout_len)],
            "sine": [(0.0, readout_len)],
        },
        "long_cosine_weights": {
            "cosine": [(1.0, 2 * readout_len)],
            "sine": [(0.0, 2 * readout_len)],
        },
        "sine_weights": {
            "cosine": [(0.0, readout_len)],
            "sine": [(1.0, readout_len)],
        },
    },
}


esultBoxed.(map[*token.ID][]byte)
	if !ok {
		return errors.Errorf("invalid type, expected map[token.ID][]byte")
	}
	if err := cc.certificationStorage.Store(ctx, certifications); err != nil {
		return err
	}
	return nil
}

func (cc *CertificationClient) Scan() error {
	logger.Debugf("check the certification of unspent tokens from the vault...")
	// Check the unspent tokens

	allTokens, err := cc.queryEngine.UnspentTokensIterator(cc.ctx)
	if err != nil {
		return errors.WithMessagef(err, "failed to get an iterator over unspent tokens")
	}

	tokenIds := iterators.Map(allTokens.UnspentTokensIterator, func(t *token.UnspentToken) (*token.ID, error) { return &t.Id, nil })
	uncertifiedTokenIds := iterators.Filter(tokenIds, func(t *token.ID) bool { return !cc.certificationStorage.Exists(context.Background(), t) })
	toBeCertified, err := iterators.ReadAllPointers(uncertifiedTokenIds)
	if err != nil {
		return errors.WithMessagef(err, "failed to read tokens to be certified")
	}

	if len(toBeCertified) != 0 {
		// Request certification
		logger.Debugf("request certification of [%v]", toBeCertified)
		if err := cc.RequestCertification(context.Background(), toBeCertified...); err != nil {
			return errors.WithMessagef(err, "failed retrieving certification")
		}
		logger.Debugf("request certification of [%v] satisfied with no error", toBeCertified)
	}

	return nil
}

func (cc *CertificationClient) Start() {
	go cc.accumulatorCutter(context.Background())
}

func (cc *CertificationClient) OnReceive(event events.Event) {
	t, ok := event.Message().(tokens.TokenMessage)
	if !ok {
		logger.Warnf("cannot cast to TokenMessage %v", event.Message())
		// drop this event
		return
	}

	// sanity check that we really registered for this type of event
	_, ok = cc.eventOperationMap[event.Topic()]
	if !ok {
		logger.Warnf("receive an event we did not registered for %v", event.Message())
		// drop this event
		return
	}

	// accumulate token
	if len(cc.tokens) >= cap(cc.tokens) {
		// skip this
		logger.Warnf("certification pipeline filled up, skipping id [%s:%d]", t.TxID, t.Index)
		return
	}
	cc.tokens <- &token.ID{
		TxId:  t.TxID,
		Index: t.Index,
	}
}

func (cc *CertificationClient) accumulatorCutter(ctx context.Context) {
	// TODO: introduce workers
	timeout := time.NewTimer(5 * time.Second)
	var accumulator []*token.ID
	for {
		select {
		case id := <-cc.tokens:
			logger.Debugf("Accumulate token [%s]", id)
			accumulator = append(accumulator, id)
			if len(accumulator) >= cc.batchSize {
				logger.Debugf("Limit reached, certify accumulator...")
				toCertify := accumulator
				accumulator = nil
				go cc.requestCertification(ctx, toCertify...)
			}
		case <-timeout.C:
			logger.Debugf("Timeout, certify accumulator...")
			toCertify := accumulator
			accumulator = nil
			go cc.requestCertification(ctx, toCertify...)
		case <-cc.ctx.Done():
			// time to close
			return
		}
	}
}

func (cc *CertificationClient) requestCertification(ctx context.Context, tokens ...*token.ID) {
	if len(tokens) == 0 {
		// no tokens passed, check the vault
		logger.Debugf("request certification of 0 tokens, check the vault...")
		if err := cc.


 << octaves) - 1));
    }
    protected float billow(float x, float y, float z, float w, int seed) {
        float sum = Math.abs(wrapped.getNoiseWithSeed(x, y, z, w, seed)) * 2 - 1;
        float amp = 1;

        for (int i = 1; i < octaves; i++) {
            x *= 2f;
            y *= 2f;
            z *= 2f;
            w *= 2f;

            amp *= 0.5f;
            sum += (Math.abs(wrapped.getNoiseWithSeed(x, y, z, w, seed + i)) * 2 - 1) * amp;
        }

        return sum / (amp * ((1 << octaves) - 1));
    }

    protected float ridged(float x, float y, float z, float w, int seed) {
        float sum = 0f, exp = 1f, correction = 0f, spike;
        for (int i = 0; i < octaves; i++) {
            spike = 1f - Math.abs(wrapped.getNoiseWithSeed(x, y, z, w, seed + i));
            sum += spike * exp;
            correction += (exp *= 0.5f);
            x *= 2f;
            y *= 2f;
            z *= 2f;
            w *= 2f;
        }
        return sum / correction - 1f;
    }

    protected float warp(float x, float y, float z, float w, int seed) {
        float latest = wrapped.getNoiseWithSeed(x, y, z, w, seed);
        if(octaves <= 1) return latest;

        float sum = latest;
        float amp = 1;

        for (int i = 1; i < octaves; i++) {
            x *= 2f;
            y *= 2f;
            z *= 2f;
            w *= 2f;

            final float idx = latest * 180;
            float a = MathUtils.sinDeg(idx);
            float b = MathUtils.sinDeg(idx + (180/4f));
            float c = MathUtils.sinDeg(idx + (180*2/4f));
            float d = MathUtils.sinDeg(idx + (180*3/4f));

            amp *= 0.5f;
            sum += (latest = wrapped.getNoiseWithSeed(x + a, y + b, z + c, w + d, seed + i)) * amp;
        }

        return sum / (amp * ((1 << octaves) - 1));
    }

    /**
     * Stores arrays representing vectors on the unit hypersphere in 2D through 4D. This is used by {@link PerlueNoise},
     * as well as indirectly by all classes that use it. Each constant in this class stores 256
     * unit vectors in a 1D array, one after the next, but sometimes with padding.  See the docs for each constant for more
     * information, but {@link #GRADIENTS_2D} and {@link #GRADIENTS_4D} have no padding, and {@link #GRADIENTS_3D} has
     * one ignored float after each vector.
     */
    public static final class GradientVectors {
        /**
         * No need to instantiate.
         */
        private GradientVectors() {}

//<editor-fold defaultstate="collapsed" desc="Huge constant arrays">
        /**
         * 256 equidistant points on the 2D unit circle.
         * Each point is stored in 2 floats, and there no padding. The distance from each
         * point to the origin should be 1.0, subject to rounding error.
         * <br>


,
[46187] = "Bufas de Arrullanoche de conquistador",
[46188] = "Guantes de santificación de conquistador",
[46189] = "Guantes de Arrullanoche de conquistador",
[46190] = "Hombreras de santificación de de conquistador",
[46191] = "Casquete de Arrullanoche de conquistador",
[46192] = "Calzas de Arrullanoche de conquistador",
[46193] = "Toga de santificación de conquistador",
[46194] = "Vestimentas de Arrullanoche de conquistador",
[46195] = "Leotardos de santificación de conquistador",
[46196] = "Manto de Arrullanoche de conquistador",
[46197] = "Capucha de santificación de conquistador",
[46198] = "Túnica de rompemundos de conquistador",
[46199] = "Manoplas de rompemundos de conquistador",
[46200] = "Mandiletes de rompemundos de conquistador",
[46201] = "Celada de rompemundos de conquistador",
[46202] = "Musleras de rompemundos de conquistador",
[46203] = "Guardahombros de rompemundos de conquistador",
[46204] = "Bufas de rompemundos de conquistador",
[46205] = "Coraza de rompemundos de conquistador",
[46206] = "Camisote de rompemundos de conquistador",
[46207] = "Guantes de rompemundos de conquistador",
[46208] = "Pantalones de guerra de rompemundos de conquistador",
[46209] = "Yelmo de rompemundos de conquistador",
[46210] = "Falda de rompemundos de conquistador",
[46211] = "Hombreras de rompemundos de conquistador",
[46212] = "Visera de rompemundos de conquistador",
[46308] = "Caballo esquelético negro",
[46312] = "Garras derrotadas de Yogg-Saron",
[46313] = "Casquete de Arrullanoche valeroso",
[46320] = "Mantón del heraldo del cielo",
[46321] = "Mantón de rayo tenue de sol",
[46322] = "Estampa de Brann",
[46323] = "Sello de brillo estelar",
[46324] = "Garra espectral de Gondria",
[46339] = "Rifle de repetición de Mimiron",
[46340] = "Manoplas de adamantita",
[46341] = "Mantón del Tejehechizos",
[46342] = "Arco largo de corazón de gólem",
[46343] = "Fervor del Protectorado",
[46344] = "Manto cortahielo",
[46345] = "Brazales de reformación recta",
[46346] = "Botas de la presa intranquila",
[46347] = "Capa de la llamarada latente",
[46348] = "Fórmula: encantar arma: drenador de sangre",
[46349] = "Gorro de cocinero",
[46350] = "Pilar de entereza",
[46351] = "Cayada de muelesangre",
[46359] = "Calavera de velocirraptor",
[46360] = "Cabeza de tiburón rellena",
[46361] = "Estrella artesanal",
[46362] = "Prole de pellejo venenoso",
[46364] = "Huevo de ravasaurio pellejo venenoso",
[46367] = "Carne de dinosaurio fresca",
[46368] = "Papiro desgarrado",
[46369] = "Cuad


s = new ArrayList<>();
        final Map<String,String> tags = new HashMap<>();
    }

    @Override
    public Turtle load(InputStream inputStream) throws Exception {
        Map<Long, OSMNode> nodes = new HashMap<>(100_000);
        List<OSMWay> ways = new ArrayList<>();

        // First pass: parse XML
        XMLInputFactory f = XMLInputFactory.newFactory();
        XMLStreamReader r = f.createXMLStreamReader(inputStream);

        double boundsMinLat=0, boundsMaxLat=0;
        double boundsMinLon=0, boundsMaxLon=0;
        boolean hasBounds=false;
        Point2d p2 = new Point2d();

        OSMWay currentWay = null;
        while (r.hasNext()) {
            int ev = r.next();
            if (ev == XMLStreamConstants.START_ELEMENT) {
                String name = r.getLocalName();
                switch (name) {
                    case "bounds" -> {
                        boundsMinLat = attrDouble(r,"minlat",Double.NaN);
                        boundsMinLon = attrDouble(r,"minlon",Double.NaN);
                        boundsMaxLat = attrDouble(r,"maxlat",Double.NaN);
                        boundsMaxLon = attrDouble(r,"maxlon",Double.NaN);
                        hasBounds = true;
                        logger.info("Bounds detected: lat [{} , {}], lon [{} , {}]",
                                boundsMinLat,boundsMaxLat,boundsMinLon,boundsMaxLon);
                    }
                    case "node" -> {
                        long id = attrLong(r, "id", -1);
                        double latitude = attrDouble(r, "lat", 0);
                        double longitude = attrDouble(r, "lon", 0);

                        convertLatLong(latitude, longitude, p2);
                        if (id >= 0) nodes.put(id, new OSMNode(id, p2.y, p2.x));
                    }
                    case "way" -> currentWay = new OSMWay();
                    case "nd" -> {
                        if (currentWay != null) {
                            long ref = attrLong(r, "ref", -1);
                            if (ref >= 0) currentWay.nodeRefs.add(ref);
                        }
                    }
                    case "tag" -> {
                        if (currentWay != null) {
                            String k = attr(r, "k");
                            String v = attr(r, "v");
                            if (k != null && v != null) currentWay.tags.put(k, v);
                        }
                    }
                }
            } else if (ev == XMLStreamConstants.END_ELEMENT) {
                if ("way".equals(r.getLocalName()) && currentWay != null) {
                    if (!currentWay.nodeRefs.isEmpty()) ways.add(currentWay);
                    currentWay = null;
                }
            }
        }
        r.close();

        if (nodes.isEmpty() || ways.isEmpty()) return new Turtle();

        // Compute bounding box
        double minLat = Double.POSITIVE_INFINITY, maxLat = Double.NEGATIVE_INFINITY;
        double minLon = Double.POSITIVE_INFINITY, maxLon = Double.NEGATIVE_INFINITY;
        for (OSMNode n : nodes.values()) {
            if (n.lat < minLat) minLat = n.lat;
            if (n.lat > maxLat) maxLat = n.lat;
            if (n.lon < minLon) minLon = n.lon;
            if (n.lon > maxLon) maxLon = n.lon;
        }
        double dLat = Math.max(1e-9, maxLat - minLat);
        double dLon = Math.max(1e-9, maxLon - minLon);
        double scale = 1000.0 / Math.max(dLat, dLon); // target ~1000 units max dimensi


eight) - 40px);
    --bs-header-height: 30px;
}
.line-chart-table-height {
    height: var(--line-chart-table-height);
}

.wb-control .wb-full {
    display: none;
}

.dialog-table {
    height: calc(100vh - 200px);
}
.h-100 > .bb-cm-zone > .tabs {
    height: 100%;
}
.h-100 > .tabs {
    height: 100%;
}
.min-height-500{
    min-height:500px;
}

:root, [data-bs-theme='dark'] {
    --tg-nav-bg: var(--bs-body-bg);
}

:root, [data-bs-theme='light'] {
    --tg-nav-bg: var(--bs-body-bg);
}

.bs-tooltip-auto .tooltip-inner {
    text-align: start !important;
    white-space: pre-line !important;
}

[data-bs-theme="dark"] .fil a {
    background-color: rgba(0,0,0,0.3);
}

.table-toolbar .dropdown-menu {
    overflow: auto;
}
.layout.is-page .layout-main > .tabs {
    min-height: auto;
}
.tabs-body-content {
    overflow-y: auto;
    height: 100%;
}
.card-body{
    height:100%;
}
.green--text {
    color: #4CAF50
}
.g-3 {
    --bs-gutter-y: 0.5rem;
    --bs-gutter-x: 0.5rem;
}
.card {
    --bs-card-spacer-y: 0.5rem;
    --bs-card-spacer-x: 0.8rem;
}
.red--text {
    color: #F44336
}
.disabled--text {
    color: var(--bs-gray);
}

.enable--text {
    color: unset;
}
.border-primary {
    --bs-border-opacity: 1;
    /* border-color: rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important; */
    border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;
}

/*.card-header, [data-bs-theme="light"] {
    --bs-card-cap-bg: #343a40;
    --bs-card-cap-color: #f0f3fe;
}*/

.dropdown-menu {
    --bs-dropdown-link-active-bg: var(--bs-blue) !important;
}

.tgTree .dropdown-item{
    margin-top: 0rem;
    padding-top:0rem;
}

/*tab*/
.toast-body {
    white-space: pre-line;
}

/*#*/
.menu {
    --bb-menu-item-hover-bg: var(--bs-primary-bg1) !important;
    --bb-menu-item-hover-color: var(--bs-primary) !important;
}

/*顶栏文字样式*/
.navbar-header-text {
    color: var(--bs-navbar-color);
}

@media (min-width: 768px) {
    :root {
        --bs-header-height: 30px;
    }

    header.hide {
        transform: translate3d(0,calc(-100% - 2px),0);
    }
}

:root, [data-bs-theme="light"] {
    --bs-blue: #2196F3;
    --bs-blue-rgb: 33, 150, 243;
    --bs-link-color: #0096F3;
    --tabs-body-bg: #f0f3fe;
}

[data-bs-theme="dark"] {
    --bs-blue: #2196F3;
    --bs-blue-rgb: 33, 150, 243;
    --bs-link-color: #0096F3;
    --tabs-body-bg: #272727;
    --bb-shadow: 0 0 8px 0 rgba(42,43,46,.3),0 2px 4px 0 rgba(42,43,46,.1);
    --bb-hover-


s_mut()[LOC_MAP_PREFILTER as usize] =
        mat.shader().get_shader_location("prefilterMap");
    mat.shader_mut().locs_mut()[LOC_MAP_BRDF as usize] =
        mat.shader().get_shader_location("brdfLUT");

    // Set view matrix location
    mat.shader_mut().locs_mut()[LOC_MATRIX_MODEL as usize] =
        mat.shader().get_shader_location("matModel");
    //mat.shader_mut().locs_mut()[LOC_MATRIX_VIEW] = mat.shader().get_shader_location( "view");
    mat.shader_mut().locs_mut()[LOC_VECTOR_VIEW as usize] =
        mat.shader().get_shader_location("viewPos");

    // Set PBR standard maps
    unsafe {
        mat.maps_mut()[MAP_ALBEDO as usize].texture = *rl
            .load_texture(thread, "original/models/resources/pbr/trooper_albedo.png")
            .unwrap()
            .make_weak()
            .as_ref();
        mat.maps_mut()[MAP_NORMAL as usize].texture = *rl
            .load_texture(thread, "original/models/resources/pbr/trooper_normals.png")
            .unwrap()
            .make_weak()
            .as_ref();
        mat.maps_mut()[MAP_METALNESS as usize].texture = *rl
            .load_texture(
                thread,
                "original/models/resources/pbr/trooper_metalness.png",
            )
            .unwrap()
            .make_weak()
            .as_ref();
        mat.maps_mut()[MAP_ROUGHNESS as usize].texture = *rl
            .load_texture(
                thread,
                "original/models/resources/pbr/trooper_roughness.png",
            )
            .unwrap()
            .make_weak()
            .as_ref();
        mat.maps_mut()[MAP_OCCLUSION as usize].texture = *rl
            .load_texture(thread, "original/models/resources/pbr/trooper_ao.png")
            .unwrap()
            .make_weak()
            .as_ref();
    }

    let mut shdr_cubemap;
    #[cfg(not(target_arch = "wasm32"))]
    unsafe {
        shdr_cubemap = rl
            .load_shader(
                thread,
                Some("original/models/resources/shaders/glsl330/pbr.vs"),
                Some("original/models/resources/shaders/glsl330/pbr.fs"),
            )
            .unwrap()
            .make_weak();
    }
    #[cfg(target_arch = "wasm32")]
    unsafe {
        shdr_cubemap = rl
            .load_shader(
                thread,
                Some("original/models/resources/shaders/glsl100/cubemap.vs"),
                Some("original/models/resources/shaders/glsl100/cubemap.fs"),
            )
            .unwrap()
            .make_weak();
    }

    let mut shdr_irradiance;
    #[cfg(not(target_arch = "wasm32"))]
    unsafe {
        shdr_irradiance = rl
            .load_shader(
                thread,
                Some("original/models/resources/shaders/glsl330/skybox.vss"),
                Some("original/models/resources/shaders/glsl330/irradiance.fs"),
            )
            .unwrap()
            .make_weak();
    }
    #[cfg(target_arch = "wasm32")]
    unsafe {
        shdr_irradiance = rl
            .load_shader(
                thread,
                Some("origi


t endS = str.charAt(str.length - 1).toLowerCase() === 's'
		if (endIES) return str.slice(0, str.length - 3) + 'y'
		if (endES) return str.slice(0, str.length - 2)
		if (endS) return str.slice(0, str.length - 1)
		return str
	}

	/**
	 * @summary
	 * Lowercases the value
	 *
	 * @param val any value
	 *
	 * @returns
	 * string
	 */
	private tlc(val): string {
		return hasValue(val) ? String(val).toLowerCase() : val
	}

	/**
	 * @summary
	 * Creates a Schema Object from any object, including nested fields.
	 * Use the randomize boolean toggle to enable or disable
	 * randomization of constraining properties (min/max, etc.).
	 *
	 * @param object any object
	 * @param title name to assign the new schema
	 * @param randomize randomize the requirements for each field
	 *
	 * @returns
	 * Schema Object
	 */
	public generateSchema(
		object: Record<string, unknown>,
		title?: string,
		randomize?: boolean,
	): SchemaObject {
		const schema: SchemaObject = this.parseObject(object, title ?? 'Test', randomize)
		return schema
	}

	/**
	 * @summary
	 * Create a Schema Object for object-type fields
	 *
	 * @param property string for the title
	 *
	 * @returns
	 * Schema Object
	 */
	private schemaObject(property: string): SchemaObject {
		const schema: SchemaObject = {
			title: this.up(property),
			type: 'object',
			required: [],
			properties: {},
		}

		return schema
	}

	/**
	 * @summary
	 * Create a Schema Object for array-type fields
	 *
	 * @param property string for the title
	 *
	 * @returns
	 * Schema Object
	 */
	private schemaArray(property: string): SchemaObject {
		const schema: SchemaObject = {
			title: this.up(property),
			type: 'array',
			items: {},
		}

		return schema
	}

	/**
	 * @summary
	 * Parses the given object and assigns Schema Types to each of the
	 * fields in the object, recursively making more Schema Objects if
	 * the types are array or object.
	 *
	 * @param object any object
	 * @param property key or title
	 * @param randomize randomize toggle
	 *
	 * @returns
	 * Schema Object
	 */
	private parseObject(
		object: Record<string, unknown>,
		property: string,
		randomize?: boolean,
	): SchemaObject {
		if (!object) return {}

		const schema: SchemaObject = this.schemaObject(property)

		for (const key in object) {
			const value = object[key]
			const def = this.propertyDefinition(value)

			switch (def.type) {
				case 'object': {
					const inschema = this.parseObject(value as any, key, randomize)
					schema.properties[key] = inschema
					break
				}
				case 'array': {
					const inschema = this.schemaArray(key)
					const unified = this.parseArray(value as any)
					inschema.items = this.parseObject(unified as any, this.singular(key), randomize)
					schema.properties[key] = inschema
					break
				}
				default: {
					schema.properties[key] = def
					if (randomize) {
						const item = schema.properties[key]
						schema.properties[key] = this.randomizeRequirements(item)
						if (item.required) {
							schema.required = asArray(schema.required) as string[]
							schema.required.push(key)
						}
					}
					break


5.2l4.5 2.7-.8 1.3z"></path></svg><time class="entry-date published updated" datetime="2016-02-28T22:37:52+01:00">28. Februar 2016</time><svg class="svg-icon" width="16" height="16" aria-hidden="true" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"></path><path d="M0 0h24v24H0z" fill="none"></path></svg>Veröffentlicht inInternet, Projekte<svg class="svg-icon" width="16" height="16" aria-hidden="true" role="img" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4c-1.1 0-2 .9-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41 0-.55-.23-1.06-.59-1.42zM5.5 7C4.67 7 4 6.33 4 5.5S4.67 4 5.5 4 7 4.67 7 5.5 6.33 7 5.5 7z"></path><path d="M0 0h24v24H0z" fill="none"></path></svg>Schlagwörter: HTTPS, ssl, Uberspace

Beitrags-Navigation

Vorheriger Beitrag Vorheriger Beitrag:
Funkregulierung: TP-Link muss WLAN-Firmware sperren

Nächster Beitrag Nächster Beitrag:
Homebanking unter Linux


QUIRE_THROWS_AS( expr, exceptionType ) (void)(0)
#define CATCH_REQUIRE_THROWS_WITH( expr, matcher )     (void)(0)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_REQUIRE_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)
#endif// CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_REQUIRE_NOTHROW( ... ) (void)(0)

#define CATCH_CHECK( ... )         (void)(0)
#define CATCH_CHECK_FALSE( ... )   (void)(0)
#define CATCH_CHECKED_IF( ... )    if (__VA_ARGS__)
#define CATCH_CHECKED_ELSE( ... )  if (!(__VA_ARGS__))
#define CATCH_CHECK_NOFAIL( ... )  (void)(0)

#define CATCH_CHECK_THROWS( ... )  (void)(0)
#define CATCH_CHECK_THROWS_AS( expr, exceptionType ) (void)(0)
#define CATCH_CHECK_THROWS_WITH( expr, matcher )     (void)(0)
#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THROWS_MATCHES( expr, exceptionType, matcher ) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS
#define CATCH_CHECK_NOTHROW( ... ) (void)(0)

#if !defined(CATCH_CONFIG_DISABLE_MATCHERS)
#define CATCH_CHECK_THAT( arg, matcher )   (void)(0)

#define CATCH_REQUIRE_THAT( arg, matcher ) (void)(0)
#endif // CATCH_CONFIG_DISABLE_MATCHERS

#define CATCH_INFO( msg )          (void)(0)
#define CATCH_UNSCOPED_INFO( msg ) (void)(0)
#define CATCH_WARN( msg )          (void)(0)
#define CATCH_CAPTURE( msg )       (void)(0)

#define CATCH_TEST_CASE( ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ))
#define CATCH_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ))
#define CATCH_METHOD_AS_TEST_CASE( method, ... )
#define CATCH_REGISTER_TEST_CASE( Function, ... ) (void)(0)
#define CATCH_SECTION( ... )
#define CATCH_DYNAMIC_SECTION( ... )
#define CATCH_FAIL( ... ) (void)(0)
#define CATCH_FAIL_CHECK( ... ) (void)(0)
#define CATCH_SUCCEED( ... ) (void)(0)

#define CATCH_ANON_TEST_CASE() INTERNAL_CATCH_TESTCASE_NO_REGISTRATION(INTERNAL_CATCH_UNIQUE_NAME( C_A_T_C_H_T_E_S_T_ ))

#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
#define CATCH_TEMPLATE_TEST_CASE( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_NO_REGISTRATION(__VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_SIG( ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_SIG_NO_REGISTRATION(__VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_METHOD( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_NO_REGISTRATION(className, __VA_ARGS__)
#define CATCH_TEMPLATE_TEST_CASE_METHOD_SIG( className, ... ) INTERNAL_CATCH_TEMPLATE_TEST_CASE_MET


", "Esplanada dos Ministérios como", "dos Poderes, não só com manifestações"},
		Without: []string{"VEJA TAMBÉM:", "indulto em outras ações", "a batalha dos palanques em São Paulo"},
	},
	"https://www.correio24horas.com.br/noticia/nid/lider-do-grupo-de-sequestradores-que-tinha-pms-foi-morto-em-confronto-policial/": {
		File:    "correio24horas.com.br-PMS.html",
		Title:   "Líder do grupo de sequestradores que tinha PMs foi morto em confronto policial",
		Date:    "2022-05-04",
		Region:  "BRA",
		Authors: []string{"Bruno Wendel"},
		With:    []string{"mediante sequestro, e que", "lotados na Rondesp Atlântico", "Ele também era investigado"},
		Without: []string{"Em tempos de coronavírus e desinformação", "(Foto: Tony Silva/Ascom-PC)", "Polícia faz operação de combate a"},
	},
	"https://www.campograndenews.com.br/cidades/interior/adolescente-encontrada-morta-em-vala-estava-gravida-de-3-meses-confirma-irma": {
		File:    "campograndenews.com.br-adolescente.html",
		Title:   "Adolescente encontrada morta em vala estava grávida de 3 meses, confirma irmã",
		Date:    "2022-05-03",
		Region:  "BRA",
		Authors: []string{"Adriano Fernandes"},
		With:    []string{"intrigante. Conforme a irmã", "no momento em que a menina teria", "Luana na mesma noite do"},
		Without: []string{"VEJA TAMBÉM", "Adolescente morta na", "Nos siga no"},
	},
	"https://www.caymancompass.com/2022/05/04/prison-official-anyone-could-escape-from-northward/": {
		File:    "caymancompass.com-prison.html",
		Title:   "Prison official: ‘Anyone’ could escape from Northward",
		Date:    "2022-05-04",
		Region:  "CYM",
		Authors: []string{"James Whittaker"},
		With:    []string{"The evidence was given in support of a decision", "provided by the most dangerous and high risk offenders.”", "added that the prison estate was not considered"},
		Without: []string{"The prison official’s affidavit highlights security", "You have 4 free articles left this month", "Previous article"},
	},
	"https://www.biobiochile.cl/noticias/nacional/region-de-los-rios/2022/05/04/gremios-de-los-camioneros-no-descartan-nueva-movilizacion-realizaran-consulta-nacional.shtml": {
		File:    "biobiochile.cl-gremios.html",
		Title:   "Gremios de los camioneros no descartan nueva movilización: realizarán consulta nacional",
		Date:    "2022-05-04",
		Region:  "CHL",
		Authors: []string{"Alberto González"},
		With:    []string{"En este contexto, la tarde", "consulta que se hará este jueves", "suma protección a la infraestructura"},
		Without: []string{"\"A ver si se atreve a viajar\":", "visto ahora", "Hector Andrade"},
	},
	"https://www.latercera.com/politica/noticia/la-agenda-con


oar'
      );
    });
  });

  describe('escapeForRegExp()', () => {
    it('should return undefined if passed undefined', () => {
      // @ts-ignore
      expect(escapeForRegExp(undefined)).toBeUndefined();
    });

    it('should return null if passed null', () => {
      // @ts-ignore
      expect(escapeForRegExp(null)).toBeNull();
    });

    it('should return a blank string if passed a blank string', () => {
      expect(escapeForRegExp('')).toEqual('');
    });

    it('should return a string unmodified if there are no special characters', () => {
      expect(escapeForRegExp('T Rex Tea Time')).toEqual('T Rex Tea Time');
    });

    it('should escape [', () => {
      expect(escapeForRegExp('Happy [ Times')).toEqual('Happy \\[ Times');
    });

    it('should escape ]', () => {
      expect(escapeForRegExp('Happy ] Times')).toEqual('Happy \\] Times');
    });

    it('should escape -', () => {
      expect(escapeForRegExp('T-Rex Tea Time')).toEqual('T\\-Rex Tea Time');
    });

    it('should escape \\', () => {
      expect(escapeForRegExp('22 \\ 67')).toEqual('22 \\\\ 67');
    });

    it('should escape /', () => {
      expect(escapeForRegExp('0 / 11')).toEqual('0 \\/ 11');
    });

    it('should escape ^', () => {
      expect(escapeForRegExp('My Hat^')).toEqual('My Hat\\^');
    });

    it('should escape $', () => {
      expect(escapeForRegExp('$25')).toEqual('\\$25');
    });

    it('should escape *', () => {
      expect(escapeForRegExp('BAD W*RD')).toEqual('BAD W\\*RD');
    });

    it('should escape +', () => {
      expect(escapeForRegExp('4 + 4')).toEqual('4 \\+ 4');
    });

    it('should escape ?', () => {
      expect(escapeForRegExp('Can I ask a question?')).toEqual(
        'Can I ask a question\\?'
      );
    });

    it('should escape .', () => {
      expect(escapeForRegExp('25.64')).toEqual('25\\.64');
    });

    it('should escape (', () => {
      expect(escapeForRegExp('77(88')).toEqual('77\\(88');
    });

    it('should escape )', () => {
      expect(escapeForRegExp('77)88')).toEqual('77\\)88');
    });

    it('should escape |', () => {
      expect(escapeForRegExp('||H')).toEqual('\\|\\|H');
    });

    it('should escape {', () => {
      expect(escapeForRegExp('class Cheese {}')).toEqual('class Cheese \\{\\}');
    });

    it('should escape }', () => {
      expect(escapeForRegExp('class Cheese {}')).toEqual('class Cheese \\{\\}');
    });

    it('should escape a combination of special characters', () => {
      expect(escapeForRegExp('function test() { return 5 * 5; }')).toEqual(
        'function test\\(\\) \\{ return 5 \\* 5; \\}'
      );
    });
  });

  describe('cleanSpecialCharacters()', () => {
    it('should return an empty string if passed undefined', () => {
      // @ts-ignore
      expect(cleanSpecialCharacters(undefined)).toEqual('');
    });

    it('should return an empty string if passed null', () => {
      // @ts-ignore
      expect(cleanSpecialCharacters(null)).toEqual('');
    });

    it('should return an empty string if passed an empty string', () => {
      expect(cleanSpecialCharacters('')).toEqual('');
    });

    it('should return a string with no special characters as-is', () => {
      expect


ow</kafka_format>
        <kafka_commit_every_batch>0</kafka_commit_every_batch>
        <kafka_num_consumers>1</kafka_num_consumers>
        <kafka_thread_per_consumer>1</kafka_thread_per_consumer>

        <!-- Kafka extended configuration -->
        <kafka>
            <security_protocol>SASL_SSL</security_protocol>
            <enable_ssl_certificate_verification>false</enable_ssl_certificate_verification>
            <sasl_mechanism>PLAIN</sasl_mechanism>
            <sasl_username>kafka-client</sasl_username>
            <sasl_password>kafkapassword1</sasl_password>
            <debug>all</debug>
            <auto_offset_reset>latest</auto_offset_reset>
        </kafka>
    </cluster_1>

    <cluster_2>
        <!-- ClickHouse Kafka engine parameters -->
        <kafka_broker_list>c2-kafka-1:29094,c2-kafka-2:29094,c2-kafka-3:29094</kafka_broker_list>
        <kafka_topic_list>cluster_2_clickhouse_topic</kafka_topic_list>
        <kafka_group_name>cluster_2_clickhouse_consumer</kafka_group_name>
        <kafka_format>JSONEachRow</kafka_format>
        <kafka_commit_every_batch>0</kafka_commit_every_batch>
        <kafka_num_consumers>1</kafka_num_consumers>
        <kafka_thread_per_consumer>1</kafka_thread_per_consumer>

        <!-- Kafka extended configuration -->
        <kafka>
            <security_protocol>SASL_SSL</security_protocol>
            <enable_ssl_certificate_verification>false</enable_ssl_certificate_verification>
            <sasl_mechanism>PLAIN</sasl_mechanism>
            <sasl_username>kafka-client</sasl_username>
            <sasl_password>kafkapassword2</sasl_password>
            <debug>all</debug>
            <auto_offset_reset>latest</auto_offset_reset>
        </kafka>
    </cluster_2>
</named_collections>
```

### 設定ノート {#configuration-notes}

1. Kafkaのアドレスや関連設定を、あなたのKafkaクラスターのセットアップに合わせて調整してください。
2. `<kafka>`の前のセクションにはClickHouse Kafkaエンジンのパラメータが含まれています。パラメータの完全なリストについては、[Kafkaエンジンのパラメータ](/engines/table-engines/integrations/kafka)を参照してください。
3. `<kafka>`内のセクションには拡張Kafka設定オプションが含まれています。さらなるオプションについては、[librdkafkaの設定](https://github.com/confluentinc/librdkafka/blob/master/CONFIGURATION.md)を参照してください。
4. この例では `SASL_SSL` セキュリティプロトコルと `PLAIN` メカニズムを使用しています。これらの設定は、あ


argin-top: 5; margin-bottom: 0" align="center">SRIM
        / TRIM

Introduction

        Historical
        Review

        Download
        SRIM-2006

        Details of
        SRIM-2006

SRIM

Install
        Problems

        Experimental
        Data Plots

Stopping
        of Ions in Matter

        SRIM
        Tutorials

        Stopping
        in Compounds

 Download
        TRIM-98
        Manual

        <P style="line-height: 100%;


romptText = KPRes.DatabaseDescPrompt;

			if(m_bCreatingNew) this.Text = KPRes.ConfigureOnNewDatabase;
			else this.Text = KPRes.DatabaseSettings;

			m_tbDbName.Text = m_pwDatabase.Name;
			UIUtil.SetMultilineText(m_tbDbDesc, m_pwDatabase.Description);
			m_tbDefaultUser.Text = m_pwDatabase.DefaultUserName;

			m_clr = m_pwDatabase.Color;
			if(m_clr != Color.Empty)
				UIUtil.SetButtonImage(m_btnColor, PwEntryForm.CreateColorButtonImage(
					m_btnColor, m_clr), false);
			m_cbColor.Checked = (m_clr != Color.Empty);

			for(int inx = 0; inx < CipherPool.GlobalPool.EngineCount; ++inx)
				m_cmbEncAlgo.Items.Add(CipherPool.GlobalPool[inx].DisplayName);

			if(m_cmbEncAlgo.Items.Count > 0)
			{
				int nIndex = CipherPool.GlobalPool.GetCipherIndex(m_pwDatabase.DataCipherUuid);
				m_cmbEncAlgo.SelectedIndex = ((nIndex >= 0) ? nIndex : 0);
			}

			m_numEncRounds.Minimum = ulong.MinValue;
			m_numEncRounds.Maximum = ulong.MaxValue;
			m_numEncRounds.Value = m_pwDatabase.KeyEncryptionRounds;

			// m_lbMemProt.Items.Add(KPRes.Title, m_pwDatabase.MemoryProtection.ProtectTitle);
			// m_lbMemProt.Items.Add(KPRes.UserName, m_pwDatabase.MemoryProtection.ProtectUserName);
			// m_lbMemProt.Items.Add(KPRes.Password, m_pwDatabase.MemoryProtection.ProtectPassword);
			// m_lbMemProt.Items.Add(KPRes.Url, m_pwDatabase.MemoryProtection.ProtectUrl);
			// m_lbMemProt.Items.Add(KPRes.Notes, m_pwDatabase.MemoryProtection.ProtectNotes);

			// m_cbAutoEnableHiding.Checked = m_pwDatabase.MemoryProtection.AutoEnableVisualHiding;
			// m_cbAutoEnableHiding.Checked = false;

			if(m_pwDatabase.Compression == PwCompressionAlgorithm.None)
				m_rbNone.Checked = true;
			else if(m_pwDatabase.Compression == PwCompressionAlgorithm.GZip)
				m_rbGZip.Checked = true;
			else { Debug.Assert(false); }

			InitRecycleBinTab();
			InitAdvancedTab();

			m_bInitializing = false;
			EnableControlsEx();
		}

		private void InitRecycleBinTab()
		{
			m_cbRecycleBin.Checked = m_pwDatabase.RecycleBinEnabled;

			m_cmbRecycleBin.Items.Add(m_strAutoCreateNew);
			m_dictRecycleBinGroups[0] = PwUuid.Zero;

			int iSelect;
			UIUtil.CreateGroupList(m_pwDatabase.RootGroup, m_cmbRecycleBin,
				m_dictRecycleBinGroups, m_pwDatabase.RecycleBinUuid, out iSelect);

			m_cmbRecycleBin.SelectedIndex = Math.Max(0, iSelect);
		}

		private void InitAdvancedTab()
		{
			m_cmbEntryTemplates.Items.Add("(" + KPRes.None + ")");
			m_dictEntryTemplateGroups[0] = PwUuid.Zero;

			int iSelect;
			UIUtil.CreateGroupList(m_pwDatabase.RootGroup, m_cmbEntryTemplates,
				m_dictEntryTemplateGroups, m_pwDatabase.EntryTemplatesGroup, out iSelect);

			m_cmbEntryTemplates.SelectedIndex = Math.Max(0, iSelect);

			m_numHistoryMaxItems.Minimum = 0;
			m_numHistoryMaxItems.Maximum = int.MaxValue;
			bool bHistMaxItems = (m_pwDatabase.HistoryMaxItems >= 0);
			m_numHistoryMaxItems.Value = (bHistMaxItems ? m_pwDatabase.HistoryMaxItems :
				PwDatabase.DefaultHistoryMaxItems);
			m_cbHistoryMaxItems.Checked = bHistMaxItems;

			m_numHistoryMaxSize.Minimum


559: SAVE_I	save	%r18, 0x0001, %r29
	.word 0xbd3dc000  ! 4563: SRA_R	sra 	%r23, %r0, %r30
	.word 0xb5518000  ! 4564: RDPR_PSTATE	<illegal instruction>
	ta	T_CHANGE_HPRIV
	.word 0x81983d09  ! 4566: WRHPR_HPSTATE_I	wrhpr	%r0, 0x1d09, %hpstate
	.word 0xb9e4c000  ! 4569: SAVE_R	save	%r19, %r0, %r28
	.word 0xb5e44000  ! 4570: SAVE_R	save	%r17, %r0, %r26
	.word 0xb7e5c000  ! 4573: SAVE_R	save	%r23, %r0, %r27
	.word 0xb9e46000  ! 4579: SAVE_I	save	%r17, 0x0001, %r28
	.word 0xbde44000  ! 4581: SAVE_R	save	%r17, %r0, %r30
	.word 0xb5e58000  ! 4582: SAVE_R	save	%r22, %r0, %r26
	.word 0xb551c000  ! 4584: RDPR_TL	<illegal instruction>
	.word 0xb9518000  ! 4586: RDPR_PSTATE	<illegal instruction>
	.word 0x899561ec  ! 4590: WRPR_TICK_I	wrpr	%r21, 0x01ec, %tick
	.word 0xb2c52121  ! 4591: ADDCcc_I	addccc 	%r20, 0x0121, %r25
	.word 0xb7e50000  ! 4592: SAVE_R	save	%r20, %r0, %r27
	.word 0xb5e5a12e  ! 4593: SAVE_I	save	%r22, 0x0001, %r26
	.word 0xb9e5c000  ! 4597: SAVE_R	save	%r23, %r0, %r28
	.word 0xbbe40000  ! 4606: SAVE_R	save	%r16, %r0, %r29
	.word 0xb5e5a0fb  ! 4610: SAVE_I	save	%r22, 0x0001, %r26
	mov	2, %r14
	.word 0xa1938000  ! 4611: WRPR_GL_R	wrpr	%r14, %r0, %-
	.word 0xb5e44000  ! 4613: SAVE_R	save	%r17, %r0, %r26
	.word 0xb3e54000  ! 4615: SAVE_R	save	%r21, %r0, %r25
	.word 0xbfe44000  ! 4617: SAVE_R	save	%r17, %r0, %r31
	.word 0xbe3ce0e6  ! 4618: XNOR_I	xnor 	%r19, 0x00e6, %r31
	.word 0xb9510000  ! 4620: RDPR_TICK	<illegal instruction>
	.word 0xbde5e0d8  ! 4622: SAVE_I	save	%r23, 0x0001, %r30
	.word 0xb7e5e127  ! 4624: SAVE_I	save	%r23, 0x0001, %r27
	.word 0xb1e50000  ! 4626: SAVE_R	save	%r20, %r0, %r24
	.word 0xb09461e1  ! 4628: ORcc_I	orcc 	%r17, 0x01e1, %r24
	.word 0xb425a0e7  ! 4632: SUB_I	sub 	%r22, 0x00e7, %r26
	.word 0x8394e1d


// SPDX-License-Identifier: GPL-2.0+
/*
 * Driver for the Renesas PHY uPD60620.
 *
 * Copyright (C) 2015 Softing Industrial Automation GmbH
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/phy.h>

#define UPD60620_PHY_ID    0xb8242824

/* Extended Registers and values */
/* PHY Special Control/Status    */
#define PHY_PHYSCR         0x1F      /* PHY.31 */
#define PHY_PHYSCR_10MB    0x0004    /* PHY speed = 10mb */
#define PHY_PHYSCR_100MB   0x0008    /* PHY speed = 100mb */
#define PHY_PHYSCR_DUPLEX  0x0010    /* PHY Duplex */

/* PHY Special Modes */
#define PHY_SPM            0x12      /* PHY.18 */

/* Init PHY */

static int upd60620_config_init(struct phy_device *phydev)
{
	/* Enable support for passive HUBs (could be a strap option) */
	/* PHYMODE: All speeds, HD in parallel detect */
	return phy_write(phydev, PHY_SPM, 0x0180 | phydev->mdio.addr);
}

/* Get PHY status from common registers */

static int upd60620_read_status(struct phy_device *phydev)
{
	int phy_state;

	/* Read negotiated state */
	phy_state = phy_read(phydev, MII_BMSR);
	if (phy_state < 0)
		return phy_state;

	phydev->link = 0;
	linkmode_zero(phydev->lp_advertising);
	phydev->pause = 0;
	phydev->asym_pause = 0;

	if (phy_state & (BMSR_ANEGCOMPLETE | BMSR_LSTATUS)) {
		phy_state = phy_read(phydev, PHY_PHYSCR);
		if (phy_state < 0)
			return phy_state;

		if (phy_state & (PHY_PHYSCR_10MB | PHY_PHYSCR_100MB)) {
			phydev->link = 1;
			phydev->speed = SPEED_10;
			phydev->duplex = DUPLEX_HALF;

			if (phy_state & PHY_PHYSCR_100MB)
				phydev->speed = SPEED_100;
			if (phy_state & PHY_PHYSCR_DUPLEX)
				phydev->duplex = DUPLEX_FULL;

			phy_state = phy_read(phydev, MII_LPA);
			if (phy_state < 0)
				return phy_state;

			mii_lpa_to_linkmode_lpa_t(phydev->lp_advertising,
						  phy_state);

			phy_resolve_aneg_pause(phydev);
		}
	}
	return 0;
}

MODULE_DESCRIPTION("Renesas uPD60620 PHY driver");
MODULE_AUTHOR("Bernd Edlinger <bernd.edlinger@hotmail.de>");
MODULE_LICENSE("GPL");

static struct phy_driver upd60620_driver[1] = { {
	.phy_id         = UPD60620_PHY_ID,
	.phy_id_mask    = 0xfffffffe,
	.name           = "Renesas uPD60620",
	/* PHY_BASIC_FEATURES */
	.flags          = 0,
	.config_init    = upd60620_config_init,
	.read_status    = upd60620_read_status,
} };

module_phy_driver(upd60620_driver);

static struct mdio_device_id __maybe_unused upd60620_tbl[] = {
	{ UPD60620_PHY_ID, 0xfffffffe },
	{ }
};

MODULE_DEVICE_TABLE(mdio, upd60620_tbl);


고 햇깔릴 때**
+ **두개의 비동기 처리가 완료된 후에 결과 값을 합쳐서 하나로 만들고 싶을 때**
+ **버튼을 연타로 눌러서 이벤트가 중복실행 될 때**
+ **쓰레드 관리가 힘들 때**

### 4. 조금 더 자세히!!

#### 4.1. 이해를 돕기 위해 알아둘 것

##### 4.1.1. observer pattern

옵저버 패턴은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고 자동으로 정보가 갱신되는 1:N 의 관계를 정의합니다.

4.1.2. ~~Iterator pattern~~
4.1.3. Functional programming
(1.3. 함수형 반응 프로그래밍)
4.1.4. MVVM model
4.1.5. ~~Dataflow programming~~

####4.2. 기본적인 빌딩 블록

반응적인 코드의 기본적인 빌딩 블록은 **Observable**들과 **Subscriber**들입니다. 사실 가장 작은 빌딩 블록은 **Observer**이지만 실제로 Subscriber를 더 자주 사용합니다.

여기서 Observable은 아이템을 발행하는 곳에 사용되고 Subscriber은 이 아이템들을 소비하는데 사용됩니다.

##### 4.2.1. Observable

데이터 처리를 실행(시작?)하는 부분입니다.

##### 4.2.2. Subscriber

Observable에 속해있는 Subcrber마다 Subcirber.onNext( ), Subscriber.onComplete( ), 또는 Subscriber.onError( )가 뒤따릅니다.

Observable은 아까 말했듯이이는 성공적인 완료(Subscriber. onComplete( )) 또는 에러(Subscriber.onEror( ))에 인해서 종료가 되는데 그 각각의 상태가 위의 메서드에 속해있습니다.

스스로 이해해본 바로는 이 부분이 메서드 처럼 데이터를 가공하고 처리하는 부분입니다. 이게 가능한 이유는 연쇄적으로 메서드를 부를 수 있기 때문이다. Observable이랑 Subscriber이랑 헷갈릴 필요가 없는게 Observable 안에 Subscriber이 존재하기 때문입니다. 그리고 기 결과들을 수신받는 부분이 Observer이다.

Observable을 데이터베이스 쿼리라고 생각하고 Subscriber은 그 결과를 가지고 화면에 보여준다고 생각 할 수 있다. 또 다른 예로는 Observable은 화면의 클릭이고 Subscriber은 그에 대한 반응이라고 볼 수 있다.

#### 4.3.


entById('owa_heatmap');
	    this.context = this.canvas.getContext('2d');
	    //this.calcRegions();

	    this.options = {

	        dotSize: 12,
	        numRegions: 40,
	        alphaIncrement:50,
	        demoMode: false,
	        liveMode: true,
	        mapInterval: 1000,
	        randomDataCount: 200,
	        rowsPerFetch: 100,
	        strokeRegions: false,
	        svgUrl: OWA_instance.getSetting('baseUrl')+'/modules/base/i/test.svg#f1',
	        baseUrl: '',
	        apiUrl: ''
	    };

	    this.regions = [];
	    this.regionsMap = [];
	    this.regionWidth = null;
	    this.regionHeight = null;
	    this.dirtyRegions = {};
	    this.timer = '';
	    this.clicks = '';
	    this.nextPage = 1;
	    this.more = true;
	    this.lock = false;
	}

    /**
     * Marks a region as dirty so that it can be re-rendered
     * @depricated
     */
    markRegionDirty(region_num) {
        if (region_num >= 0) {
            this.dirtyRegions[region_num] = true;
            OWA_instance.debug("marking region dirty: %s", region_num);
        } else {
            OWA_instance.debug("no region to mark dirty!");
        }
    }

    showControlPanel() {
        var that = this;
        jQuery('body').append('

');
        jQuery('#owa_overlay').append('

');
        jQuery('#owa_overlay').append('
Start
');
        jQuery('#owa_overlay_start').toggleClass('active');
        jQuery('#owa_overlay').append('
Stop
');
        jQuery('#owa_overlay').append('
X
');
        jQuery('#owa_overlay_start').click(function(){that.startTimer()});
        jQuery('#owa_overlay_stop').click(function(){that.stopTimer()});
        jQuery('.owa_overlay_control').bind('click', function(){
            jQuery(".owa_overlay_control").removeClass('active');
            jQuery(this).addClass('active');
        });
        jQuery('#owa_overlay_end').click(function(){that.endSession()});
        //eliminate session cookie when window closes.
        //jQuery(window).unload(function() {OWA_instance.endOverlaySession()});
        jQuery(window).on('unload', function() {OWA_instance.endOverlaySession()});
    }

    /**
     * Main generation method. kicks off the timer if in liveMode
     */
    generate() {

        this.showControlPanel();
        this.applyBlur();

        if (this.options.liveMode === true) {

            this.startTimer();

        } else {

            this.map();
        }

    }

    endSession() {

        Util.eraseCookie(OWA_instance.getSetting('ns') + 'overlay', document.domain);
        window.close();
    }

    startTimer() {

        var that = this;
        this.timer = setInterval(function(){that.map()}, this.options.mapInterval);
    }

    stopTimer() {

        if (!this.timer) return false;
          clearInterval(this.timer);
    }

    /**
     * Gets data and plots it
     */
    map() {

        if (this.lock == true) {
            OWA_instance.debug("skipping data fetch due to lock.");
            return;
        } else {
            this.lock = true;
        }

        if (this.options.liveMode === true) {


."Hazza'rah, the Dreamweaver";
		GREY..INDENT.."Renataki, of the Thousand Blades";
		GREY..INDENT.."Wushoolay, the Storm Witch";
		GREY.."6) 加兹兰卡";
		GREY.."7) 高阶祭祀塞卡";
		GREY.."8) 高阶祭祀娅尔罗";
		GREY.."9) 妖术师金度";
		GREY.."10) 哈卡";
	}
};

end


/*
 * FalsoJNI_Logger.c
 *
 * Fake Java Native Interface, providing JavaVM and JNIEnv objects.
 *
 * Copyright (C) 2022 Volodymyr Atamanenko
 *
 * This software may be modified and distributed under the terms
 * of the MIT license. See the LICENSE file for details.
 */

#include <stdarg.h>
#include <pthread.h>
#include <malloc.h>
#include <string.h>

#include "FalsoJNI_Logger.h"
#include "FalsoJNI.h"

pthread_mutex_t * _fjni_log_mutex = NULL;

#define COLOR_RED     "\x1B[31m"
#define COLOR_ORANGE  "\x1B[33m"
#define COLOR_BLUE    "\x1B[34m"

#define COLOR_END     "\033[0m"

void _fjni_log_lock() {
    if (_fjni_log_mutex == NULL) {
        pthread_mutex_t initTmpNormal;
        _fjni_log_mutex = malloc(sizeof(pthread_mutex_t));
        memcpy(_fjni_log_mutex, &initTmpNormal, sizeof(pthread_mutex_t));

        if (pthread_mutex_init(_fjni_log_mutex, NULL) != 0) {
            _fjni_log_mutex = NULL;
            return;
        }
    }

    pthread_mutex_lock(_fjni_log_mutex);
}

void _fjni_log_unlock() {
    if (_fjni_log_mutex) {
        pthread_mutex_unlock(_fjni_log_mutex);
    }
}

int _fjni_log_info(const char *fname, int lineno, const char *fxname, const char* fmt, ...) {
#if FALSOJNI_DEBUGLEVEL <= FALSOJNI_DEBUG_INFO
    _fjni_log_lock();
    char fmt_colored[2048];
    snprintf(fmt_colored, 2047, "%s[INFO] %s%s\n", COLOR_BLUE, fmt, COLOR_END);

    va_list list;
    va_start(list, fmt);
    vfprintf(stderr, fmt_colored, list);
    va_end(list);
    _fjni_log_unlock();
#endif
    return 0;
}

int _fjni_log_warn(const char *fname, int lineno, const char *fxname, const char* fmt, ...) {
#if FALSOJNI_DEBUGLEVEL <= FALSOJNI_DEBUG_WARN
    _fjni_log_lock();
    char fmt_colored[2048];
    snprintf(fmt_colored, 2047, "%s[WARNING][%s:%d][%s] %s%s\n", COLOR_ORANGE, fname, lineno, fxname, fmt, COLOR_END);

    va_list list;
    va_start(list, fmt);
    vfprintf(stderr, fmt_colored, list);
    va_end(list);
    _fjni_log_unlock();
#endif
    return 0;
}

int _fjni_log_debug(const char *fname, int lineno, const char *fxname, const char* fmt, ...) {
#if FALSOJNI_DEBUGLEVEL <= FALSOJNI_DEBUG_ALL
    _fjni_log_lock();
    char fmt_real[4096];
    snprintf(fmt_real, 2047, "[DEBUG][%s:%d][%s] %s\n", fname, lineno, fxname, fmt);

    va_list list;
    va_start(list, fmt);
    vfprintf(stderr, fmt_real, list);
    va_end(list);
    _fjni_log_unlock();
#endif
    return 0;
}

int _fjni_log_error(const char *fname, int lineno, const char *fxname, const char* fmt, ...) {
#if FALSOJNI_DEBUGLEVEL <= FALSOJNI_DEBUG_ERROR
    _fjni_log_lock();
    char fmt_colored[2048];
    snprintf(fmt_colored, 2047, "%s[ERROR][%s:%d][%s] %s%s\n", COLOR_RED, fname, lineno, fxname, fmt, COLOR_END);

    va_list list;
    va_start(list, fmt);
    vfprintf(stderr, fmt_colored, list);
    va_end(list);
    _fjni_log_unlock();
#endif
    return 0;
}


l3.58 2.52a1.13 1.13 0 010 1.85l-3.58 2.52a1.5 1.5 0 01-2.37-1.23V9.75c0-.83.68-1.5 1.5-1.5zm0 .75c-.39 0-.71.3-.74.7V14.17a.75.75 0 001.12.65l.06-.04 3.58-2.52a.37.37 0 00.04-.58l-.04-.03-3.58-2.52a.75.75 0 00-.44-.14z"></path></symbol>
<symbol id="sidebar-matched" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M13.96 8.83a4.33 4.33 0 012.59 3.92c0 4.17-3.95 7.98-7.74 7.98-3.77 0-7.72-3.82-7.72-7.97a4.33 4.33 0 017.72-2.63c.15-.18.31-.38.5-.54v-.01a4.33 4.33 0 014.65-.75zm-3.8 1.03l-.1.07v.01l-.26.23c-.1.08-.2.18-.3.31l-.69.89-.6-.78a3.83 3.83 0 00-.39-.46 3.58 3.58 0 00-5.98 2.63c0 3.65 3.53 7.22 6.97 7.22 3.46 0 6.99-3.56 6.99-7.22a3.58 3.58 0 00-5.64-2.9zm10.7-5.5a4.33 4.33 0 012.6 3.93c0 3.78-3.25 7.27-6.68 7.88-.23.02-.68-.56.33-.84 2.95-.77 5.6-3.86 5.6-7.03a3.58 3.58 0 00-5.64-2.9l-.1.07-.26.23c-.1.08-.2.18-.3.32l-.69.89-.6-.78a3.83 3.83 0 00-.39-.46A3.58 3.58 0 008.75 8.3c0 .16-.18.4-.39.4-.28 0-.4-.27-.33-.84a4.33 4.33 0 017.7-2.19c.14-.18.3-.38.5-.54v-.01a4.33 4.33 0 014.64-.75z"></path></symbol>
<symbol id="sidebar-people-nearby" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M12 1.47c4.8 0 8.36 3.32 8.36 8.24 0 4.12-2.48 8.41-7.4 12.9-.52.48-1.32.5-1.87.05l-.06-.05-.2-.18C6.06 18 3.63 13.77 3.63 9.7c0-4.92 3.56-8.24 8.37-8.24zm0 .75c-4.2 0-7.61 2.81-7.61 7.49 0 3.76 2.25 7.76 6.75 11.98l.2.19.2.18.05.04c.26.2.63.18.87-.04 4.77-4.36 7.15-8.48 7.15-12.35 0-4.68-3.4-7.49-7.61-7.49zm0 3.47a3.38 3.38 0 110 6.75 3.38 3.38 0 010-6.75zm0 .75a2.62 2.62 0 100 5.25 2.62 2.62 0 000-5.25z"></path></symbol>
<symbol id="sidebar-visitors" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M12 4.36c6.


tion[i].x, location[i].y, location[i].z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, 2.0, 2.0, 1.0, 100, 1, 1, 190, false, true, 2, false, false, false, false)
			end
			return true, i
		end
	end

end

local function DisplayHelp(_message, x, y, w, h, enableShadow, col1, col2, col3, a, centre)

	local str = CreateVarString(10, "LITERAL_STRING", _message, Citizen.ResultAsLong())

	SetTextScale(w, h)
	SetTextColor(col1, col2, col3, a)

	SetTextCentre(centre)

	if enableShadow then
		SetTextDropshadow(1, 0, 0, 0, 255)
	end

	Citizen.InvokeNative(0xADA9255D, 10);

	DisplayText(str, x, y)

end

local function ShowNotification(_message)
	local timer = 400
	while timer > 0 do
		DisplayHelp(_message, 0.50, 0.90, 0.6, 0.6, true, 161, 3, 0, 255, true)
		timer = timer - 1
		Citizen.Wait(0)
	end
end

local function checkAvailability(pet)
	local availability = pet.Availability

	local available = false

	if availability ~= nil then
		for index, peti in pairs(availability) do
			if peti == CurrentZoneActive then
				available = true
				return available
			end
		end
	else
		available = true
	end

	return available

end

Citizen.CreateThread(function()
	WarMenu.CreateMenu('id_dog', '')
	repeat
		if WarMenu.IsMenuOpened('id_dog') then
			if WarMenu.Button(_U('GiveAway')) then
				TriggerServerEvent('rdn_companions:sellpet')
				WarMenu.CloseMenu()
			end

			local shop = Config.Shops[CurrentZoneActive]

			for i = 1, #pets do
				local acheck = checkAvailability(pets[i])
				if acheck == true then
					if WarMenu.Button(pets[i]['Text'], pets[i]['SubText'], pets[i]['Desc']) then
						TriggerServerEvent('rdn_companions:buydog', pets[i]['Param'])
						WarMenu.CloseMenu()
					end
				end
			end
			WarMenu.Display()
		end
		Citizen.Wait(0)
	until false
end)

Citizen.CreateThread(function()
	while true do
		waitTime = 500
		for index, shop in pairs(Config.Shops) do
			local IsZone, IdZone = IsNearZone( shop.Coords, shop.ActiveDistance, shop.Ring )
			-- Shop control and menu open
			if IsZone then
				waitTime = 1
				DisplayHelp(_U('Shoptext'), 0.50, 0.95, 0.6, 0.6, true, 255, 255, 255, 255, true)
				if IsControlJustPressed(0, keys[Config.TriggerKeys.OpenShop]) then
					WarMenu.SetTitle('id_dog', shop.Name)
					WarMenu.OpenMenu('id_dog')
					CurrentZoneActive = index
				end
			end
		end

		if Config.CallPetKey == true then
			if IsControlJustReleased(0, keys[Config.TriggerKeys.CallPet]) then
				pressLeft = GetGameTimer()
				pressTime = pressTime + 1
			end

			if pressLeft ~= nil and (pressLeft + 500) < GetGameTimer() and pressTime > 0 and pressTime < 1 then
				pressTime = 0
			end

			if pressTime == 1 then
				TriggerServerEvent('rdn_companions:loaddog')
				pressTime = 0
			end
		end

		Citizen.Wait(waitTime)
	end
end)

-- | Main Thread - Checks if animal can hunt or is hungry, checks timers


47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}};var r=n.prototype;r.render=r.updateView=r.updateLayout=function(t,e,i){var n,o,r;e.eachComponent({mainType:"brush"},function(t){n=t.brushType,o=t.brushOption.brushMode||"single",r|=t.areas.length}),this._brushType=n,this._brushMode=o,a.each(t.get("type",!0),function(e){t.setIconStatus(e,("keep"===e?"multiple"===o:"clear"===e?r:e===n)?"emphasis":"normal")})},r.getIcon


.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.Vector;

/**
 *
 * 项目名称：dssms
 * 类名称：HttpRequester
 * 类描述：
 * 创建人：zr
 * 创建时间：2015-6-24 下午07:48:15
 * 修改人：zr
 * 修改时间：2015-6-24 下午07:48:15
 * 修改备注：
 * @version 1.0
 *
 */
public class HttpRequester {
    private String defaultContentEncoding;

    public HttpRequester() {
        this.defaultContentEncoding = Charset.defaultCharset().name();
    }

    /**
     * 发送GET请求
     *
     * @param urlString
     *            URL地址
     * @return 响应对象
     * @throws IOException
     */
	public HttpRespons sendGet(String urlString) throws IOException {
        return this.send(urlString, "GET", null, null);
    }

    /**
     * 发送GET请求
     *
     * @param urlString
     *            URL地址
     * @param params
     *            参数集合
     * @return 响应对象
     * @throws IOException
     */
    public HttpRespons sendGet(String urlString, Map<String, String> params)
            throws IOException {
        return this.send(urlString, "GET", params, null);
    }

    /**
     * 发送GET请求
     *
     * @param urlString
     *            URL地址
     * @param params
     *            参数集合
     * @param propertys
     *            请求属性
     * @return 响应对象
     * @throws IOException
     */
    public HttpRespons sendGet(String urlString, Map<String, String> params,
            Map<String, String> propertys) throws IOException {
        return this.send(urlString, "GET", params, propertys);
    }

    /**
     * 发送POST请求
     *
     * @param urlString
     *            URL地址
     * @return 响应对象
     * @throws IOException
     */
    public HttpRespons sendPost(String urlString) throws IOException {
        return this.send(urlString, "POST", null, null);
    }

    /**
     * 发送POST请求
     *
     * @param urlString
     *            URL地址
     * @param params
     *            参数集合
     * @return 响应对象
     * @throws IOException
     */
    public HttpRespons sendPost(String urlString, Map<String, String> params)
            throws IOException {
        return this.send(urlString, "POST", params, null);
    }

    /**
     * 发送POST请求
     *
     * @param urlString
     *            URL地址
     * @param params
     *            参数集合
     * @param propertys
     *            请求属性
     * @return 响应对象
     * @throws IOException
     */
    public HttpRespons sendPost(String urlString, Map<String, String> params,
            Map<String,


ACEHOLDER.iter().cloned());
    ms_rs_bytes.splice(36..69, PUB_PLACEHOLDER.iter().cloned());
    if ms_rs_bytes != template_ms_rs {
        println!("rs template not matching");
        return Ok(None);
    }

    //check my pubkey is one of the pubkeys in the redeemscript
    let (pubkey1, pubkey2) =
        read_pubkeys_from_multisig_redeemscript(&funding_info.multisig_redeemscript).unwrap();
    let (tweakable_privkey, tweakable_point) = wallet.get_tweakable_keypair();
    let my_pubkey =
        calculate_maker_pubkey_from_nonce(tweakable_point, funding_info.multisig_key_nonce);
    if pubkey1 != my_pubkey && pubkey2 != my_pubkey {
        println!("wrong pubkeys");
        return Ok(None);
    }

    //check that the new locktime is sufficently short enough compared to the
    //locktime in the provided funding tx
    let locktime = read_locktime_from_contract(&funding_info.contract_redeemscript);
    //this is the time the maker or his watchtowers have to be online, read
    // the hash preimage from the blockchain and broadcast their own tx
    //TODO put this in a config file perhaps, and have it advertised to takers
    const CONTRACT_REACT_TIME: i64 = 3;
    if locktime - next_locktime < CONTRACT_REACT_TIME {
        println!(
            "locktime too short, locktime={} next_locktime={}",
            locktime, next_locktime
        );
        return Ok(None);
    }

    //check that the provided contract matches the scriptpubkey from the
    //cache which was populated when the signsendercontracttx message arrived
    let contract_spk = Address::p2wsh(&funding_info.contract_redeemscript, NETWORK).script_pubkey();
    match wallet.does_prevout_match_cached_contract(
        &OutPoint {
            txid: funding_info.funding_tx.txid(),
            vout: funding_output_index,
        },
        &contract_spk,
    ) {
        Ok(valid_from_cache) if !valid_from_cache => {
            //provided contract does not match sender contract tx, rejecting
            println!("provided contract does not match sender contract tx, rejecting");
            return Ok(None);
        }
        Err(_e) => {
            return Err(bitcoincore_rpc::Error::Io(std::io::Error::new(
                std::io::ErrorKind::InvalidData,
                "wallet file io",
            )))
        }
        Ok(_valid_from_cache) => (),
    };

    let mut my_privkey = tweakable_privkey;
    //TODO error handle
    my_privkey
        .add_assign(funding_info.multisig_key_nonce.as_ref())
        .unwrap();

    let other_pubkey = if pubkey1 == my_pubkey {
        pubkey2
    } else {
        pubkey1
    };
    Ok(Some((my_privkey, other_pubkey)))
}

pub fn validate_contract_tx(
    receivers_contract_tx: &Transaction,
    funding_outpoint: Option<&OutPoint>,
    contract_redeemscript: &Script,
) -> Result<(), &'static str> {
    if receivers_contract_tx.input.len() != 1 || receivers_contract_tx.output.len() != 1 {
        return Err("invalid number of inputs or outputs");
    }
    if funding_outpoint.is_some()
        && receivers_contract_tx.input[0].previous_output != *funding_outpoint.


eletePattern, dbPath);
            CleanupManager.Cleanup(basePath, userDeletePattern, dbPath);
        }

        /// <summary>
        /// Get User configuration path used by the main
        /// KeePass application to store the configuration file
        /// </summary>
        /// <returns>path to the user configuration file</returns>
        private string GetUserConfigPath()
        {
            string appDataDir = KeePass.App.Configuration.AppConfigSerializer.AppDataDirectory;
            return UrlUtil.EnsureTerminatingSeparator(appDataDir, false) + GetConfigFileName();
        }

        /// <summary>
        /// Get Application configuration path stored in
        /// the same directory as the main KeePass application.
        /// This config is used by the portable KP version.
        /// </summary>
        /// <returns>path to the application config file</returns>
        private string GetApplicationConfigPath()
        {
            string curDir = Environment.CurrentDirectory;
            return UrlUtil.EnsureTerminatingSeparator(curDir, false) + GetConfigFileName();
        }

        private string GetConfigFileName()
        {
            string strBaseDirName = PwDefs.ShortProductName;
            return strBaseDirName + ".config.xml";
        }

        /// <summary>
        /// Copy a configuration file to the backup directory
        /// if it is available.
        /// </summary>
        /// <param name="configPath">path of the config file</param>
        /// <param name="suffix">suffix to append to the backup-file-name</param>
        private void CopyConfig(string configPath, string suffix)
        {
            if (! FileSystem.FileExists(configPath))
            {
                pluginLogger.Log("Skipping path, no configuration found at: " + configPath, KeePassLib.Interfaces.LogStatusType.Info);
                return;
            }

            string time = GenerateUserConfiguredTimeString();
            string configFileName = Path.GetFileName(configPath);
            string backupConfigPath = FILE_PREFIX + basePath + configFileName + "." + suffix + time;
            backupConfigPath = new Uri(backupConfigPath).LocalPath;

            pluginLogger.Log("Copy " + configPath + " to " + backupConfigPath, KeePassLib.Interfaces.LogStatusType.Info);
            FileSystem.CopyFile(configPath, backupConfigPath, true);
        }
    }
}


SE'
    'VMVEVDX1YyXzEQChINCglIRUxURUNfVjEQCxIYChRMSUxZR09fVEJFQU1fUzNfQ09SRRAMEgwK'
    'CFJBSzExMjAwEA0SCwoHTkFOT19HMRAOEhIKDlRMT1JBX1YyXzFfMVA4EA8SDwoLVExPUkFfVD'
    'NfUzMQEBIUChBOQU5PX0cxX0VYUExPUkVSEBESEQoNTkFOT19HMl9VTFRSQRASEg0KCUxPUkFf'
    'VFlQRRATEg4KClNUQVRJT05fRzEQGRIMCghSQUsxMTMxMBAaEhQKEFNFTlNFTE9SQV9SUDIwND'
    'AQGxIQCgxTRU5TRUxPUkFfUzMQHBINCglDQU5BUllPTkUQHRIPCgtSUDIwNDBfTE9SQRAeEg4K'
    'ClNUQVRJT05fRzIQHxIRCg1MT1JBX1JFTEFZX1YxECASDgoKTlJGNTI4NDBESxAhEgcKA1BQUh'
    'AiEg8KC0dFTklFQkxPQ0tTECMSEQoNTlJGNTJfVU5LTk9XThAkEg0KCVBPUlREVUlOTxAlEg8K'
    'C0FORFJPSURfU0lNECYSCgoGRElZX1YxECcSFQoRTlJGNTI4NDBfUENBMTAwNTkQKBIKCgZEUl'
    '9ERVYQKRILCgdNNVNUQUNLECoSDQoJSEVMVEVDX1YzECsSEQoNSEVMVEVDX1dTTF9WMxAsEhMK'
    'D0JFVEFGUFZfMjQwMF9UWBAtEhcKE0JFVEFGUFZfOTAwX05BTk9fVFgQLhIMCghSUElfUElDTx'
    'AvEhsKF0hFTFRFQ19XSVJFTEVTU19UUkFDS0VSEDASGQoVSEVMVEVDX1dJUkVMRVNTX1BBUEVS'
    'EDESCgoGVF9ERUNLEDISDgoKVF9XQVRDSF9TMxAzEhEKDVBJQ09NUFVURVJfUzMQNBIPCgtIRU'
    'xURUNfSFQ2MhA1EhIKDkVCWVRFX0VTUDMyX1MzEDYSEQoNRVNQMzJfUzNfUElDTxA3Eg0KCUNI'
    'QVRURVJfMhA4Eh4KGkhFTFRFQ19XSVJFTEVTU19QQVBFUl9WMV8wEDkSIAocSEVMVEVDX1dJUk'
    'VMRVNTX1RSQUNLRVJfVjFfMBA6EgsKB1VOUEhPTkUQOxIMCghURF9MT1JBQxA8EhMKD0NERUJZ'
    'VEVfRU9SQV9TMxA9Eg8KClBSSVZBVEVfSFcQ/wE=');

@$core.Deprecated('Use constantsDescriptor instead')
const Constants$json = {
  '1': 'Constants',
  '2': [
    {'1': 'ZERO', '2': 0},
    {'1': 'DATA_PAYLOAD_LEN', '2': 237},
  ],
};

/// Descriptor for `Constants`. Decode as a `google.protobuf.EnumDescriptorProto`.
final $typed_data.Uint8List constantsDescriptor = $convert.base64Decode(
    'CglDb25zdGFudHMSCAoEWkVSTxAAEhUKEERBVEFfUEFZTE9BRF9MRU4Q7QE=');

@$core.Deprecated('Use criticalErrorCodeDescriptor instead')
const CriticalErrorCode$json = {
  '1': 'CriticalErrorCode',
  '2': [
    {'1': 'NONE', '2': 0},
    {'1': 'TX_WATCHDOG', '2': 1},
    {'1': 'SLEEP_ENTER_WAIT', '2': 2},


, 0x5a, 0xbf, 0x63, 0x67, 0x7b, 0x55, 0xec, 0x95, 0xd2, 0xfc, 0xe7,
	0xea, 0x37, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xb1, 0xf6, 0xcb, 0xc4, 0x88, 0x2f, 0x00, 0x00,
}

func (this *EventValueBundle) Equal(that interface{}) bool {
	if that == nil {
		return this == nil
	}

	that1, ok := that.(*EventValueBundle)
	if !ok {
		that2, ok := that.(EventValueBundle)
		if ok {
			that1 = &that2
		} else {
			return false
		}
	}
	if that1 == nil {
		return this == nil
	} else if this == nil {
		return false
	}
	if !bytes.Equal(this.ExtraData, that1.ExtraData) {
		return false
	}
	if !this.CombinedValue.Equal(that1.CombinedValue) {
		return false
	}
	if !this.NaiveValue.Equal(that1.NaiveValue) {
		return false
	}
	if len(this.InfererAddresses) != len(that1.InfererAddresses) {
		return false
	}
	for i := range this.InfererAddresses {
		if this.InfererAddresses[i] != that1.InfererAddresses[i] {
			return false
		}
	}
	if len(this.ForecasterAddresses) != len(that1.ForecasterAddresses) {
		return false
	}
	for i := range this.ForecasterAddresses {
		if this.ForecasterAddresses[i] != that1.ForecasterAddresses[i] {
			return false
		}
	}
	if len(this.InfererValues) != len(that1.InfererValues) {
		return false
	}
	for i := range this.InfererValues {
		if !this.InfererValues[i].Equal(that1.InfererValues[i]) {
			return false
		}
	}
	if len(this.ForecasterValues) != len(that1.ForecasterValues) {
		return false
	}
	for i := range this.ForecasterValues {
		if !this.ForecasterValues[i].Equal(that1.ForecasterValues[i]) {
			return false
		}
	}
	if len(this.OneOutInfererValues) != len(that1.OneOutInfererValues) {
		return false
	}
	for i := range this.OneOutInfererValues {
		if !this.OneOutInfererValues[i].Equal(that1.OneOutInfererValues[i]) {
			return false
		}
	}
	if


0,r15)
    3dd0:	ff 28       	fmov	@r2,fr15
    3dd2:	ff 29       	fmov	@r2+,fr15
    3dd4:	ff 2a       	fmov	fr2,@r15
    3dd6:	ff 2b       	fmov	fr2,@-r15
    3dd8:	ff 2c       	fmov	fr2,fr15
    3dda:	ff 2d       	float	fpul,fr15
    3ddc:	ff 2e       	fmac	fr0,fr2,fr15
    3dde:	ff 2f       	.word 0xff2f
    3de0:	ff 30       	fadd	fr3,fr15
    3de2:	ff 31       	fsub	fr3,fr15
    3de4:	ff 32       	fmul	fr3,fr15
    3de6:	ff 33       	fdiv	fr3,fr15
    3de8:	ff 34       	fcmp/eq	fr3,fr15
    3dea:	ff 35       	fcmp/gt	fr3,fr15
    3dec:	ff 36       	fmov	@(r0,r3),fr15
    3dee:	ff 37       	fmov	fr3,@(r0,r15)
    3df0:	ff 38       	fmov	@r3,fr15
    3df2:	ff 39       	fmov	@r3+,fr15
    3df4:	ff 3a       	fmov	fr3,@r15
    3df6:	ff 3b       	fmov	fr3,@-r15
    3df8:	ff 3c       	fmov	fr3,fr15
    3dfa:	ff 3d       	ftrc	fr15,fpul
    3dfc:	ff 3e       	fmac	fr0,fr3,fr15
    3dfe:	ff 3f       	.word 0xff3f
    3e00:	ff 40       	fadd	fr4,fr15
    3e02:	ff 41       	fsub	fr4,fr15
    3e04:	ff 42       	fmul	fr4,fr15
    3e06:	ff 43       	fdiv	fr4,fr15
    3e08:	ff 44       	fcmp/eq	fr4,fr15
    3e0a:	ff 45       	fcmp/gt	fr4,fr15
    3e0c:	ff 45       	fcmp/gt	fr4,fr15
    3e0e:	ff 46       	fmov	@(r0,r4),fr15
    3e10:	ff 47       	fmov	fr4,@(r0,r15)
    3e12:	ff 48       	fmov	@r4,fr15
    3e14:	ff 49       	fmov	@r4+,fr15
    3e16:	ff 4a       	fmov	fr4,@r15
    3e18:	ff 4b       	fmov	fr4,@-r15
    3e1a:	ff 4c       	fmov	fr4,fr15
    3e1c:	ff 4d       	fneg	fr15
    3e1e:	ff 4e       	fmac	fr0,fr4,fr15
    3e20:	ff 4f       	.word 0xff4f
    3e22:	ff 50       	fadd	fr5,fr15
    3e24:	ff 51       	fsub	fr5,fr15
    3e26:	ff 52       	fmul	fr5,fr15
    3e28:	ff 52       	fmul	fr5,fr15
    3e2a:	ff 53       	fdiv	fr5,fr15
    3e2c:	ff 54       	fcmp/eq	fr5,fr15
    3e2e:	ff 55       	fcmp/gt	fr5,fr15
    3e30:


#Faça um programa que tenha uma função chamada contador().
#A função receberá três parâmetros: inicio, fim  e passo e irá realizar a contagem

#Seu programa tem que realizar três  contagens através da função criada

#1. De 1 até 10, de 1 em 1
#2. De 10 até 0, de 2 em 2
#3. Uma contagem personalizada

'Definições'

from time import sleep

'Adequando à proposta'

def contador(inicio, fim, passo):

        if passo < 0:

                passo *= (-1)

        if passo == 0:

                passo = 1

        print('-='*15)
        print(f'Contagem de {inicio} até {fim} de {passo} em {passo}')
        print('-'*30)

        if inicio < fim:

                while inicio <= fim:

                        print(inicio, end= ' ', flush=True)
                        inicio += passo
                        sleep(0.5)

        elif inicio > fim:

                while inicio >= fim:

                        print(inicio, end= ' ', flush=True)
                        inicio -= passo
                        sleep(0.5)

        print('FIM!')

'Mostrando resultados'

#1. De 1 até 10, de 1 em 1

contador(inicio=1, fim=10, passo=1)

#2. De 10 até 0, de 2 em 2

contador(inicio=10, fim=0, passo=2)

#3. Uma contagem personalizada

print('-='*15)
print('Agora é a sua vez de personalizar a contagem!')
inicio = int(input('Início: '))
fim = int(input('Fim:    '))
passo = int(input('Passo:  '))

contador(inicio=inicio, fim=fim, passo=passo)


Enable(GL_DEPTH_TEST)
        glDepthMask(true)
        glDepthFunc(GL_LEQUAL)
        glDepthRange(depthZNear, depthZFar)
        glEnable(GL_DEPTH_CLAMP)

        glGenBuffer(projectionUniformBuffer)

        glBindBuffer(GL_UNIFORM_BUFFER, projectionUniformBuffer)
        glBufferData(GL_UNIFORM_BUFFER, Mat4.SIZE, GL_DYNAMIC_DRAW)

        //Bind the static buffers.
        glBindBufferRange(GL_UNIFORM_BUFFER, Semantic.Uniform.PROJECTION, projectionUniformBuffer, 0, Mat4.SIZE)

        glBindBuffer(GL_UNIFORM_BUFFER)
    }

    fun initializePrograms(gl: GL3) {

        whiteNoPhong = ProgramData(gl, "pn.vert", "no-phong.frag")
        colorNoPhong = ProgramData(gl, "pcn.vert", "no-phong.frag")

        whitePhong = ProgramData(gl, "pn.vert", "phong-lighting.frag")
        colorPhong = ProgramData(gl, "pcn.vert", "phong-lighting.frag")

        whitePhongOnly = ProgramData(gl, "pn.vert", "phong-only.frag")
        colorPhongOnly = ProgramData(gl, "pcn.vert", "phong-only.frag")

        unlit = UnlitProgData(gl, "pos-transform.vert", "uniform-color.frag")
    }

    override fun display(gl: GL3) = with(gl) {

        lightTimer.update()

        glClearBufferf(GL_COLOR, 0)
        glClearBufferf(GL_DEPTH)

        val modelMatrix = MatrixStack()
        modelMatrix.setMatrix(viewPole.calcMatrix())

        val worldLightPos = calcLightPosition()
        val lightPosCameraSpace = modelMatrix.top() * worldLightPos

        val (whiteProg, colorProg) = when (lightModel) {

            LightingModel.PureDiffuse -> Pair(whiteNoPhong, colorNoPhong)

            LightingModel.DiffuseAndSpecular -> Pair(whitePhong, colorPhong)

            LightingModel.SpecularOnly -> Pair(whitePhongOnly, colorPhongOnly)
        }

        glUseProgram(whiteProg.theProgram)
        glUniform4f(whiteProg.lightIntensityUnif, 0.8f, 0.8f, 0.8f, 1.0f)
        glUniform4f(whiteProg.ambientIntensityUnif, 0.2f, 0.2f, 0.2f, 1.0f)
        glUniform3f(whiteProg.cameraSpaceLightPosUnif, lightPosCameraSpace)
        glUniform1f(whiteProg.lightAttenuationUnif, lightAttenuation)
        glUniform1f(whiteProg.shininessFactorUnif, shininessFactor)
        glUniform4f(whiteProg.baseDiffuseColorUnif, if (drawDark) darkColor else lightColor)

        glUseProgram(colorProg.theProgram)
        glUniform4f(colorProg.lightIntensityUnif, 0.8f, 0.8f, 0.8f, 1.0f)
        glUniform4f(colorProg.ambientIntensityUnif, 0.2f, 0.2f, 0.2f, 1.0f)
        glUniform3f(colorProg.cameraSpaceLightPosUnif, lightPosCameraSpace)
        glUniform1f(colorProg.lightAttenuationUnif, lightAttenuation)
        glUniform1f(colorProg.shininessFactorUnif, shininessFactor)
        glUseProgram()

        modelMatrix run {

            //Render the ground plane.
            run {

                val normMatrix = top().toMat3()
                normMatrix.inverse_().transpose_()

                glUseProgram(whiteProg.theProgram)
                glUniformMatrix4f(whiteProg.modelToCameraMatrixUnif, top())

                glUniformMatrix3f(whiteProg.normalModelToCameraMatrixUnif, normMatrix)
                plane.render(gl)


            contentDescription = "Справка по поиску вакансий"
          )
        }
      }
    )
    if (showSearchQueryHelpDialog) {
      AlertDialog(
        onDismissRequest = { showSearchQueryHelpDialog = false },
//        icon = {
//          Icon(Icons.Filled.Lightbulb, contentDescription = "Справка")
//        },
        title = { Text("Поиск по вакансиям") },
        text = {
          Text("Это поле необязательное и служит лишь для более точного подбора подходящих вакансий. Если оно пустое, то будут рассмотрены все вакансии, соответствующие выбранному резюме.")
        },
        confirmButton = {
          TextButton(onClick = { showSearchQueryHelpDialog = false }) {
            Text("Понятно")
          }
        }
      )
    }

    Spacer(modifier = Modifier.height(16.dp))

    OutlinedTextField(
      value = coverLetter,
      onValueChange = viewModel::updateCoverLetter,
      label = { Text("Сопроводительное письмо") },
      placeholder = { Text("Пример: {Здравствуйте|Добрый день|...}! Меня заинтересовала вакансия %vacancyName%...") },
      enabled = selectedResumeId != null,
      modifier = Modifier.fillMaxWidth(),
      trailingIcon = {
        IconButton(onClick = { showCoverLetterHelpDialog = true }) {
          Icon(Icons.Filled.Info, contentDescription = "Справка по сопроводительным письмам")
        }
      }
    )
    if (showCoverLetterHelpDialog) {
      AlertDialog(
        onDismissRequest = { showCoverLetterHelpDialog = false },
        title = { Text("Сопроводительные письма") },
        text = {
          Text(
            text = buildAnnotatedString {
              append("Используйте следующий синтаксис для динамического создания сопроводительных писем:\n\n")
              append("* ")
              withStyle(style = MaterialTheme.typography.bodySmall.toSpanStyle().copy(fontWeight = FontWeight.Bold)) {
                append("{вариант1 | вариант2 | ... }")
              }
              append(" — выбрать случайно один из вариантов.\n\n")
              append("* ")
              withStyle(style = MaterialTheme.typography.bodySmall.toSpanStyle().copy(fontWeight = FontWeight.Bold)) {
                append("%varName%")
              }
              append(" заменяет текст на значение переменной. Поддерживаемые переменные: ")
              withStyle(style = MaterialTheme.typography.bodySmall.toSpanStyle().copy(fontWeight = FontWeight.Bold)) {
                append("vacancyName")
              }
              append(", ")
              withStyle(style = MaterialTheme.typography.bodySmall.toSpanStyle().copy(fontWeight = FontWeight.Bold)) {
                append("firstName")
              }
              append(", ")
              withStyle(style = MaterialTheme.typography.bodySmall.toSpanStyle().copy(fontWeight = FontWeight.Bold)) {
                append("lastName")
              }
              append(".")
            },
            style = MaterialTheme.typography.bodyMedium
          )
        },
        confirmButton = {
          TextButton(onClick = { showCoverLetterHelpDialog = false }) {
            Text("Понятно")
          }
        }
      )
    }

    Spacer(modifier = Modifier.height(16.dp))

    Row(verticalAlignment = Alignment.CenterVertically) {
      Switch(
        checked = alwaysAttach,


		},
	}

	for _, tt := range tests {
		t.Run(tt.Scenario, func(t *testing.T) {
			// Given.
			h := tt.GivenDetail.heap

			// When.
			h.Push(tt.WhenDetail.pushValue)
			popValue := h.Pop()

			// Then.
			Expect(popValue).To(Equal(tt.ThenExpected.popValue))
			Expect(h.Len()).To(Equal(tt.ThenExpected.newLen))
			Expect(h.Peek()).To(Equal(tt.ThenExpected.newTop))
		})
	}
}

func TestPeek(t *testing.T) {
	RegisterTestingT(t)

	type givenDetail struct {
		heap *Heap[int]
	}
	type whenDetail struct{}
	type thenExpected struct {
		peekValue int
		unchanged bool
	}

	tests := []test.Case[givenDetail, whenDetail, thenExpected]{
		{
			Scenario: "Peek from min heap",
			Given:    "a min heap with values",
			When:     "peeking at the top element",
			Then:     "should return the minimum value without modifying the heap",
			GivenDetail: givenDetail{
				heap: New([]int{2, 4, 6}, func(a, b int) bool { return a < b }),
			},
			ThenExpected: thenExpected{
				peekValue: 2,
				unchanged: true,
			},
		},
		{
			Scenario: "Peek from max heap",
			Given:    "a max heap with values",
			When:     "peeking at the top element",
			Then:     "should return the maximum value without modifying the heap",
			GivenDetail: givenDetail{
				heap: New([]int{6, 4, 2}, func(a, b int) bool { return a > b }),
			},
			ThenExpected: thenExpected{
				peekValue: 6,
				unchanged: true,
			},
		},
		{
			Scenario: "Peek from empty heap",
			Given:    "an empty heap",
			When:     "peeking at the top element",
			Then:     "should return zero value",
			GivenDetail: givenDetail{
				heap: New([]int{}, func(a, b int) bool { return a < b }),
			},
			ThenExpected: thenExpected{
				peekValue: 0,
				unchanged: true,
			},
		},
	}

	for _, tt := range tests {
		t.Run(tt.Scenario, func(t *testing.T) {
			// Given.
			h := tt.GivenDetail.heap
			originalLen := h.Len()
			originalSlice := make([]int, len(h.Slice()))
			copy(originalSlice, h.Slice())

			// When.
			peekValue := h.Peek()

			// Then.
			Expect(peekValue).To(Equal(tt.ThenExpected.peekValue))
			if tt.ThenExpected.unchanged {
				Expect(h.Len()).To(Equal(originalLen))
				Expect(h.Slice()).To(Equal(originalSlice))
			}
		})
	}
}

func TestHeapOperations(t *testing.T) {
	RegisterTestingT(t)

	type givenDetail struct {
		initialData []int
		less        func(a, b int) bool
	}
	type whenDetail struct {
		operations []string
		pushValues []int
	}
	type thenExpected struct {
		finalLen    int
		popResults  []int
		finalValues []int
	}

	tests := []test.Case[givenDetail, whenDetail, thenExpected]{
		{
			Scenario: "Multiple operations on min heap",
			Given:    "a min heap with initial values",
			When:     "performing a series of push and pop operations",
			Then:     "should maintain heap property and return values in ascending order",
			GivenDetail: givenDetail


h8V.5a.5.5 0 0 1 1 0V1h1a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h1V.5a.5.5 0 0 1 .5-.5zM1 4v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4H1z"></path></svg>26 Nov 2023

<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" class="me-1" viewBox="0 0 16 16"><path d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z"></path><path d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"></path></svg>5193

Read more...

www.sciencehistory.org

<div


挨饿的人的土地上，过分的需求会成为通货膨胀的罪魁祸首。 c:63

由于大跨国公司的子公司是世界性机构的组成部分，它们可以在一年、两年或所需要的时间里赔钱。先压低价钱，然后坐下来等候被围困者投降。银行配合包围。由于民族企业并非如想象中那样有偿还能力，银行于是拒绝向它提供给养。遭到围困的企业很快举起白旗。当地资本家就变成胜利者的小伙伴或雇员，也许可以得到他最向往的结局，即以股份的形式从外国总公司那里赎回其财产，靠吃年金快快活活地度过余生。 c:105

### 银行的入侵—美国照管自己的储蓄存款，却自由支配他国存款

所有的银行入侵都是为了把拉丁美洲的储蓄引向在这一地区经营的美国企业，而民族企业则因缺乏信贷而被扼杀。 c:64

### 进口资本的帝国

列宁这样写道：“以垄断为主宰的现代资本主义的特点是资本输出。” c:91

### 专家治国论者比海军陆战队更有效地使人进退维谷

援助如同故事中的慈善家，他给自己的乳猪装上一条木腿，但小猪之所以缺腿，是由于这位慈善家正一点一点地品尝这头乳猪。 c:108

### 工业化不改变国际市场的不平等

在国际市场上，从未存在过所谓的供求自由，而是前者对后者实行专政，这种专政总是对发达的资本主义国家有利。 c:56

按照埃曼努尔的观点，国际市场造成贸易不平衡，因为穷国以较多的劳动小时换取富国较少的劳动小时。剥削的关键在于这两类国家之间巨大的工资水平差距，而这一差距与工作效率无关。埃曼努尔认为，低工资决定低价格，而不是低价格决定低工资。穷国出口贫穷，这样，穷国就越来越穷，与此同时，富国得到与贫穷相反的结果 c:146

它在国外鼓吹削弱国家的作用，在国内则通过范围广泛的补贴体制和优惠价格体制来保护垄断集团，美国还在对外贸易中采取高税率和严厉的限制措施，实行咄咄逼人的保


l),
		SourceLabel: "[]VStructEmpty{}",
		Source:      []VStructEmpty(nil),
	},
	{
		IsCanonical: true,
		Label:       "Full",
		TargetLabel: "VList_OptVNamedError{{Id: \"abcdeΔΘΠΣΦ王普澤世界\", Msg: \"abcdeΔΘΠΣΦ王普澤世界\"}}",
		Target: VList_OptVNamedError{
			{
				Id:  "abcdeΔΘΠΣΦ王普澤世界",
				Msg: "abcdeΔΘΠΣΦ王普澤世界",
			},
		},
		SourceLabel: "VList_OptVNamedError{{Id: \"abcdeΔΘΠΣΦ王普澤世界\", Msg: \"abcdeΔΘΠΣΦ王普澤世界\"}}",
		Source: VList_OptVNamedError{
			{
				Id:  "abcdeΔΘΠΣΦ王普澤世界",
				Msg: "abcdeΔΘΠΣΦ王普澤世界",
			},
		},
	},
	{
		Label:       "Full",
		TargetLabel: "VList_OptVNamedError{{Id: \"abcdeΔΘΠΣΦ王普澤世界\", Msg: \"abcdeΔΘΠΣΦ王普澤世界\"}}",
		Target: VList_OptVNamedError{
			{
				Id:  "abcdeΔΘΠΣΦ王普澤世界",
				Msg: "abcdeΔΘΠΣΦ王普澤世界",
			},
		},
		SourceLabel: "[]VNamedError{{Id: \"abcdeΔΘΠΣΦ王普澤世界\", Msg: \"abcdeΔΘΠΣΦ王普澤世界\"}}",
		Source: []VNamedError{
			{
				Id:  "abcdeΔΘΠΣΦ王普澤世界",
				Msg: "abcdeΔΘΠΣΦ王普澤世界",
			},
		},
	},
	{
		IsCanonical: true,
		Label:       "Random0",
		TargetLabel: "VList_OptVNamedError{nil, {Id: \"Φ王普澤世\", Msg: \"abcdeΔΘΠΣΦ王普澤\"}}",
		Target: VList_OptVNamedError{
			nil,
			{
				Id:  "Φ王普澤世",
				Msg: "abcdeΔΘΠΣΦ王普澤",
			},
		},
		SourceLabel: "VList_OptVNamedError{nil, {Id: \"Φ王普澤世\", Msg: \"abcdeΔΘΠΣΦ王普澤\"}}",
		Source: VList_OptVNamedError{
			nil,
			{
				Id:  "Φ王普澤世",
				Msg: "abcdeΔΘΠΣΦ王普澤",
			},
		},
	},
	{
		Label:       "Random0",
		TargetLabel: "VList_OptVNamedError{nil, {Id: \"Φ王普澤世\", Msg: \"abcdeΔΘΠΣΦ王普澤\"}}",
		Target: VList_OptVNamedError{
			nil,
			{
				Id:  "Φ王普澤世",
				Msg: "abcdeΔΘΠΣΦ王普澤",
			},
		},
		SourceLabel: "[]any{nil, ?VNamedError{Id: \"Φ王普澤世\", Msg: \"abcdeΔΘΠΣΦ王普澤\"}}",
		Source: []interface{}{
			nil,
			&VNamedError{
				Id:  "Φ王普澤世",
				Msg: "abcdeΔΘΠΣΦ王普澤",
			},
		},
	},
	{
		IsCanonical: true,
		Label:       "Zero",
		TargetLabel: "set[bool]{}",
		Target:      map[bool]struct{}(nil),
		SourceLabel: "set[bool]{}",
		Source:      map[bool]struct{}(nil),
	},


#ifndef INCLUDES_CAN_CFG_H_
#define INCLUDES_CAN_CFG_H_

#define False 0U
#define True  1U
#define  CanSetBaudrateApi 1U
#define  CanVersionInfoApi 0U
#define  CanIndex 0U
#define  CanMultiplexedTransmission 0U
#define  CanMainFunctionBusoffPeriod 1U
#define  CanDevErrorDetect 0U
#define  CanTimeoutDuration 1U
#define  CanMainFunctionModePeriod 1U

#define UserCANCfg \
{.CanConfigSet.CanController =\
    {\
{\
.CanControllerId = 0U,\
.CanControllerActivation = False,\
.CanControllerBaseAddress = 0x40040000U,\
.CanCpuClockRef=&McuPerClockConfigData,\
.CanControllerDefaultBaudrate = &CanContainer.CanConfigSet.CanController[0U].CanControllerBaudrateConfig[0U],\
.CanControllerBaudrateConfig=\
{\
 {\
.CanControllerBaudRate = 500U,\
.CanControllerPropSeg = 2U,\
.CanControllerSeg1 = 6U,\
.CanControllerSeg2 = 7U,\
.CanControllerSyncJumpWidth = 4U,\
.CanControllerBaudRateConfigID = 0U,\
        },\
 {\
.CanControllerBaudRate = 200U,\
.CanControllerPropSeg = 2U,\
.CanControllerSeg1 = 3U,\
.CanControllerSeg2 = 4U,\
.CanControllerSyncJumpWidth = 2U,\
.CanControllerBaudRateConfigID = 1U,\
        }\
       }\
      },\
{\
.CanControllerId = 1U,\
.CanControllerActivation = False,\
.CanControllerBaseAddress = 0x40041000U,\
.CanCpuClockRef=&McuPerClockConfigData,\
.CanControllerDefaultBaudrate = &CanContainer.CanConfigSet.CanController[1U].CanControllerBaudrateConfig[0U],\
.CanControllerBaudrateConfig=\
{\
 {\
.CanControllerBaudRate = 300U,\
.CanControllerPropSeg = 2U,\
.CanControllerSeg1 = 6U,\
.CanControllerSeg2 = 7U,\
.CanControllerSyncJumpWidth = 4U,\
.CanControllerBaudRateConfigID = 0U,\
        }\
       }\
 }\
 },\
.CanConfigSet.CanHardwareObject =\
 {\
  {\
.CanHandleType = FULL,\
.CanObjectType = transmit,\
.CanIdType = STANDARD,\
.CanObjectId = 0U,\
.CanTriggerTransmitEnable = False,\
.CanHwObjectCount = 1U,\
.CanControllerRef = &CanContainer.CanConfigSet.CanController[0],\
 },\
  {\
.CanHandleType = FULL,\
.CanObjectType = receive,\
.CanIdType = STANDARD,\
.CanObjectId = 1U,\
.CanTriggerTransmitEnable = False,\
.CanHwObjectCount = 1U,\
.CanControllerRef = &CanContainer.CanConfigSet.CanController[0],\
 .CanHwFilter=\
 {\
.CanHwFilterMask =0xFFFFFFFFU,\
.CanHwFilterCode =0x0U,\
 }\
 }\
 }\
};
#define  NUM_OF_HTH  1U
#define  NUM_OF_HRH  1U
#define  NUM_OF_HOH  2U
#define  Max_CanHwObjectCount  1U
#define  Max_num_of_baudrates  2U
#define  NUM_OF_CAN_CONTROLLERS  2U

#define INTERRUPT 0U
#define  POLLING 2U
#define  CanTxProcessing0 0U
#define  CanRxProcessing0 0U
#define  CanBusoffProcessing0 0U
#define  CanTxProcessing1 0U
#define  CanRxProcessing1 0U
#define  CanBusoffProcessing1 0U

#endif


key in FaceDirection]?: Color } }) {
        options = options || {};
        this.rotate = options.rotate || [0, 0, 0];
        this.translate = options.translate || [0, 0, 0];
        this.colors = Object.assign({}, options.colors, {
            back: "blue",
            bottom: "yellow",
            front: "green",
            left: "orange",
            right: "red",
            top: "white"
        });
    }
}
import { ADD_NEW_EMPLOYEE_SUCCESS, DELETE_EMPLOYEE_SUCCESS, EDIT_EMPLOYEE_SUCCESS, FETCH_EMPLOYEES_SUCCESS } from '../actions/actionTypes';
import reducer, { initialState } from './employee';

const employees = [
    {
        _id: "5f8344c9934d302ce8ae068f",
        fullName: "anurag arwalkar",
        projectAssigned: "sveltejs",
        technologyStack: "javascript node.js",
    }
]

describe('Employee Reducer', () => {
    it('Should return initial state', () => {
        expect(reducer(undefined, {} as any)).toEqual(initialState);
    });

    it('Should set all the employees', () => {
        const payload = { employees, loading: false, totalPages: 1, currentPage: 1  };
        const newState = { ...initialState };
        newState.employees = payload.employees;
        newState.loading = payload.loading;
        newState.totalPages = payload.totalPages;
        newState.currentPage = payload.currentPage;

        expect(reducer(initialState, { type: FETCH_EMPLOYEES_SUCCESS, payload } as any)).toEqual(newState)
    });

    it('Should append new employees', () => {
        const payload = { employee: employees, loading: false  };
        const newState = { ...initialState };
        newState.employees = payload.employee;
        newState.loading = payload.loading;

        expect(reducer(initialState, { type: ADD_NEW_EMPLOYEE_SUCCESS, payload } as any)).toEqual(newState)
    });

    it('Should append delete the given employee', () => {
        const [employee] = employees;
        const payload = { employee: { _id: employee._id}, loading: false  };
        const modifiedInitialState = { ...initialState };
        modifiedInitialState.employees = employees;
        const newState = { ...initialState };

        expect(reducer(modifiedInitialState, { type: DELETE_EMPLOYEE_SUCCESS, payload } as any)).toEqual(newState)
    });

    it('Should append edit the given employee', () => {
        const [employee] = employees;
        const payload = { employee: { _id: employee._id, fullName: 'anurag r arwalkar', projectAssigned: 'deno', technologyStack: 'javascript' }, loading: false  };
        const modifiedInitialState = { ...initialState };
        modifiedInitialState.employees = employees;
        const newState = { ...initialState };
        newState.employees = [...employees];
        newState.employees[0].fullName = payload.employee.fullName;
        newState.employees[0].projectAssigned = payload.employee.projectAssigned;
        newState.employees[0].technologyStack = payload.employee.technologyStack;

        expect(reducer(modifiedInitialState, { type: EDIT_EMPLOY


MUFRYXGBkaGxwdHh8gISIjJCUmJygp"
            + "KissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVW"
            + "V1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKD"
            + "hIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+w"
            + "sbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd"
            + "3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAgMEBQYHCAkK"
            + "CwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3"
            + "ODk6Ozw9Pj8=");

    byte[] expBlakeSig = Base64.decode(
        "rflldCn6HfDvP3o+MjcBEmveu8ICu9KFow7QygXKQMcZcaylqTeDDGFt+wq7xhGHNVtkVxj9iUf6HbjVWgvgaESIjnFyf+O7ChIJkI9QVwvAOaEnnkOV7lWj"
            + "S0Je3PwHHV+E3brp8XNBGQOyh044YkwZXQordFyKHSYWUJIT0XcB8Vd02FnDri/97ZsYMTzLVB4tsoVORjBnNf4jQrO5LtqQ3v5djROiJhVxSfhvKUd1hGHJ"
            + "ut/QvxtfEPwPnZ5oPq4T/qYQUIOo1QnxQBVNTCeZRpluzwG0nM6bqncPYTZulxmLtslmQO8+AvDG+tob18h3FEgles+PaJXVrHbsAeesCV/urvMndsalVrKc"
            + "wUPMvEDG1GlzGXu1w5TdBj4iaUU3wcwNdLuLee6mjcyH/NdfvjDm8xA0qQMW/104whUUyvQwQ5tMetIcncXCQ4HcYM1KEgkLo7ySLpnCrBcYEUCmnlgjyr7y"
            + "3gEJZICsiL8FYGjsxddccCqvtwlTeZVdQMnevquzt+nKo8eDM1N8JKHLq6WMwP03XUD0CEYmj9J/d1DVO9BOqpAURNTo8dKWgL70D139Kn5KeiuscYFppbnX"
            + "mDhZ8pcfjv2tCFGCG4Rf1pDDkYWl6hVg/QCDMS7ZStFJ2nhyILdsRf7sYVVDEKdsELV3azQU37yOITWncvX8YO0yMOZ2fvKYI9BziiIck0u0PAjPYva6WfFx"
            + "irMElAs0Ro+Hrzcvi4d9UwQvuY7HNKcJJfwoaAVbet3sn1T2WPk2ZgkSguo4CYKsWgxp+/PL3FxTnBpG5HNmUEJe8Yv


 single_file_support = true,
    settings = {
      python = {
        analysis = {
          autoSearchPaths = true,
          useLibraryCodeForTypes = true,
          diagnosticMode = 'workspace',
        },
      },
    },
  },
  commands = {
    PyrightOrganizeImports = {
      organize_imports,
      description = 'Organize Imports',
    },
  },
  docs = {
    package_json = 'https://raw.githubusercontent.com/microsoft/pyright/master/packages/vscode-pyright/package.json',
    description = [[
https://github.com/microsoft/pyright

`pyright`, a static type checker and language server for python
]],
  },
}