情绪少女

文章 评论 浏览 33

情绪少女 2025-02-21 00:57:15

您每个策略密钥ID只能具有一个值。但是,您可以将新证书作为新的策略密钥上传,然后在用户旅程中添加附加的技术资料,以验证您针对新策略密钥的标记提示。示例:步骤1试图验证对策略密钥1的标记提示,如果不成功,请尝试验证对策略密钥2的标记提示。那样,可以验证旧的链接和新链接。

You can only have one value per policy key id. However, you can upload your new certificate as a new policy key, then add an additional technical profile into your user journey that validates your token hint against the new policy key. Example: Step 1 tries to validate the token hint against policy key 1, if it's not successful, then try to validate the token hint against policy key 2. That way old links and new links can both be validated.

Azure AD B2C自定义策略密钥管理:我可以上传2个策略密钥,并将两个密钥用于ID提示令牌验证吗?

情绪少女 2025-02-21 00:47:21

如书面,这个问题没有很大的意义。假设文档

仅当线程对特定用户功能之一[...]。

是正确的,所讨论的代码不适合反驳此语句。这是说明缺乏原因的注释代码:

DWORD dwThreadID = GetCurrentThreadId();
// Call a message-specific USER function on the current thread
BOOL bResult = PostThreadMessageW(dwThreadID, WM_QUIT, 123, 456);
// Ask a question on SO why the current thread maintains a message queue

我不知道文档是否仍然准确(具体来说,该部分解释了如何根据需要创建特定于线程的消息队列)。尽管如此,该代码并没有质疑其准确性。 POSTTHREADMESSAGEW()带有当前线程的线程ID,未失败的位置在规范之内(忽略错误条件,例如 error_not_enough_enough_quota )。

As written, the question doesn't make a whole lot of sense. Under the assumption that the following passage in the documentation

The system creates a thread-specific message queue only when the thread makes its first call to one of the specific user functions [...].

is correct, the code in question is unsuitable to refute this statement. Here is the annotated code to illustrate the lack of reason:

DWORD dwThreadID = GetCurrentThreadId();
// Call a message-specific USER function on the current thread
BOOL bResult = PostThreadMessageW(dwThreadID, WM_QUIT, 123, 456);
// Ask a question on SO why the current thread maintains a message queue

I don't know whether the documentation is still accurate (specifically, the part that explains how thread-specific message queues are created on demand). Still, the code does nothing to question its accuracy. PostThreadMessageW() with a thread ID of the current thread not failing is within specification (ignoring error conditions such as ERROR_NOT_ENOUGH_QUOTA).

为什么使用消息队列创建线程?

情绪少女 2025-02-20 17:53:12

鉴于您提供的信息,您只需使用org.springframework.web.server.webfilter即可实现您的自定义验证器:

在内部声明它

@Component
public class CredentialFilter implements WebFilter

,覆盖过滤器方法:

    @Override
    public Mono<Void> filter(final ServerWebExchange serverWebExchange, final WebFilterChain webFilterChain) {
    
        //gets the header called bearer_token, or however you store it. You can also use any of the request properties.
        return Mono.just(serverWebExchange.getRequest().getHeaders().getFirst("bearer_token"))
           //if no bearer token throw a simple exception.
           .switchIfEmpty(Mono.defer(() -> Mono.error(new Exception("Unauthorized"))))
           //validate token with your custom method. If not valid, deals same as before.
           .filter(token -> validateToken(token))
           .switchIfEmpty(Mono.defer(() -> Mono.error(new Exception("Unauthorized"))))
           .onErrorResume(e -> {
              throw managedException(e);
           })
           //continue the request.
           .then(webFilterChain.filter(serverWebExchange));

}

        //method to escape throw check.
        protected RuntimeException managedException(final Throwable e) {

        if (e instanceof ISSException.GenericException) {
            return (ISSException.GenericException) e;
        }
        return (RuntimeException) e;
    }

当然,这在例外处理程序中不会完成。幸运的是,我们拥有org.springframework.boot.web.reactive.error.errorwebexceptionhandler界面:

@Component
public class WebfluxExceptionHandler implements ErrorWebExceptionHandler

覆盖手柄方法以捕获我们的例外:

@Override
public Mono<Void> handle(final ServerWebExchange serverWebExchange, final Throwable throwable) {
    if (throwable.getMessage().equals("Unauthorized")) {
       //put an unauthorized code serverWebExchange.getResponse().setStatusCode(org.springframework.http.HttpStatus.UNAUTHORIZED);
    }
    return Mono.error(throwable);
}

Given the information you provided, you can simply use org.springframework.web.server.WebFilter to implement your custom validator:

Declare it

@Component
public class CredentialFilter implements WebFilter

Inside, override the filter method:

    @Override
    public Mono<Void> filter(final ServerWebExchange serverWebExchange, final WebFilterChain webFilterChain) {
    
        //gets the header called bearer_token, or however you store it. You can also use any of the request properties.
        return Mono.just(serverWebExchange.getRequest().getHeaders().getFirst("bearer_token"))
           //if no bearer token throw a simple exception.
           .switchIfEmpty(Mono.defer(() -> Mono.error(new Exception("Unauthorized"))))
           //validate token with your custom method. If not valid, deals same as before.
           .filter(token -> validateToken(token))
           .switchIfEmpty(Mono.defer(() -> Mono.error(new Exception("Unauthorized"))))
           .onErrorResume(e -> {
              throw managedException(e);
           })
           //continue the request.
           .then(webFilterChain.filter(serverWebExchange));

}

        //method to escape throw check.
        protected RuntimeException managedException(final Throwable e) {

        if (e instanceof ISSException.GenericException) {
            return (ISSException.GenericException) e;
        }
        return (RuntimeException) e;
    }

This, of course, won't be complete with a exception handler. Luckily, we have the org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler interface:

@Component
public class WebfluxExceptionHandler implements ErrorWebExceptionHandler

And override the handle method to catch our exception:

@Override
public Mono<Void> handle(final ServerWebExchange serverWebExchange, final Throwable throwable) {
    if (throwable.getMessage().equals("Unauthorized")) {
       //put an unauthorized code serverWebExchange.getResponse().setStatusCode(org.springframework.http.HttpStatus.UNAUTHORIZED);
    }
    return Mono.error(throwable);
}

需要帮助验证访问令牌

情绪少女 2025-02-20 11:58:28

您可以使用 collection.containsall() 也将@oh上帝蜘蛛归功于他们在几乎在同一第二个评论中提到的):

return list.containsAll(map.keySet());

You can use Collection.containsAll() (also credits to @OH GOD SPIDERS since they mentioned it in the comments almost in the same second) :

return list.containsAll(map.keySet());

检查ArrayList Java中存在的地图密钥

情绪少女 2025-02-20 00:24:15

您可以使用CSS来实现类似的事情:

<Link className={`${isDisabled ? 'pointer-events-none' : 'cursor-pointer'}`} href={`${isDisabled ? 'http://Gogogo' : ''}`>
  My dynamic link
</Link>

如果您不使用尾风CSS,则可以创建自己的类并添加指针事件:样式表中的无属性在必要时禁用链接。
祝你好运!

You can achieve something like this using CSS:

<Link className={`${isDisabled ? 'pointer-events-none' : 'cursor-pointer'}`} href={`${isDisabled ? 'http://Gogogo' : ''}`>
  My dynamic link
</Link>

If you're not using Tailwind CSS, you can create your own class and add the pointer-events: none property in your stylesheet to disable the link when necessary.
Good luck!

如何有条件地渲染按钮 /链接Next.js组件使用Typescript

情绪少女 2025-02-19 21:30:47

您必须为连接器版本安装正确的依赖项(Protobuf)版本。
就我而言,我正在安装mysql_connector_python-8.1.0-cp38-cp38-win_amd64,并且需要Protobuf版本&gt; = 4.21.1,&&&&&lt; = 4.21.12。 ( https://dev.mysql.com/doc/relnotes/connector-python/en/news-8-1-0.html

以确定正确的ProtoBuf版本在Internet连接的机器上进行Python并安装PIP安装连接器。它将自动下载并安装正确的依赖项版本。然后,您可以搜索该版本的车轮,下载其轮子并在离线机上安装。

You must install the correct dependency (protobuf) version for your connector version.
In my case, I was installing mysql_connector_python-8.1.0-cp38-cp38-win_amd64 and it requires protobuf version >= 4.21.1, <=4.21.12. (https://dev.mysql.com/doc/relnotes/connector-python/en/news-8-1-0.html)

To figure the correct protobuf version for which case, you can install python on a internet connected machine and pip install the connector. It will automatically download and install the correct dependency version. Then you can search for that version wheel, download its wheel and install on the offline machine.

MySQL连接器Python PIP安装离线安装

情绪少女 2025-02-18 19:14:03

我在React问题上使用了一种解决方法来解决此问题。 Method link: https://github.com/facebook/react/issues/11538 #issuecomment-417504600
我的更改点是:仅在检测到页面翻译时才能运行此方法。

我的代码:

// https://github.com/facebook/react/issues/11538#issuecomment-417504600
export default function fixGoogleTranslateCauseReactAppCrashProblems() {
  const observer = new MutationObserver(function () {
    if (document.documentElement.className.match('translated')) {
      installPolyfill();
      observer.disconnect();
    }
  });

  observer.observe(document.documentElement, {
    attributes: true,
    attributeFilter: ['class'],
    childList: false,
    characterData: false,
  });
}

function installPolyfill() {
  if (typeof Node === 'function' && Node.prototype) {
    const originalRemoveChild = Node.prototype.removeChild;
    Node.prototype.removeChild = function (child) {
      if (child.parentNode !== this) {
        console.error('Cannot remove a child from a different parent');
        return child;
      }
      return originalRemoveChild.apply(this, arguments);
    };

    const originalInsertBefore = Node.prototype.insertBefore;
    Node.prototype.insertBefore = function (newNode, referenceNode) {
      if (referenceNode && referenceNode.parentNode !== this) {
        console.error('Cannot insert before a reference node from a different parent');
        return newNode;
      }
      return originalInsertBefore.apply(this, arguments);
    };
  }
}

I used a workaround method provided on React issue to solve this problem. Method link: https://github.com/facebook/react/issues/11538#issuecomment-417504600 .
My change point is: run this method only when the page is detected to be translated.

my code:

// https://github.com/facebook/react/issues/11538#issuecomment-417504600
export default function fixGoogleTranslateCauseReactAppCrashProblems() {
  const observer = new MutationObserver(function () {
    if (document.documentElement.className.match('translated')) {
      installPolyfill();
      observer.disconnect();
    }
  });

  observer.observe(document.documentElement, {
    attributes: true,
    attributeFilter: ['class'],
    childList: false,
    characterData: false,
  });
}

function installPolyfill() {
  if (typeof Node === 'function' && Node.prototype) {
    const originalRemoveChild = Node.prototype.removeChild;
    Node.prototype.removeChild = function (child) {
      if (child.parentNode !== this) {
        console.error('Cannot remove a child from a different parent');
        return child;
      }
      return originalRemoveChild.apply(this, arguments);
    };

    const originalInsertBefore = Node.prototype.insertBefore;
    Node.prototype.insertBefore = function (newNode, referenceNode) {
      if (referenceNode && referenceNode.parentNode !== this) {
        console.error('Cannot insert before a reference node from a different parent');
        return newNode;
      }
      return originalInsertBefore.apply(this, arguments);
    };
  }
}

当我在Chrome中使用自动翻译功能时,为什么要获得圆顶感受?

情绪少女 2025-02-18 01:44:34

您可以使用 itertools.compress() /a>要过滤所有 false 条目。 计数器的选项应最有效,只需在 n 参数/library/collections.html#collections.counter.most_common“ rel =” nofollow noreferrer“> .most_common() 让它返回单个对。

Code:

from itertools import compress
from collections import Counter

names = ['alan_grant', 'alan_grant', 'alan_grant', 'alan_grant', 'alan_grant', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'john_hammond', 'john_hammond', 'john_hammond', 'john_hammond', 'john_hammond', 'owen_grady', 'owen_grady', 'owen_grady', 'owen_grady', 'owen_grady']
votes = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True]

most_common = Counter(compress(names, votes)).most_common(1)[0][0]
# Or with some syntax sugar:
# [(most_common, _)] = Counter(compress(names, votes)).most_common(1)

Upd. I've made some benchmarks对于这种特殊情况,似乎略微优化的第一种方法表明了更好的性能:

from itertools import compress

names = ['alan_grant', 'alan_grant', 'alan_grant', 'alan_grant', 'alan_grant', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'john_hammond', 'john_hammond', 'john_hammond', 'john_hammond', 'john_hammond', 'owen_grady', 'owen_grady', 'owen_grady', 'owen_grady', 'owen_grady']
votes = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True]

characters = list(compress(names, votes))
most_common = max(set(characters), key=characters.count)

You can use itertools.compress() to filter all false entries. Option with Counter should be most efficient, just use n argument in .most_common() to let it return a single pair.

Code:

from itertools import compress
from collections import Counter

names = ['alan_grant', 'alan_grant', 'alan_grant', 'alan_grant', 'alan_grant', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'john_hammond', 'john_hammond', 'john_hammond', 'john_hammond', 'john_hammond', 'owen_grady', 'owen_grady', 'owen_grady', 'owen_grady', 'owen_grady']
votes = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True]

most_common = Counter(compress(names, votes)).most_common(1)[0][0]
# Or with some syntax sugar:
# [(most_common, _)] = Counter(compress(names, votes)).most_common(1)

Upd. I've made some benchmarks and it seems like for this particular case slightly optimized first method demonstrates better performance:

from itertools import compress

names = ['alan_grant', 'alan_grant', 'alan_grant', 'alan_grant', 'alan_grant', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'claire_dearing', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ellie_sattler', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'ian_malcolm', 'john_hammond', 'john_hammond', 'john_hammond', 'john_hammond', 'john_hammond', 'owen_grady', 'owen_grady', 'owen_grady', 'owen_grady', 'owen_grady']
votes = [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, True, True, True]

characters = list(compress(names, votes))
most_common = max(set(characters), key=characters.count)

如何在两个相关列表中找到最常见的名称

情绪少女 2025-02-17 20:10:53

git log -diff-filter = d-summary

参见在git存储库中查找并还原已删除的文件

如果您不希望将其删除的所有提交所删除的所有信息,则只需在其中添加GREP删除即可。

git log -diff-filter = d-summary | GREP DELETE

git log --diff-filter=D --summary

See Find and restore a deleted file in a Git repository

If you don't want all the information about which commit they were removed in, you can just add a grep delete in there.

git log --diff-filter=D --summary | grep delete

列出所有删除任何文件的git提交

情绪少女 2025-02-17 18:12:53
  var array = [
    {
      category: "hats",
      name: "hat1"
    },
    {
      category: "Pants",
      name: "pants2"
    },
    {
      category: "hats",
      name: "hat2"
    },
    {
      category: "Pants",
      name: "pants1"
    }
  ];

  var arrayofarray = Object.values(
    array.reduce((acc, cur) => {
      acc[cur["category"]] = [...(acc[cur["category"]] || []), cur];
      return acc;
    }, {})
  );

  return (
    <>
      {arrayofarray.map((category) => {
        return (
          <div>
            {category.map(({ category, image, name, _id }, i) => {
              return (
                <div>
                  <p>
                    {i} {name} {category}
                  </p>
                </div>
              );
            })}
          </div>
        );
      })}
    </>
  );
}

因此,我在此处创建了一个测试项目:

我认为它可以执行您的需要,所以我所做的就是根据类别创建一系列数组,然后映射在数组中,这将为您带来所需的结果。

  var array = [
    {
      category: "hats",
      name: "hat1"
    },
    {
      category: "Pants",
      name: "pants2"
    },
    {
      category: "hats",
      name: "hat2"
    },
    {
      category: "Pants",
      name: "pants1"
    }
  ];

  var arrayofarray = Object.values(
    array.reduce((acc, cur) => {
      acc[cur["category"]] = [...(acc[cur["category"]] || []), cur];
      return acc;
    }, {})
  );

  return (
    <>
      {arrayofarray.map((category) => {
        return (
          <div>
            {category.map(({ category, image, name, _id }, i) => {
              return (
                <div>
                  <p>
                    {i} {name} {category}
                  </p>
                </div>
              );
            })}
          </div>
        );
      })}
    </>
  );
}

So i created a test project see sandbox here: https://codesandbox.io/s/stoic-lovelace-uw7hen?file=/src/App.js

I think it does what you require, so what I did was create an array of arrays based on the category and then map over the array of arrays, this will get you the result you need.

映射两次以分类

情绪少女 2025-02-17 13:25:32

我在您提供的样本中看不到任何重复。是的,对于部门编号,有很多行相同的行,但它们都与日期不同。工会过滤了重复的行,而不是值。您可以列出二十个名字,其中姓氏史密斯。但是Brain Smith和Carl Smith显然是不同的名字。

I don't see any duplicates in the sample you gave. Yes, there are a lot of rows with the same value for department numbers but they all have different from dates. A union filters out duplicate rows, not values. You can have a list of twenty names all with the last name Smith. But Brain Smith and Carl Smith are clearly different names.

工会在产出中产生重复项(MySQL Workbench)

情绪少女 2025-02-17 08:31:37

SyntaxError 发生,因为您使用&gt; = 而没有值之前:
更合适的是:

if (total1, total2)<=10 or (total1, total2)>=90:
    ...

但是,您将获得 typeError ,因为&lt; = tuple 和`in int''之间不支持的情况下不支持

它。清除您要比较什么。
也许您想做这样的事情:

if total1<=10 or total2>=90:
    ...

SyntaxError occurs because you use >= without a value before it:
More proper would be:

if (total1, total2)<=10 or (total1, total2)>=90:
    ...

But then you will get a TypeError because <= not supported between instances of tuple and `int'

It is not clear what are you trying to compare.
Maybe you want to do something like this:

if total1<=10 or total2>=90:
    ...

为什么python如果函数&#xa0;将2个条件合并到一个结果;语法错误中?

情绪少女 2025-02-17 08:11:32

ng02100 错误也可能是掩盖 ng0701 错误,这是“缺失的语言数据数据”错误。您可以使用浏览器的开发人员工具 transform 在StackTrace末端附近调用,并通过在其外部运行违规行, 尝试块。如果提出了 NG0701 错误,请尝试以下解决方案之一:

而帮助,另一个查看

An NG02100 error might also be masking an NG0701 error which is a "missing locale data" error. You can confirm this using the Developer Tools of your browser, by putting a breakpoint in the transform call near the end of the stacktrace, and by running the offending line outside of its try block. If an NG0701 error is raised, try one of these solutions:

  • Either you forgot --localize in ng build --localize
  • or you can see this question for other solutions

If this doesn't help, take another look at all the steps taken in the Angular i18n docs.

Angular中错误NG02100的含义是什么?

情绪少女 2025-02-17 06:25:47

这样做很糟糕。

构造函数应该初始化类。因此,拥有一个函数 init_bomberman 表明您不了解构造函数的用途。该功能应该是构造函数,可能别无其他。

然后,您应该拥有一个运行游戏的函数,让我们称其为运行经常使用:

class BomberMan {
    public:
        void run()
        {
            while (RayLib::ShouldWindowClose()) {
                // game updates things
            }
        }
        BomberMan()
        {
            // init data, load sprites, do things
        }
};

int main ()
{
    try {
        BomberMan().run();
    } catch (std::exception &e) {
        std::cout << e.what() << std::endl;
    }
}

最大的原因,除了错误的样式外,在构造仪中处理构造仪的例外是痛苦。构造函数中班级的其他功能也是可恶的。如果您谨慎,并且仅使用已经初始化的班级等等,则可以做到这一点。保持构造函数简单。最好的构造函数是一个空的构造函数,仅是根本不需要一个。

在成员的构造函数或内联初始化中使用成员初始化列表。

It's pretty bad to do so.

The constructor is supposed to initialize the class. So having a function Init_BomberMan shows that you don't understand what a constructor is for. That function should be the constructor and probably nothing else.

And then you should have a function that runs your game, lets call that run as is so often used:

class BomberMan {
    public:
        void run()
        {
            while (RayLib::ShouldWindowClose()) {
                // game updates things
            }
        }
        BomberMan()
        {
            // init data, load sprites, do things
        }
};

int main ()
{
    try {
        BomberMan().run();
    } catch (std::exception &e) {
        std::cout << e.what() << std::endl;
    }
}

The biggest reason for this, besides bad style, is that exception handling in constructors is a pain. Also calling other functions of the class in the constructor is fishy. You can do that if you are careful and only use members of the class that have already been initialized and such. Keep your constructors simple. The best constructor is an empty one, only topped by not needing one at all.

Use member initialization lists in the constructor or inline initialization of the members.

可以将程序的主循环放入班级的构造函数中吗?

情绪少女 2025-02-17 04:24:48

您可以用 statersProperties 来表达属性或属性集的限制模式;它的值是一个模式,它根据匹配的所有属性的值进行评估。因此,例如,要表达一组以大写字母开头的属性的规则,您可以执行“ pattern properties”:{“^[az]”:{...更多规则在这里... 。要根据完整的模式定义属性名称的规则,您可以使用 propertyNames

为了表达所有属性值的架构,无论名称如何,您都可以使用 fromproperties 。这些规则将与已经与属性匹配的任何属性匹配 statersproperties

您可以使用 minproperties 表达最小数量的属性。

您可以用项目在数组中的所有项目表示规则。 Minitems 可用于表达最小允许数量的项目。

您的数据架构可以通过:

{
  "type": "object",
  "minProperties": 1,
  "additionalProperties": {
    "type": "array",
    "minItems": 1,
    "items": {
      "type": "string"
    }
  }
}

https schema.org/understanding-json-schema/reference/object.html
https://json-schema.org.org.org.org/underting-json-schema/-json-schema/参考/array.html

You can express a restricted pattern for a property or set of properties with patternProperties; its value is a schema, which is evaluated against the values of all properties that match. So for example, to express a set of rules used for properties that start with a capital letter, you can do "patternProperties": { "^[A-Z]": { ... more rules here .... To define the rules for a property name in terms of a full schema, you can use propertyNames.

To express a schema for the value of all properties, regardless of name, you can use additionalProperties. These rules will not match against any property already matched with a properties or patternProperties.

You can express the minimum number of properties with minProperties.

You can express the rules for all items in an array with items. And minItems can be used to express the minimum allowable number of items.

The schema for your data can be expressed by:

{
  "type": "object",
  "minProperties": 1,
  "additionalProperties": {
    "type": "array",
    "minItems": 1,
    "items": {
      "type": "string"
    }
  }
}

https://json-schema.org/understanding-json-schema/reference/object.html
https://json-schema.org/understanding-json-schema/reference/array.html

如何在JSON模式中使用任意属性名称

更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

更多

友情链接

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文