<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>教程 归档 - 初晴神社</title>
	<atom:link href="https://vki.cc/tag/%e6%95%99%e7%a8%8b/feed/" rel="self" type="application/rss+xml" />
	<link>https://vki.cc/tag/教程/</link>
	<description>白露的博客</description>
	<lastBuildDate>Fri, 26 Mar 2021 03:47:57 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://cdn.vki.cc/wp-content/uploads/2018/03/cropped-icemaplen-1-32x32.png</url>
	<title>教程 归档 - 初晴神社</title>
	<link>https://vki.cc/tag/教程/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Unity安卓项目踩坑日记</title>
		<link>https://vki.cc/greattruth/experience/692/</link>
					<comments>https://vki.cc/greattruth/experience/692/#comments</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Tue, 23 Apr 2019 09:38:57 +0000</pubDate>
				<category><![CDATA[咸鱼心得]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[Unity 3D]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[安卓]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[教程]]></category>
		<guid isPermaLink="false">https://bye6.cc/?p=692</guid>

					<description><![CDATA[<p>失踪人口回归~ 最近在研究游戏在安卓平台的打包，遇到了不少坑，特此写个文章记录下~ 1.Unity与安卓的交互 虽然Unity可以直接导出apk安装包，但由于有些方法，比如读取手机相册图片，获取权限等，或者是添加&#8230;</p>
<p><a href="https://vki.cc/greattruth/experience/692/">Unity安卓项目踩坑日记</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p><span style="color: #808080;"><em>失踪人口回归~</em></span></p>
<blockquote><p>最近在研究游戏在安卓平台的打包，遇到了不少坑，特此写个文章记录下~</p></blockquote>
<h2 id="1-unity%e4%b8%8e%e5%ae%89%e5%8d%93%e7%9a%84%e4%ba%a4%e4%ba%92">1.Unity与安卓的交互</h2>
<p>虽然Unity可以直接导出apk安装包，但由于有些方法，比如读取手机相册图片，获取权限等，或者是添加SDK都不能直接通过Unity实现。我们一般用Unity导出安卓工程，再通过Android Studio修改之后打出apk包。</p>
<p>通常情况下每次打包都需要修改，为了偷懒~</p>
<p>这里提供个堪称一劳永逸的解决办法，请看文章~</p>
<p><span style="color: #ff6600;"><a style="color: #ff6600;" href="https://www.jianshu.com/p/86b275da600e" target="_blank" rel="noopener noreferrer">Unity与Android交互方案优化版</a></span></p>
<p><span style="text-decoration: underline;"><a href="https://www.jianshu.com/p/86b275da600e" target="_blank" rel="noopener noreferrer">https://www.jianshu.com/p/86b275da600e</a></span></p>
<h2 id="2-android-aar%e6%96%87%e4%bb%b6%e4%bf%ae%e6%94%b9">2.Android aar文件修改</h2>
<p><span style="color: #808080;"><em>今天刚踩得坑，麻蛋！</em></span></p>
<p>不同于jar包只能包含java代码，aar包还可以保存贴图等资源，相当于一个后缀是aar的压缩包。有时候第三方sdk提供的也是aar文件，当需要修改里面的东西时，比如删掉里面一个jar<strong>。切记不能采取先解压，删除完毕再压缩回去，后缀改成aar的操作。这样修改后Android Studio用不了！！！</strong></p>
<p>正确方法是以解压的形式打开（不是解压压缩包），一般Windows平台的压缩软件都可以，然后在压缩软件里增加或删除文件操作。</p>
<h2 id="3-android-aar%e6%96%87%e4%bb%b6%e8%af%bb%e5%8f%96">3.Android aar文件读取</h2>
<p><span style="color: #808080;"><em>同上，又是个巨坑，匪夷所思！</em></span></p>
<p>我目前的项目在安卓端是这样的，把用到的sdk和需要在安卓端才能调用的方法打成aar包，然后添加到Unity导出的安卓工程里，但是不知道为什么在运行的时候会报以下的错误;</p>
<p><img  fetchpriority="high"  decoding="async"  class="aligncenter size-full wp-image-694"  src="https://cdn.vki.cc/wp-content/uploads/2019/04/QQ20190423-0.jpg"  alt=""  width="661"  height="83"  srcset="https://cdn.vki.cc/wp-content/uploads/2019/04/QQ20190423-0.jpg 661w, https://cdn.vki.cc/wp-content/uploads/2019/04/QQ20190423-0-300x38.jpg 300w"  sizes="(max-width: 661px) 100vw, 661px" ></p>
<p>说的是BGPlayerService类重复，可是我的找遍了真个项目和aar包也只有一个类，根本没有重复的地方。研究了很久都无解，就在准备放弃治疗的时候顺便改了下build.gradle的dependencies里的语句，从</p>
<pre class="pure-highlightjs"><code class="null">dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation project(':localizedappnamelib')
    implementation 'com.android.support:support-core-utils:24.2.0'
    implementation (name:'findingparadiselib-debug',ext:'aar')
}</code></pre>
<p>改成了</p>
<pre class="pure-highlightjs"><code class="null">dependencies {
    implementation (name:'findingparadiselib-debug',ext:'aar')
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation project(':localizedappnamelib')
    implementation 'com.android.support:support-core-utils:24.2.0'
}</code></pre>
<p>然后特么问题解决了！</p>
<p>？？？</p>
<p>我怀疑可能是implementation fileTree(include: [&#8216;*.jar&#8217;], dir: &#8216;libs&#8217;)把aar包里的jar也算进去了_(:з」∠)_</p>
<h2 id="4-%e7%94%9f%e6%88%90%e7%ad%be%e5%90%8d%e5%ae%89%e8%a3%85%e5%8c%85%e7%9a%84%e6%97%b6%e5%80%99%e6%8a%a5%e9%94%99">4.生成签名安装包的时候报错</h2>
<p>在第一次生成签名安装包的时候可能提示缺少xxx.pom（忘了是不是pom后缀了，反正差不多）和xxx.jar组件，这个报错在生成debug包的时候是不出现的。具体原因我不清楚，我猜是打包的时候需要这样依赖包，但是谷歌的官方站点没有（Android Studio提供的链接点进去404）。</p>
<p>两个解决办法，一是手动下载这些依赖包并放到指定的目录中去，不过不建议这样做，一个一个下载再放到指定目录太麻烦了。</p>
<p>第二中解决方法是使用阿里提供的站点，具体操作是将以下的代码方放到安卓工程的build.gradle文件的repositories代码块中去：</p>
<pre class="pure-highlightjs"><code class="null">maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/gradle-plugin' }</code></pre>
<p>这样打包的时候Android Studio会自动去这些站点下载需要的依赖包，问题解决。</p>
<h2 id="5-execution-failed-for-task-appndkbuild">5.Execution failed for task &#8216;:app:ndkBuild&#8217;.</h2>
<p>该问题是在对一个老游戏升级的时候出现的，表现为无法打包，报错：</p>
<pre class="pure-highlightjs"><code class="null">Process 'command 'D:\SDK\***/ndk-build.cmd'' finished with non-zero exit value 2</code></pre>
<p>上网搜索，普遍的解决方式是使用低版本的NDK，又或者是删除src/main/obj文件夹里的内容，尝试无果。</p>
<p>最终发现是build.gradle版本较老，且使用ndkBuild的方式打包，不适用于新版的Android Studio，修改之后问题解决</p>
<p>修改前：</p>
<pre class="pure-highlightjs"><code class="null">android {
    signingConfigs {
    }
    compileSdkVersion 26
    buildToolsVersion '23.0.3'
    defaultConfig {
        applicationId "com.xd.swords.and"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 18
        versionName "1.1.7"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets.main.jni.srcDirs = []
    // disable automatic ndk-build call, which ignore our Android.mk
    sourceSets.main.jniLibs.srcDir 'src/main/libs'
    // call regular ndk-build(.cmd) script from app directory
    task ndkBuild(type: Exec) {
        workingDir file('src/main')
        commandLine getNdkBuildCmd()
    }
    tasks.withType(JavaCompile) {
        compileTask -&gt; compileTask.dependsOn ndkBuild
    }
    task cleanNative(type: Exec) {
        workingDir file('src/main')
        commandLine getNdkBuildCmd(), 'clean'
    }
    clean.dependsOn cleanNative
}</code></pre>
<p>修改后：</p>
<pre class="pure-highlightjs"><code class="null">android {
    signingConfigs {
    }
    compileSdkVersion 26
    buildToolsVersion '23.0.3'
    defaultConfig {
        applicationId "com.xd.swords.and"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 18
        versionName "1.1.7"
        ndk {
            abiFilters 'armeabi-v7a'
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        ndkBuild {
            path "src/main/jni/Android.mk"
        }
    }

    // 下面部分代码应该也可以删掉。
    sourceSets.main.jni.srcDirs = []
    // disable automatic ndk-build call, which ignore our Android.mk
    sourceSets.main.jniLibs.srcDir 'src/main/libs'
    // call regular ndk-build(.cmd) script from app directory
}</code></pre>
<p>对比前后，主要是删除了旧的ndkBuild代码，然后设置abiFilters等。</p>
<p><a href="https://vki.cc/greattruth/experience/692/">Unity安卓项目踩坑日记</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/experience/692/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>免费实现多平台同步管理密码</title>
		<link>https://vki.cc/timershaft/saltedfish/572/</link>
					<comments>https://vki.cc/timershaft/saltedfish/572/#comments</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Wed, 22 Aug 2018 03:35:34 +0000</pubDate>
				<category><![CDATA[十里咸鱼路]]></category>
		<category><![CDATA[密码]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[教程]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=572</guid>

					<description><![CDATA[<p>随着使用的app或网站越来越多，如果管理保存这些密码成了头痛的问题。尽管已经有了比较优秀的密码管理软件，比如1password，lastpass，但是它们都是收费的。不过好在存在开源的密码管理工具，就是这次我要介&#8230;</p>
<p><a href="https://vki.cc/timershaft/saltedfish/572/">免费实现多平台同步管理密码</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>随着使用的app或网站越来越多，如果管理保存这些密码成了头痛的问题。尽管已经有了比较优秀的密码管理软件，比如1password，lastpass，但是它们都是收费的。不过好在存在开源的密码管理工具，就是这次我要介绍的Keepass。先来看下百度百科的介绍：</p>
<blockquote><p>KeePass Password Safe 就是专门为了解决人类记不得众多密码的问题所产生的，它包含了一个强大的密码产生引擎与加密储存机能，能够提供一个安全的密码储存空间。当你开始使用 KeePass Password Safe 时，要先决定一个起始密码。此密码用来辨识你的身份，决定你是否可以使用 KeePass Password Safe 软件，因此千万不要忘了。启动后你就可以开始储存密码，在 KeePass Password Safe 软件中已经有一些预设的密码分类，你可以自己再根据需要建立自己喜欢的密码储存分类。</p></blockquote>
<p>简单的说，keepass就是一个密码记事本，通过唯一的自定义密码来访问它。keepass本身是没有云端服务器的，所以为了实现多平台同步功能我们需要借助<a href="https://www.jianguoyun.com/" target="_blank" rel="noopener"><strong>坚果云</strong></a>来实现。</p>
<h2 id="%e9%a6%96%e5%85%88%e4%b8%8b%e8%bd%bdkeepass%e7%9a%84windows%e5%ae%a2%e6%88%b7%e7%ab%af">首先下载keepass的windows客户端</h2>
[bdbtn]http://cdn.icemaplen.com/KeePass-2.39.1.zip[/bdbtn]
<p><em><span style="color: #808080;">如果是使用的macOS系统的话请到keepass官网下载。_(:з」∠)_</span></em></p>
<p>下载完成后解压，双击打开KeePass.exe，点击左上角File-New创建一个密码库，即后缀为kdbx的文件。这里我起名为icemaplen.kdbx。</p>
<p><img  decoding="async"  class="aligncenter size-full wp-image-575"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822105043.png"  alt=""  width="742"  height="558"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822105043.png 742w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822105043-300x226.png 300w"  sizes="(max-width: 742px) 100vw, 742px" ></p>
<p>然后设置密码库的开启密码，注意这个密码是唯一用来访问密码库的密码，一定要设置的<strong>复杂一点并且牢记</strong>！</p>
<p><em><span style="color: #808080;">我这里为了演示才设置的简单些</span></em></p>
<p>接下来默认下一步就好了。</p>
<p><img  decoding="async"  class="aligncenter size-full wp-image-576"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822105735.png"  alt=""  width="670"  height="488"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822105735.png 670w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822105735-300x219.png 300w"  sizes="(max-width: 670px) 100vw, 670px" ></p>
<p>左边是分组，我们可以自由添加/删除。右边是账号/密码了，也可以自由添加/修改/删除。</p>
<p><span style="color: #808080;"><em>两个示例可以删掉。</em></span></p>
<h2 id="%e6%b7%bb%e5%8a%a0%e5%af%86%e7%a0%81">添加密码</h2>
<p>在右边空白区域右键-Add Entry，然后按需输入。</p>
<p><em><span style="color: #808080;">其中建议必填title，username和password。</span></em></p>
<p><img  loading="lazy"  decoding="async"  class="aligncenter size-full wp-image-577"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822110253.png"  alt=""  width="670"  height="488"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822110253.png 670w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822110253-300x219.png 300w"  sizes="auto, (max-width: 670px) 100vw, 670px" ></p>
<p>点击OK，然后ctrl+s就可以保存到本地了。</p>
<h2 id="%e5%8f%96%e5%87%ba%e5%af%86%e7%a0%81">取出密码</h2>
<p><img  loading="lazy"  decoding="async"  class="aligncenter size-full wp-image-578"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822110643.png"  alt=""  width="670"  height="488"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822110643.png 670w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822110643-300x219.png 300w"  sizes="auto, (max-width: 670px) 100vw, 670px" ></p>
<p>到这一步为止已经初步实现了密码保存功能，但是还不具备多平台同步能力。下一步要将密码文件保存到服务器上。</p>
<h2 id="%e5%9d%9a%e6%9e%9c%e4%ba%91">坚果云</h2>
<p>到<span style="color: #0000ff;"><a style="color: #0000ff;" href="https://www.jianguoyun.com/" target="_blank" rel="noopener">坚果云官网</a><span style="color: #000000;">官网注册一个账号并登陆，新建一个个人同步文件夹，用来存放密码库文件。</span></span></p>
<p><img  loading="lazy"  decoding="async"  class="aligncenter size-full wp-image-579"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822111021.png"  alt=""  width="573"  height="281"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822111021.png 573w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822111021-300x147.png 300w"  sizes="auto, (max-width: 573px) 100vw, 573px" ></p>
<p>创建好之后将上一步保存的kdbx文件（默认保存在我的文档目录下）上传进去。</p>
<p><img  loading="lazy"  decoding="async"  class="aligncenter size-full wp-image-580"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822111441.png"  alt=""  width="978"  height="285"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822111441.png 978w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822111441-300x87.png 300w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822111441-768x224.png 768w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822111441-750x219.png 750w"  sizes="auto, (max-width: 978px) 100vw, 978px" ></p>
<p>然后点击右上角<strong>用户名-账户信息-安全选项-第三方应用管理-添加应用密码</strong></p>
<p><img  loading="lazy"  decoding="async"  class="aligncenter size-full wp-image-581"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822111747.png"  alt=""  width="623"  height="424"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822111747.png 623w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822111747-300x204.png 300w"  sizes="auto, (max-width: 623px) 100vw, 623px" ></p>
<p>点击<strong>生成密码</strong>，会获得一个很长的字符串密码。</p>
<p>然后回到Keepass，点击Tools-Triggers</p>
<p><img  loading="lazy"  decoding="async"  class="aligncenter size-full wp-image-582"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822112124.png"  alt=""  width="662"  height="530"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822112124.png 662w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822112124-300x240.png 300w"  sizes="auto, (max-width: 662px) 100vw, 662px" ></p>
<p>将以下代码复制到剪切板：</p>
<pre class="pure-highlightjs"><code class="null">&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;TriggerCollection xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
	&lt;Triggers&gt;
		&lt;Trigger&gt;
			&lt;Guid&gt;L2euC7Mr/EKh7nPjueuZvQ==&lt;/Guid&gt;
			&lt;Name&gt;SaveSync&lt;/Name&gt;
			&lt;Events&gt;
				&lt;Event&gt;
					&lt;TypeGuid&gt;s6j9/ngTSmqcXdW6hDqbjg==&lt;/TypeGuid&gt;
					&lt;Parameters&gt;
						&lt;Parameter&gt;1&lt;/Parameter&gt;
						&lt;Parameter&gt;kdbx&lt;/Parameter&gt;
					&lt;/Parameters&gt;
				&lt;/Event&gt;
			&lt;/Events&gt;
			&lt;Conditions /&gt;
			&lt;Actions&gt;
				&lt;Action&gt;
					&lt;TypeGuid&gt;tkamn96US7mbrjykfswQ6g==&lt;/TypeGuid&gt;
					&lt;Parameters&gt;
						&lt;Parameter&gt;SaveSync&lt;/Parameter&gt;
						&lt;Parameter&gt;0&lt;/Parameter&gt;
					&lt;/Parameters&gt;
				&lt;/Action&gt;
				&lt;Action&gt;
					&lt;TypeGuid&gt;Iq135Bd4Tu2ZtFcdArOtTQ==&lt;/TypeGuid&gt;
					&lt;Parameters&gt;
						&lt;Parameter&gt;https://dav.jianguoyun.com/dav/keePass/passwordSync.kdbx&lt;/Parameter&gt;
						&lt;Parameter&gt;123456&lt;/Parameter&gt;
						&lt;Parameter&gt;123456&lt;/Parameter&gt;
					&lt;/Parameters&gt;
				&lt;/Action&gt;
				&lt;Action&gt;
					&lt;TypeGuid&gt;tkamn96US7mbrjykfswQ6g==&lt;/TypeGuid&gt;
					&lt;Parameters&gt;
						&lt;Parameter&gt;SaveSync&lt;/Parameter&gt;
						&lt;Parameter&gt;1&lt;/Parameter&gt;
					&lt;/Parameters&gt;
				&lt;/Action&gt;
			&lt;/Actions&gt;
		&lt;/Trigger&gt;
	&lt;/Triggers&gt;
&lt;/TriggerCollection&gt;
	</code></pre>
<p>然后点击左下角<strong>Tools-Paste Triggers From Clipboard，</strong>这样就添加了一个触发器</p>
<p><img  loading="lazy"  decoding="async"  class="aligncenter size-full wp-image-583"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822112902.png"  alt=""  width="690"  height="576"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822112902.png 690w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822112902-300x250.png 300w"  sizes="auto, (max-width: 690px) 100vw, 690px" ></p>
<p>1.双击SaveSync；</p>
<p>2.选择Actions；</p>
<p>3.双击；</p>
<p>4.url：存储在坚果云上的密码库文件的地址；</p>
<p>username：坚果云账户；</p>
<p>password：之前第三方应用管理那里生成的密码；</p>
<p>完成后在主界面上点击<strong>Tools-Options-Advanced</strong>里取消勾选Verify written file after saving a database</p>
<p><img  loading="lazy"  decoding="async"  class="aligncenter size-full wp-image-584"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822113425.png"  alt=""  width="592"  height="439"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/20180822113425.png 592w, https://cdn.vki.cc/wp-content/uploads/2018/08/20180822113425-300x222.png 300w"  sizes="auto, (max-width: 592px) 100vw, 592px" ></p>
<p>完成这一步之后，在点击ctrl+s时就可以自动同步到坚果云服务器了。</p>
<p><img  loading="lazy"  decoding="async"  class="aligncenter size-full wp-image-585"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/201808221106433.png"  alt=""  width="670"  height="488"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/201808221106433.png 670w, https://cdn.vki.cc/wp-content/uploads/2018/08/201808221106433-300x219.png 300w"  sizes="auto, (max-width: 670px) 100vw, 670px" ></p>
<h2 id="%e5%9c%a8ios%e8%ae%be%e5%a4%87%e4%b8%8a%e4%bd%bf%e7%94%a8keepass">在iOS设备上使用keepass</h2>
<p>首先安装<strong>MiniKeePass</strong>和<strong>坚果云</strong>两个app；</p>
<p>打开坚果云并登录，找到上传的kdbx文件，点击<strong>用其他程序打开-拷贝到“MiniKeePass”</strong></p>
<p><img  loading="lazy"  decoding="async"  class="aligncenter wp-image-586 size-medium"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1360-169x300.png"  alt=""  width="169"  height="300"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1360-169x300.png 169w, https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1360-576x1024.png 576w, https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1360.png 750w"  sizes="auto, (max-width: 169px) 100vw, 169px" ></p>
<p><img  loading="lazy"  decoding="async"  class="aligncenter size-medium wp-image-587"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1361-169x300.png"  alt=""  width="169"  height="300"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1361-169x300.png 169w, https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1361-576x1024.png 576w, https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1361.png 750w"  sizes="auto, (max-width: 169px) 100vw, 169px" ></p>
<p>点开输入密码就可以访问了：</p>
<p><img  loading="lazy"  decoding="async"  class="aligncenter size-medium wp-image-588"  src="https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1362-169x300.png"  alt=""  width="169"  height="300"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1362-169x300.png 169w, https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1362-576x1024.png 576w, https://cdn.vki.cc/wp-content/uploads/2018/08/IMG_1362.png 749w"  sizes="auto, (max-width: 169px) 100vw, 169px" ></p>
<p>这里我建议不要在手机上修改，同步很麻烦。而是电脑上修改，手机端只当做查看器。</p>
<p>在电脑上修改并保存之后，手机想跟着同步就重复一下上述步骤就可以了。</p>
<h2 id="%e5%9c%a8android%e8%ae%be%e5%a4%87%e4%b8%8a%e4%bd%bf%e7%94%a8keepass">在android设备上使用keepass</h2>
<p><em><span style="color: #808080;">等我有钱买魅族16了再说</span></em></p>
<p><a href="https://vki.cc/timershaft/saltedfish/572/">免费实现多平台同步管理密码</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/timershaft/saltedfish/572/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>【设计模式】01 &#8211; 单例模式</title>
		<link>https://vki.cc/greattruth/experience/538/</link>
					<comments>https://vki.cc/greattruth/experience/538/#comments</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Sat, 14 Jul 2018 07:20:10 +0000</pubDate>
				<category><![CDATA[咸鱼心得]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[设计模式]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=538</guid>

					<description><![CDATA[<p>[info]单例模式：是一种常用的软件设计模式，在它的核心结构中值包含一个被称为单例的特殊类。一个类只有一个实例，即一个类只有一个对象实例。[/info] 显然单例模式的要点有三个； 某个类只能有一个实例； &#8230;</p>
<p><a href="https://vki.cc/greattruth/experience/538/">【设计模式】01 &#8211; 单例模式</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[[info]<strong>单例模式：</strong>是一种常用的软件设计模式，在它的核心结构中值包含一个被称为单例的特殊类。一个类只有一个实例，即一个类只有一个对象实例。[/info]
<div class="para"><span style="color: #000000;">显然单例模式的要点有三个；</span></div>
<ul>
<li class="para"><span style="color: #000000;">某个类只能有一个实例；</span></li>
<li class="para"><span style="color: #000000;">它必须自行创建这个实例；</span></li>
<li class="para"><span style="color: #000000;">它必须自行向整个系统提供这个实例。</span></li>
</ul>
<div class="para"><span style="color: #000000;">从具体实现角度来说，就是以下三点：</span></div>
<ul>
<li class="para"><span style="color: #000000;">单例模式的类只提供私有的构造函数，</span></li>
<li class="para"><span style="color: #000000;">类定义中含有一个该类的静态私有对象，</span></li>
<li class="para"><span style="color: #000000;">该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。</span></li>
</ul>
<h2 id="%e4%bc%98%e7%bc%ba%e7%82%b9" class="title-text">优缺点</h2>
<div class="para-title level-3">
<h3 id="%e4%bc%98%e7%82%b9" class="title-text"><span style="color: #000000;">优点</span></h3>
</div>
<div class="para"><span style="color: #000000;"><b>一、实例控制</b></span></div>
<div class="para"><span style="color: #000000;">单例模式会阻止其他对象实例化其自己的单例对象的副本，从而确保所有对象都访问唯一实例。</span></div>
<div class="para"><span style="color: #000000;"><b>二、灵活性</b></span></div>
<div class="para"><span style="color: #000000;">因为类控制了实例化过程，所以类可以灵活更改实例化过程。</span></div>
<div class="para-title level-3">
<h3 id="%e7%bc%ba%e7%82%b9" class="title-text"><span style="color: #000000;">缺点</span></h3>
</div>
<div class="para"><span style="color: #000000;"><b>一、开销</b></span></div>
<div class="para"><span style="color: #000000;">虽然数量很少，但如果每次对象请求引用时都要检查是否存在类的实例，将仍然需要一些开销。可以通过使用静态初始化解决此问题。</span></div>
<div class="para"><span style="color: #000000;"><b>二、可能的开发混淆</b></span></div>
<div class="para"><span style="color: #000000;">使用单例对象（尤其在类库中定义的对象）时，开发人员必须记住自己不能使用<b>new</b>关键字实例化对象。因为可能无法访问库源代码，因此应用程序开发人员可能会意外发现自己无法直接实例化此类。</span></div>
<div class="para"><span style="color: #000000;"><b>三、对象生存期</b></span></div>
<div class="para"><span style="color: #000000;">不能解决删除单个对象的问题。在提供内存管理的语言中（例如基于.NET Framework的语言），只有单例类能够导致实例被取消分配，因为它包含对该实例的私有引用。在某些语言中（如 C++），其他类可以删除对象实例，但这样会导致单例类中出现悬浮引用。。</span></div>
<h2 id="%e5%86%99%e6%b3%951%ef%bc%88%e5%8f%aa%e9%80%82%e7%94%a8%e4%ba%8e%e5%8d%95%e7%ba%bf%e7%a8%8b%e7%8e%af%e5%a2%83%ef%bc%89">写法1（只适用于单线程环境）</h2>
<p>由于单例模式只有一个实例，即没有继承，所以一般将其设为sealed。</p>
<p>同时把构造方法设为私有，防止从外部创建，我们可以定义一个静态的实例，在需要的时候创建该实例。</p>
<p>代码如下：</p>
<pre class="pure-highlightjs"><code class="cs">namespace _01_单例模式
{
    sealed class Singleton1
    {
        private static Singleton1 instance;
        private static Singleton1 Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Singleton1();
                }
                return instance;
            }
        }

        private Singleton1()
        {

        }
    }
}</code></pre>
<p>这种写法比较简单，只有在instance为空时才会创建实例，避免了重复创建。</p>
<p><strong>缺点：</strong>该代码在单线程下可以正常工作，但在多线程环境下可能会出现问题。如果存在两个线程同时运行到<code class="cs">if (instance == null)</code> 并且instance还未创建，那么两个线程都会创建一个实例，这样就不再满足单例模式要求了。</p>
<h2 id="%e5%86%99%e6%b3%952%ef%bc%88%e5%8f%af%e4%bb%a5%e5%9c%a8%e5%a4%9a%e7%ba%bf%e7%a8%8b%e4%b8%ad%e6%ad%a3%e5%b8%b8%e5%b7%a5%e4%bd%9c%ef%bc%89">写法2（可以在多线程中正常工作）</h2>
<p>为了解决写法1的缺点，需要加上一个同步锁。写法如下：</p>
<pre class="pure-highlightjs"><code class="cs">namespace _01_单例模式
{
    sealed class Singleton2
    {
        private static object syncObj = new object();

        private static Singleton2 instance;
        private static Singleton2 Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (syncObj)
                    {
                        if (instance == null)
                        {
                            instance = new Singleton2();
                        }
                    }
                }
                return instance;
            }
        }

        private Singleton2()
        {

        }
    }
}</code></pre>
<p>在这个类里面创建了一个object专门用与互斥锁判断，同时用了两个if语句。第一个语句限制只有在instance为空时进行互斥判断，提高了效率。</p>
<p>而第二个if，假如有两个线程同时运行到了<code class="cs">lock (syncObj)</code> ，其中一个线程向下执行，创建instance。创建之后另一个线程继续运行，如果没有第二个if，第二个线程还会创建instance，不符合要求。</p>
<p>该类解决了多线程的问题，不过运用了两个if，依然比较复杂。</p>
<h2 id="%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e5%86%99%e6%b3%953%ef%bc%88%e5%88%a9%e7%94%a8%e9%9d%99%e6%80%81%e6%9e%84%e9%80%a0%e6%96%b9%e6%b3%95%ef%bc%89">【推荐】写法3（利用静态构造方法）</h2>
<p>其实C#中又一个方法能够确保只调用一次，即静态构造方法。所以可以利用这个特点实现单例模式。</p>
<p>代码如下：</p>
<pre class="pure-highlightjs"><code class="cs">namespace _01_单例模式
{
    sealed class Singleton3
    {
        private static Singleton3 instance = new Singleton3();

        public static Singleton3 Instance
        {
            get
            {
                return instance;
            }
        }

        private Singleton3()
        {

        }
    }
}</code></pre>
<p>由于C#是在调用静态构造方法时初始化静态变量，在运行时能确保只调用一次静态构造方法，这样就能保证只初始化一次instance。</p>
<p>不过该方式依然有个小缺点：C#中的静态构造方法并非程序员控制，而是系统自动调用。假如Singleton3中有个静态方法，当我们第一次调用该静态方法时，instance就会被创建。但我们的本意希望调用Singleton3.Instance时创建。所以这个方式可能会过早的创建实例，降低内存使用效率。</p>
<h2 id="%e3%80%90%e6%8e%a8%e8%8d%90%e3%80%91%e5%86%99%e6%b3%954%ef%bc%88%e6%8c%89%e9%9c%80%e5%88%9b%e5%bb%ba%ef%bc%89">【推荐】写法4（按需创建）</h2>
<p>为了优化写法3，我们可以额外利用一个类。写法如下：</p>
<pre class="pure-highlightjs"><code class="cs">namespace _01_单例模式
{
    sealed class Singleton4
    {
        public static Singleton4 Instance
        {
            get
            {
                return Nested.instance;
            }
        }

        class Nested
        {
            internal static readonly Singleton4 instance = new Singleton4();

            static Nested()
            {

            }
        }

        private Singleton4()
        {

        }
    }
}</code></pre>
<p>在Singleton4内部定义了一个私有类型Nested，当我们第一次调用Singleton4.Instance时，会自动调用Nested的静态构造方法创建instance。如果不调用Singleton4.Instance，就不会触发.Net运行时调用Nested，也不会创建实例，这样就做到了按需创建。</p>
<p><a href="https://vki.cc/greattruth/experience/538/">【设计模式】01 &#8211; 单例模式</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/experience/538/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>解决谷歌浏览器字体模糊发虚的问题</title>
		<link>https://vki.cc/timershaft/saltedfish/525/</link>
					<comments>https://vki.cc/timershaft/saltedfish/525/#respond</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Wed, 20 Jun 2018 00:59:30 +0000</pubDate>
				<category><![CDATA[十里咸鱼路]]></category>
		<category><![CDATA[教程]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=525</guid>

					<description><![CDATA[<p>两个插件（需要VPN）： [infobox title=&#8221;扩展程序替换字体的中文部分为雅黑&#8221;]https://chrome.google.com/webstore/detail/替换字体的中文部分为雅黑/[/infobox] [infobox title=&#8221;Font Ren&#8230;</p>
<p><a href="https://vki.cc/timershaft/saltedfish/525/">解决谷歌浏览器字体模糊发虚的问题</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<h2 id="%e4%b8%a4%e4%b8%aa%e6%8f%92%e4%bb%b6%ef%bc%88%e9%9c%80%e8%a6%81vpn%ef%bc%89%ef%bc%9a">两个插件（需要VPN）：</h2>
[infobox title=&#8221;扩展程序替换字体的中文部分为雅黑&#8221;]<span style="text-decoration: underline;"><span style="color: #3366ff;"><a style="color: #3366ff; text-decoration: underline;" href="https://chrome.google.com/webstore/detail/替换字体的中文部分为雅黑/">https://chrome.google.com/webstore/detail/替换字体的中文部分为雅黑/</a></span></span>[/infobox]
[infobox title=&#8221;Font Rendering Enhancer&#8221;]<span style="text-decoration: underline; color: #3366ff;"><a style="color: #3366ff; text-decoration: underline;" href="https://chrome.google.com/webstore/search/font%20rendering%20enhancer">https://chrome.google.com/webstore/search/font%20rendering%20enhancer</a></span>[/infobox]
<p>&nbsp;</p>
<h2 id="%e5%ae%89%e8%a3%85%e5%89%8d%ef%bc%9a">安装前：</h2>
<p><img  loading="lazy"  decoding="async"  class="aligncenter wp-image-528 size-full"  src="https://cdn.vki.cc/wp-content/uploads/2018/06/20180620085747.jpg"  alt=""  width="431"  height="403"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/06/20180620085747.jpg 431w, https://cdn.vki.cc/wp-content/uploads/2018/06/20180620085747-300x281.jpg 300w"  sizes="auto, (max-width: 431px) 100vw, 431px" ></p>
<h2 id="%e5%ae%89%e8%a3%85%e5%90%8e%ef%bc%9a">安装后：</h2>
<p><img  loading="lazy"  decoding="async"  class="aligncenter wp-image-529 size-full"  src="https://cdn.vki.cc/wp-content/uploads/2018/06/20180620085818.jpg"  alt=""  width="406"  height="405"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/06/20180620085818.jpg 406w, https://cdn.vki.cc/wp-content/uploads/2018/06/20180620085818-150x150.jpg 150w, https://cdn.vki.cc/wp-content/uploads/2018/06/20180620085818-300x300.jpg 300w"  sizes="auto, (max-width: 406px) 100vw, 406px" ></p>
<p><a href="https://vki.cc/timershaft/saltedfish/525/">解决谷歌浏览器字体模糊发虚的问题</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/timershaft/saltedfish/525/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CentOS下安装MySQL及相关设置</title>
		<link>https://vki.cc/greattruth/experience/484/</link>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Fri, 13 Apr 2018 01:04:04 +0000</pubDate>
				<category><![CDATA[咸鱼心得]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[教程]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=484</guid>

					<description><![CDATA[<p>系统环境：CentOS 6.8 64位 操作软件：XShell 6 安装MySQL 1.使用yum命令安装 yum install mysql-server -y 看到Complete，执行成功。 2.修改root密码 默认安装mysql后会自动给root用户创建一个密码（貌似是&#8230;</p>
<p><a href="https://vki.cc/greattruth/experience/484/">CentOS下安装MySQL及相关设置</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<div><span style="color: #808080;">系统环境：CentOS 6.8 64位</span></div>
<p><span style="color: #808080;">操作软件：XShell 6</span></p>
<h2 id="%e5%ae%89%e8%a3%85mysql"><span style="color: #000000;">安装MySQL</span></h2>
<div><span style="color: #000000;"><strong>1.使用yum命令安装</strong></span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="null">yum install mysql-server -y</code></span></pre>
</div>
<div><span style="color: #000000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-468"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412144249.jpg"  alt=""  width="454"  height="228"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412144249.jpg 454w, https://cdn.vki.cc/wp-content/uploads/2018/04/20180412144249-300x151.jpg 300w"  sizes="auto, (max-width: 454px) 100vw, 454px" ></span></div>
<div><span style="color: #000000;">看到Complete，执行成功。</span></div>
<div><span style="color: #000000;"><strong>2.修改root密码</strong></span></div>
<div><span style="color: #000000;">默认安装mysql后会自动给root用户创建一个密码（貌似是随机的），所以我们需要修改一下才能登陆。</span></div>
<div><span style="color: #000000;">首先修改mysql设置跳过登陆密码，使用命令</span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="null">vim /etc/my.cnf</code></span></pre>
</div>
<div><span style="color: #000000;">使用这个命令之后会使用vim编辑器打开my.cnf文件，如下图所示</span></div>
<div><strong><span style="color: #ff0000;">注意接下来不要随意按键</span></strong></div>
<div><span style="color: #000000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-469"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/564154849.jpg"  alt=""  width="549"  height="176"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/564154849.jpg 549w, https://cdn.vki.cc/wp-content/uploads/2018/04/564154849-300x96.jpg 300w"  sizes="auto, (max-width: 549px) 100vw, 549px" ></span></div>
<div><span style="color: #000000;">按下[kbd]I[/kbd]键，进入插入模式，在中间添加一句</span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="null">skip-grant-tables</code></span></pre>
</div>
<div><span style="color: #000000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-470"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412144930.jpg"  alt=""  width="511"  height="204"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412144930.jpg 511w, https://cdn.vki.cc/wp-content/uploads/2018/04/20180412144930-300x120.jpg 300w"  sizes="auto, (max-width: 511px) 100vw, 511px" ></span></div>
<div><span style="color: #000000;">然后按下[kbd]Esc[/kbd]键，输入</span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="null">:wq</code></span></pre>
</div>
<div><span style="color: #000000;">回车。</span></div>
<div><span style="color: #000000;">这个的意思是保存并退出。</span></div>
<div><span style="color: #000000;"><strong>3.输入命令</strong></span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="null">service mysqld restart</code></span></pre>
</div>
<div><span style="color: #000000;">重启mysql</span></div>
<div><span style="color: #000000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-471"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412145222.jpg"  alt=""  width="491"  height="71"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412145222.jpg 491w, https://cdn.vki.cc/wp-content/uploads/2018/04/20180412145222-300x43.jpg 300w"  sizes="auto, (max-width: 491px) 100vw, 491px" ></span></div>
<div><span style="color: #000000;"><strong>4.输入命令</strong></span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="null">mysql -u root</code></span></pre>
</div>
<div><span style="color: #000000;">回车进入mysql</span></div>
<div><span style="color: #000000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-472"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412145420.jpg"  alt=""  width="567"  height="124"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412145420.jpg 567w, https://cdn.vki.cc/wp-content/uploads/2018/04/20180412145420-300x66.jpg 300w"  sizes="auto, (max-width: 567px) 100vw, 567px" ></span></div>
<div><span style="color: #000000;"><strong>5.输入命令</strong></span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="sql">USE mysql;
SELECT user,host FROM user;</code></span></pre>
</div>
<div><span style="color: #000000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-473"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412145607.jpg"  alt=""  width="525"  height="294"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412145607.jpg 525w, https://cdn.vki.cc/wp-content/uploads/2018/04/20180412145607-300x168.jpg 300w"  sizes="auto, (max-width: 525px) 100vw, 525px" ></span></div>
<div><span style="color: #000000;">这时可以看到存着mysql用户名和密码的表（没显示密码）</span></div>
<div><span style="color: #000000;">输入命令更改密码</span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="sql">UPDATE user SET password = password ( '新密码' ) WHERE user = 'root' ;</code></span></pre>
</div>
<div><span style="color: #000000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-474"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412150001.jpg"  alt=""  width="529"  height="58"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412150001.jpg 529w, https://cdn.vki.cc/wp-content/uploads/2018/04/20180412150001-300x33.jpg 300w"  sizes="auto, (max-width: 529px) 100vw, 529px" ></span></div>
<div><span style="color: #000000;"><strong>6.加下来打开之前修改过的mysql配置文件，注释掉之前添加的那行命令</strong></span></div>
<div><span style="color: #000000;">步骤同上</span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="null">vim /etc/my.cnf</code></span></pre>
</div>
<div><span style="color: #000000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-475"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412150236.jpg"  alt=""  width="471"  height="195"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412150236.jpg 471w, https://cdn.vki.cc/wp-content/uploads/2018/04/20180412150236-300x124.jpg 300w"  sizes="auto, (max-width: 471px) 100vw, 471px" ></span></div>
<div><span style="color: #000000;"><strong>7.修改后重启mysql</strong></span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="null">service mysqld restart</code></span></pre>
</div>
<div><span style="color: #000000;"><strong>8.使用命令</strong></span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="null">mysql -u root -p</code></span></pre>
</div>
<div><span style="color: #000000;">输入密码就可以使用了。</span></div>
<h2 id="%e8%ae%be%e7%bd%ae%e8%bf%9c%e7%a8%8b%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90"><span style="color: #000000;">设置远程访问权限</span></h2>
<div><span style="color: #000000;">使用以上步骤安装好的mysql还无法远程访问，接下来为其设置远程访问权限</span></div>
<div><span style="color: #000000;">先看一下user表</span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="sql">use mysql; select host,user,password from user;</code></span></pre>
</div>
<div><span style="color: #000000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-476"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412150845.jpg"  alt=""  width="440"  height="179"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412150845.jpg 440w, https://cdn.vki.cc/wp-content/uploads/2018/04/20180412150845-300x122.jpg 300w"  sizes="auto, (max-width: 440px) 100vw, 440px" ></span></div>
<div><span style="color: #000000;">可以看到在user表中已创建的root用户。host字段表示登录的主机，其值可以用IP，也可用主机名，</span></div>
<div><span style="color: #000000;">有时想用本地IP登录，那么可以将以上的Host值改为自己的Ip即可。</span></div>
<div><span style="color: #000000;">接下来使用命令：</span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="sql">grant all privileges on *.* to root@'%' identified by "密码";</code></span></pre>
</div>
<div><span style="color: #000000;">会发现表中新增了一条记录</span></div>
<div><span style="color: #000000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-477"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412151051.jpg"  alt=""  width="482"  height="245"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412151051.jpg 482w, https://cdn.vki.cc/wp-content/uploads/2018/04/20180412151051-300x152.jpg 300w"  sizes="auto, (max-width: 482px) 100vw, 482px" ></span></div>
<div><span style="color: #000000;">这个就是具有远程访问权限的user；</span></div>
<div><span style="color: #000000;">然后退出，使用命令</span></div>
<div>
<pre class="pure-highlightjs"><span style="color: #000000;"><code class="null">service mysqld restart</code></span></pre>
</div>
<div><span style="color: #000000;">重启mysql，就可以啦。</span></div>
<div><span style="color: #000000;"> </span></div>
<div><span style="color: #000000;">测试一下，OK</span></div>
<div><span style="color: #000000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-478"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412151322.jpg"  alt=""  width="402"  height="296"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/20180412151322.jpg 402w, https://cdn.vki.cc/wp-content/uploads/2018/04/20180412151322-300x221.jpg 300w"  sizes="auto, (max-width: 402px) 100vw, 402px" ></span></div>
<h2 id="%e5%88%9b%e5%bb%ba%e7%94%a8%e6%88%b7">创建用户</h2>
<pre class="pure-highlightjs"><code class="sql">CREATE USER '用户名'@'主机' IDENTIFIED BY '密码'; </code></pre>
<p>username &#8211; 你将创建的用户名, host &#8211; 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password &#8211; 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器.</p>
<h2 id="%e6%8e%88%e6%9d%83%e7%94%a8%e6%88%b7">授权用户</h2>
<pre class="pure-highlightjs"><code class="sql">GRANT privileges ON 数据库名.表名TO '用户名'@'主机' </code></pre>
<p>privileges &#8211; 用户的操作权限,如SELECT , INSERT , UPDATE 等(详细列表见该文最后面).如果要授予所的权限则使用ALL.;databasename &#8211; 数据库名,tablename-表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示, 如*.*.</p>
<p><strong>注意:用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令: </strong></p>
<pre class="pure-highlightjs"><code class="sql">GRANT privileges ON 数据库名.表名 TO '用户名'@'主机' WITH GRANT OPTION; </code></pre>
<h2 id="%e8%ae%be%e7%bd%ae%e4%b8%8e%e6%9b%b4%e6%94%b9%e7%94%a8%e6%88%b7%e5%af%86%e7%a0%81"><strong>设置与更改用户密码 </strong></h2>
<pre class="pure-highlightjs"><code class="sql">SET PASSWORD FOR '用户名'@'主机' = PASSWORD('新密码');</code></pre>
<p>如果是当前登陆用户用</p>
<pre class="pure-highlightjs"><code class="sql">SET PASSWORD = PASSWORD("新密码");</code></pre>
<h2 id="%e6%92%a4%e9%94%80%e7%94%a8%e6%88%b7%e6%9d%83%e9%99%90"><strong>撤销用户权限 </strong></h2>
<pre class="pure-highlightjs"><code class="sql">REVOKE privilege ON 数据库名.表名FROM '用户名'@'主机'; </code></pre>
<p>注意: 假如你在给用户&#8217;pig&#8217;@&#8217;%&#8217;授权的时候是这样的(或类似的):GRANT SELECT ON test.user TO &#8216;pig&#8217;@&#8217;%&#8217;, 则在使用REVOKE SELECT ON *.* FROM &#8216;pig&#8217;@&#8217;%&#8217;;命令并不能撤销该用户对test数据库中user表的SELECT 操作.相反,如果授权使用的是GRANT SELECT ON *.* TO &#8216;pig&#8217;@&#8217;%&#8217;;则REVOKE SELECT ON test.user FROM &#8216;pig&#8217;@&#8217;%&#8217;;命令也不能撤销该用户对test数据库中user表的Select 权限.</p>
<h2 id="%e5%88%a0%e9%99%a4%e7%94%a8%e6%88%b7"><strong>删除用户</strong></h2>
<pre class="pure-highlightjs"><code class="sql">DROP USER '用户名'@'主机'; </code></pre>
<p>&nbsp;</p>
<p><!--5f39ae17-8c62-4a45-bc43-b32064c9388a:W3siYmxvY2tJZCI6Ijk4NjYtMTUyMzUxNzgyNjk2MCIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoi57O7Iiwic3R5bGVzIjp7ImNvbG9yIjoiIzgwODA4MCJ9fSx7ImNoYXIiOiLnu58iLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6IueOryIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX0seyJjaGFyIjoi5aKDIiwic3R5bGVzIjp7ImNvbG9yIjoiIzgwODA4MCJ9fSx7ImNoYXIiOiLvvJoiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6IkMiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6ImUiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6Im4iLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6InQiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6Ik8iLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6IlMiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6IjYiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6Ii4iLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6IjgiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6IjYiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6IjQiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6IuS9jSIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiMTI3MS0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLmk40iLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6IuS9nCIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX0seyJjaGFyIjoi6L2vIiwic3R5bGVzIjp7ImNvbG9yIjoiIzgwODA4MCJ9fSx7ImNoYXIiOiLku7YiLCJzdHlsZXMiOnsiY29sb3IiOiIjODA4MDgwIn19LHsiY2hhciI6Iu+8miIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX0seyJjaGFyIjoiWCIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX0seyJjaGFyIjoiUyIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX0seyJjaGFyIjoiaCIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX0seyJjaGFyIjoiZSIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX0seyJjaGFyIjoibCIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX0seyJjaGFyIjoibCIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX0seyJjaGFyIjoiNiIsInN0eWxlcyI6eyJjb2xvciI6IiM4MDgwODAifX1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiNTI0OS0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLlrokiLCJzdHlsZXMiOnsiYm9sZCI6dHJ1ZSwiZm9udC1zaXplIjoyNCwiY29sb3IiOiIjMzMzMzMzIn19LHsiY2hhciI6IuijhSIsInN0eWxlcyI6eyJib2xkIjp0cnVlLCJmb250LXNpemUiOjI0LCJjb2xvciI6IiMzMzMzMzMifX0seyJjaGFyIjoiTSIsInN0eWxlcyI6eyJib2xkIjp0cnVlLCJmb250LXNpemUiOjI0LCJjb2xvciI6IiMzMzMzMzMifX0seyJjaGFyIjoieSIsInN0eWxlcyI6eyJib2xkIjp0cnVlLCJmb250LXNpemUiOjI0LCJjb2xvciI6IiMzMzMzMzMifX0seyJjaGFyIjoiUyIsInN0eWxlcyI6eyJib2xkIjp0cnVlLCJmb250LXNpemUiOjI0LCJjb2xvciI6IiMzMzMzMzMifX0seyJjaGFyIjoiUSIsInN0eWxlcyI6eyJib2xkIjp0cnVlLCJmb250LXNpemUiOjI0LCJjb2xvciI6IiMzMzMzMzMifX0seyJjaGFyIjoiTCIsInN0eWxlcyI6eyJib2xkIjp0cnVlLCJmb250LXNpemUiOjI0LCJjb2xvciI6IiMzMzMzMzMifX1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiNzMzNS0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiIxIn0seyJjaGFyIjoiLiJ9LHsiY2hhciI6IuS9vyJ9LHsiY2hhciI6IueUqCJ9LHsiY2hhciI6InkifSx7ImNoYXIiOiJ1In0seyJjaGFyIjoibSJ9LHsiY2hhciI6IuWRvSJ9LHsiY2hhciI6IuS7pCJ9LHsiY2hhciI6IuWuiSJ9LHsiY2hhciI6IuijhSJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6Ijk2MTEtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoieSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ1Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im0iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJpIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im4iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ0Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImEiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJsIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ5Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJsIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Ii0iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiItIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InkiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiNTExMy0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoiaW1hZ2UiLCJzdHlsZXMiOnsid2lkdGgiOjQ1NCwiaGVpZ2h0IjoyMjgsImFsaWduIjoibGVmdCIsImZsb2F0Ijoibm9uZSJ9LCJ0eXBlIjoiaW1hZ2UiLCJzb3VyY2UiOiIwNTU3OTU4RjkxQzQ0MkI1QkY2QzMxN0YyOTM2NTkzMyIsInRpdGxlIjoiIn0seyJibG9ja0lkIjoiNjM1NS0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLnnIsifSx7ImNoYXIiOiLliLAifSx7ImNoYXIiOiJDIn0seyJjaGFyIjoibyJ9LHsiY2hhciI6Im0ifSx7ImNoYXIiOiJwIn0seyJjaGFyIjoibCJ9LHsiY2hhciI6ImUifSx7ImNoYXIiOiJ0In0seyJjaGFyIjoiZSJ9LHsiY2hhciI6Iu+8jCJ9LHsiY2hhciI6IuaJpyJ9LHsiY2hhciI6IuihjCJ9LHsiY2hhciI6IuaIkCJ9LHsiY2hhciI6IuWKnyJ9LHsiY2hhciI6IuOAgiJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjI0NTYtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoiMiJ9LHsiY2hhciI6Ii4ifSx7ImNoYXIiOiLkv64ifSx7ImNoYXIiOiLmlLkifSx7ImNoYXIiOiJyIn0seyJjaGFyIjoibyJ9LHsiY2hhciI6Im8ifSx7ImNoYXIiOiJ0In0seyJjaGFyIjoi5a+GIn0seyJjaGFyIjoi56CBIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiMzk1MS0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLpu5gifSx7ImNoYXIiOiLorqQifSx7ImNoYXIiOiLlrokifSx7ImNoYXIiOiLoo4UifSx7ImNoYXIiOiJtIn0seyJjaGFyIjoieSJ9LHsiY2hhciI6InMifSx7ImNoYXIiOiJxIn0seyJjaGFyIjoibCJ9LHsiY2hhciI6IuWQjiJ9LHsiY2hhciI6IuS8miJ9LHsiY2hhciI6IuiHqiJ9LHsiY2hhciI6IuWKqCJ9LHsiY2hhciI6Iue7mSJ9LHsiY2hhciI6InIifSx7ImNoYXIiOiJvIn0seyJjaGFyIjoibyJ9LHsiY2hhciI6InQifSx7ImNoYXIiOiLnlKgifSx7ImNoYXIiOiLmiLcifSx7ImNoYXIiOiLliJsifSx7ImNoYXIiOiLlu7oifSx7ImNoYXIiOiLkuIAifSx7ImNoYXIiOiLkuKoifSx7ImNoYXIiOiLlr4YifSx7ImNoYXIiOiLnoIEifSx7ImNoYXIiOiLvvIgifSx7ImNoYXIiOiLosowifSx7ImNoYXIiOiLkvLwifSx7ImNoYXIiOiLmmK8ifSx7ImNoYXIiOiLpmo8ifSx7ImNoYXIiOiLmnLoifSx7ImNoYXIiOiLnmoQifSx7ImNoYXIiOiLvvIkifSx7ImNoYXIiOiLvvIwifSx7ImNoYXIiOiLmiYAifSx7ImNoYXIiOiLku6UifSx7ImNoYXIiOiLmiJEifSx7ImNoYXIiOiLku6wifSx7ImNoYXIiOiLpnIAifSx7ImNoYXIiOiLopoEifSx7ImNoYXIiOiLkv64ifSx7ImNoYXIiOiLmlLkifSx7ImNoYXIiOiLkuIAifSx7ImNoYXIiOiLkuIsifSx7ImNoYXIiOiLmiY0ifSx7ImNoYXIiOiLog70ifSx7ImNoYXIiOiLnmbsifSx7ImNoYXIiOiLpmYYifSx7ImNoYXIiOiLjgIIifV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiI4NjUwLTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjowLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6IummliJ9LHsiY2hhciI6IuWFiCJ9LHsiY2hhciI6IuS/riJ9LHsiY2hhciI6IuaUuSJ9LHsiY2hhciI6Im0ifSx7ImNoYXIiOiJ5In0seyJjaGFyIjoicyJ9LHsiY2hhciI6InEifSx7ImNoYXIiOiJsIn0seyJjaGFyIjoi6K6+In0seyJjaGFyIjoi572uIn0seyJjaGFyIjoi6LezIn0seyJjaGFyIjoi6L+HIn0seyJjaGFyIjoi55m7In0seyJjaGFyIjoi6ZmGIn0seyJjaGFyIjoi5a+GIn0seyJjaGFyIjoi56CBIn0seyJjaGFyIjoi77yMIn0seyJjaGFyIjoi5L2/In0seyJjaGFyIjoi55SoIn0seyJjaGFyIjoi5ZG9In0seyJjaGFyIjoi5LukIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiNzQ5My0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiJ2Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImkiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Ii8iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ0Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiLyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJtIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InkiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiLiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJjIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im4iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiI0NTcyLTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjowLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6IuS9vyJ9LHsiY2hhciI6IueUqCJ9LHsiY2hhciI6Iui/mSJ9LHsiY2hhciI6IuS4qiJ9LHsiY2hhciI6IuWRvSJ9LHsiY2hhciI6IuS7pCJ9LHsiY2hhciI6IuS5iyJ9LHsiY2hhciI6IuWQjiJ9LHsiY2hhciI6IuS8miJ9LHsiY2hhciI6IuS9vyJ9LHsiY2hhciI6IueUqCJ9LHsiY2hhciI6InYifSx7ImNoYXIiOiJpIn0seyJjaGFyIjoibSJ9LHsiY2hhciI6Iue8liJ9LHsiY2hhciI6Iui+kSJ9LHsiY2hhciI6IuWZqCJ9LHsiY2hhciI6IuaJkyJ9LHsiY2hhciI6IuW8gCJ9LHsiY2hhciI6Im0ifSx7ImNoYXIiOiJ5In0seyJjaGFyIjoiLiJ9LHsiY2hhciI6ImMifSx7ImNoYXIiOiJuIn0seyJjaGFyIjoiZiJ9LHsiY2hhciI6IuaWhyJ9LHsiY2hhciI6IuS7tiJ9LHsiY2hhciI6Iu+8jCJ9LHsiY2hhciI6IuWmgiJ9LHsiY2hhciI6IuS4iyJ9LHsiY2hhciI6IuWbviJ9LHsiY2hhciI6IuaJgCJ9LHsiY2hhciI6IuekuiJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjQwOTUtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoi5rOoIiwic3R5bGVzIjp7ImNvbG9yIjoiI2ZmMDAwMCJ9fSx7ImNoYXIiOiLmhI8iLCJzdHlsZXMiOnsiY29sb3IiOiIjZmYwMDAwIn19LHsiY2hhciI6IuaOpSIsInN0eWxlcyI6eyJjb2xvciI6IiNmZjAwMDAifX0seyJjaGFyIjoi5LiLIiwic3R5bGVzIjp7ImNvbG9yIjoiI2ZmMDAwMCJ9fSx7ImNoYXIiOiLmnaUiLCJzdHlsZXMiOnsiY29sb3IiOiIjZmYwMDAwIn19LHsiY2hhciI6IuS4jSIsInN0eWxlcyI6eyJjb2xvciI6IiNmZjAwMDAifX0seyJjaGFyIjoi6KaBIiwic3R5bGVzIjp7ImNvbG9yIjoiI2ZmMDAwMCJ9fSx7ImNoYXIiOiLpmo8iLCJzdHlsZXMiOnsiY29sb3IiOiIjZmYwMDAwIn19LHsiY2hhciI6IuaEjyIsInN0eWxlcyI6eyJjb2xvciI6IiNmZjAwMDAifX0seyJjaGFyIjoi5oyJIiwic3R5bGVzIjp7ImNvbG9yIjoiI2ZmMDAwMCJ9fSx7ImNoYXIiOiLplK4iLCJzdHlsZXMiOnsiY29sb3IiOiIjZmYwMDAwIn19XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjIwNDAtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6ImltYWdlIiwic3R5bGVzIjp7IndpZHRoIjo1NDksImhlaWdodCI6MTc2LCJhbGlnbiI6ImxlZnQiLCJmbG9hdCI6Im5vbmUifSwidHlwZSI6ImltYWdlIiwic291cmNlIjoiNEREMzcwMEM2RTBFNDIxNUJEMzdCM0VGODNGNTlFRjYiLCJ0aXRsZSI6IiJ9LHsiYmxvY2tJZCI6IjQwOTQtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoi5oyJIn0seyJjaGFyIjoi5LiLIn0seyJjaGFyIjoiWyJ9LHsiY2hhciI6ImsifSx7ImNoYXIiOiJiIn0seyJjaGFyIjoiZCJ9LHsiY2hhciI6Il0ifSx7ImNoYXIiOiJJIn0seyJjaGFyIjoiWyJ9LHsiY2hhciI6Ii8ifSx7ImNoYXIiOiJrIn0seyJjaGFyIjoiYiJ9LHsiY2hhciI6ImQifSx7ImNoYXIiOiJdIn0seyJjaGFyIjoi6ZSuIn0seyJjaGFyIjoi77yMIn0seyJjaGFyIjoi6L+bIn0seyJjaGFyIjoi5YWlIn0seyJjaGFyIjoi5o+SIn0seyJjaGFyIjoi5YWlIn0seyJjaGFyIjoi5qihIn0seyJjaGFyIjoi5byPIn0seyJjaGFyIjoi77yMIn0seyJjaGFyIjoi5ZyoIn0seyJjaGFyIjoi5LitIn0seyJjaGFyIjoi6Ze0In0seyJjaGFyIjoi5re7In0seyJjaGFyIjoi5YqgIn0seyJjaGFyIjoi5LiAIn0seyJjaGFyIjoi5Y+lIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiNTc4Mi0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImsiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiaSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJwIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Ii0iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImEiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ0Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Ii0iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJhIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiMTczMC0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoiaW1hZ2UiLCJzdHlsZXMiOnsid2lkdGgiOjUxMSwiaGVpZ2h0IjoyMDQsImFsaWduIjoibGVmdCIsImZsb2F0Ijoibm9uZSJ9LCJ0eXBlIjoiaW1hZ2UiLCJzb3VyY2UiOiI3QTBDMDAyQTlEQ0M0OTBGQjNGMkQ3ODFEQThEODRCNyIsInRpdGxlIjoiIn0seyJibG9ja0lkIjoiODc5NC0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLnhLYifSx7ImNoYXIiOiLlkI4ifSx7ImNoYXIiOiLmjIkifSx7ImNoYXIiOiLkuIsifSx7ImNoYXIiOiJbIn0seyJjaGFyIjoiayJ9LHsiY2hhciI6ImIifSx7ImNoYXIiOiJkIn0seyJjaGFyIjoiXSJ9LHsiY2hhciI6IkUifSx7ImNoYXIiOiJzIn0seyJjaGFyIjoiYyJ9LHsiY2hhciI6IlsifSx7ImNoYXIiOiIvIn0seyJjaGFyIjoiayJ9LHsiY2hhciI6ImIifSx7ImNoYXIiOiJkIn0seyJjaGFyIjoiXSJ9LHsiY2hhciI6IumUriJ9LHsiY2hhciI6Iu+8jCJ9LHsiY2hhciI6Iui+kyJ9LHsiY2hhciI6IuWFpSJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjI1NzMtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoiOiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ3Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InEiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiOTc4MS0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLlm54ifSx7ImNoYXIiOiLovaYifSx7ImNoYXIiOiLjgIIifV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiIzMDkxLTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiaW5kZW50IjoxLCJhbGlnbiI6ImxlZnQiLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6Iui/mSJ9LHsiY2hhciI6IuS4qiJ9LHsiY2hhciI6IueahCJ9LHsiY2hhciI6IuaEjyJ9LHsiY2hhciI6IuaAnSJ9LHsiY2hhciI6IuaYryJ9LHsiY2hhciI6IuS/nSJ9LHsiY2hhciI6IuWtmCJ9LHsiY2hhciI6IuW5tiJ9LHsiY2hhciI6IumAgCJ9LHsiY2hhciI6IuWHuiJ9LHsiY2hhciI6IuOAgiJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjI2ODAtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoiMyJ9LHsiY2hhciI6Ii4ifSx7ImNoYXIiOiLovpMifSx7ImNoYXIiOiLlhaUifSx7ImNoYXIiOiLlkb0ifSx7ImNoYXIiOiLku6QifV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiIyNDAwLTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjowLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6InMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InYiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiaSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJjIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJtIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InkiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJxIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImwiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InQiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiYSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InQiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiOTE0Ny0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLph40ifSx7ImNoYXIiOiLlkK8ifSx7ImNoYXIiOiJtIn0seyJjaGFyIjoieSJ9LHsiY2hhciI6InMifSx7ImNoYXIiOiJxIn0seyJjaGFyIjoibCJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjUwODctMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6ImltYWdlIiwic3R5bGVzIjp7IndpZHRoIjo0OTEsImhlaWdodCI6NzEsImFsaWduIjoibGVmdCIsImZsb2F0Ijoibm9uZSJ9LCJ0eXBlIjoiaW1hZ2UiLCJzb3VyY2UiOiIzOTRGNDBEQjBFNkM0NEJDQTY1OUI1N0M0NEIyNURDNyIsInRpdGxlIjoiIn0seyJibG9ja0lkIjoiNDI4MS0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiI0In0seyJjaGFyIjoiLiJ9LHsiY2hhciI6Iui+kyJ9LHsiY2hhciI6IuWFpSJ9LHsiY2hhciI6IuWRvSJ9LHsiY2hhciI6IuS7pCJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjEwNDYtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoibSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ5Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJsIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiLSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ1Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiciIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJvIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im8iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiIxNTUwLTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjowLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6IuWbniJ9LHsiY2hhciI6Iui9piJ9LHsiY2hhciI6Iui/myJ9LHsiY2hhciI6IuWFpSJ9LHsiY2hhciI6Im0ifSx7ImNoYXIiOiJ5In0seyJjaGFyIjoicyJ9LHsiY2hhciI6InEifSx7ImNoYXIiOiJsIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiMTkxNC0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoiaW1hZ2UiLCJzdHlsZXMiOnsid2lkdGgiOjU2NywiaGVpZ2h0IjoxMjQsImFsaWduIjoibGVmdCIsImZsb2F0Ijoibm9uZSJ9LCJ0eXBlIjoiaW1hZ2UiLCJzb3VyY2UiOiJERDkxRUI0NzY4MzE0NUVBOTg1QUQ2NkY5ODAzQTgwQyIsInRpdGxlIjoiIn0seyJibG9ja0lkIjoiMTA4MC0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiI1In0seyJjaGFyIjoiLiJ9LHsiY2hhciI6Iui+kyJ9LHsiY2hhciI6IuWFpSJ9LHsiY2hhciI6IuWRvSJ9LHsiY2hhciI6IuS7pCJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjIxNjQtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoiVSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJTIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IkUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJtIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InkiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJxIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImwiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiOyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiIwMDE3LTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjowLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6IlMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiRSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJMIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IkUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiQyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJUIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiciIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIsIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImgiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InQiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJGIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IlIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiTyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJNIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiciIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiI7Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjExMzAtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6ImltYWdlIiwic3R5bGVzIjp7IndpZHRoIjo1MjUsImhlaWdodCI6Mjk0LCJhbGlnbiI6ImxlZnQiLCJmbG9hdCI6Im5vbmUifSwidHlwZSI6ImltYWdlIiwic291cmNlIjoiOTdDMzI2NDNDRENCNDJDOEFEMkZCQTU3RUE3REE5OEUiLCJ0aXRsZSI6IiJ9LHsiYmxvY2tJZCI6IjIyNjctMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoi6L+ZIn0seyJjaGFyIjoi5pe2In0seyJjaGFyIjoi5Y+vIn0seyJjaGFyIjoi5LulIn0seyJjaGFyIjoi55yLIn0seyJjaGFyIjoi5YiwIn0seyJjaGFyIjoi5a2YIn0seyJjaGFyIjoi552AIn0seyJjaGFyIjoibSJ9LHsiY2hhciI6InkifSx7ImNoYXIiOiJzIn0seyJjaGFyIjoicSJ9LHsiY2hhciI6ImwifSx7ImNoYXIiOiLnlKgifSx7ImNoYXIiOiLmiLcifSx7ImNoYXIiOiLlkI0ifSx7ImNoYXIiOiLlkowifSx7ImNoYXIiOiLlr4YifSx7ImNoYXIiOiLnoIEifSx7ImNoYXIiOiLnmoQifSx7ImNoYXIiOiLooagifSx7ImNoYXIiOiLvvIgifSx7ImNoYXIiOiLmsqEifSx7ImNoYXIiOiLmmL4ifSx7ImNoYXIiOiLnpLoifSx7ImNoYXIiOiLlr4YifSx7ImNoYXIiOiLnoIEifSx7ImNoYXIiOiLvvIkifV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiI5ODM3LTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjowLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6Iui+kyJ9LHsiY2hhciI6IuWFpSJ9LHsiY2hhciI6IuWRvSJ9LHsiY2hhciI6IuS7pCJ9LHsiY2hhciI6IuabtCJ9LHsiY2hhciI6IuaUuSJ9LHsiY2hhciI6IuWvhiJ9LHsiY2hhciI6IueggSJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjY0ODQtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJVIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IlAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiRCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJBIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IlQiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiRSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJTIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IkUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiVCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiYSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJvIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Ij0iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJwIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImEiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InciLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImQiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIoIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiJyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiLmlrAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoi5a+GIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IueggSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiInIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiKSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IlciLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiSCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJFIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IlIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiRSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiI9Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiJyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im8iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ0Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiciLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiI7Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjM3NDktMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6ImltYWdlIiwic3R5bGVzIjp7IndpZHRoIjo1MjksImhlaWdodCI6NTgsImFsaWduIjoibGVmdCIsImZsb2F0Ijoibm9uZSJ9LCJ0eXBlIjoiaW1hZ2UiLCJzb3VyY2UiOiI2NzZFNTc1QzU3MTg0MTUxODNCOTg5RkVDNzkyOTg2NyIsInRpdGxlIjoiIn0seyJibG9ja0lkIjoiOTE2My0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiI2In0seyJjaGFyIjoiLiJ9LHsiY2hhciI6IuWKoCJ9LHsiY2hhciI6IuS4iyJ9LHsiY2hhciI6IuadpSJ9LHsiY2hhciI6IuaJkyJ9LHsiY2hhciI6IuW8gCJ9LHsiY2hhciI6IuS5iyJ9LHsiY2hhciI6IuWJjSJ9LHsiY2hhciI6IuS/riJ9LHsiY2hhciI6IuaUuSJ9LHsiY2hhciI6Iui/hyJ9LHsiY2hhciI6IueahCJ9LHsiY2hhciI6Im0ifSx7ImNoYXIiOiJ5In0seyJjaGFyIjoicyJ9LHsiY2hhciI6InEifSx7ImNoYXIiOiJsIn0seyJjaGFyIjoi6YWNIn0seyJjaGFyIjoi572uIn0seyJjaGFyIjoi5paHIn0seyJjaGFyIjoi5Lu2In0seyJjaGFyIjoi77yMIn0seyJjaGFyIjoi5rOoIn0seyJjaGFyIjoi6YeKIn0seyJjaGFyIjoi5o6JIn0seyJjaGFyIjoi5LmLIn0seyJjaGFyIjoi5YmNIn0seyJjaGFyIjoi5re7In0seyJjaGFyIjoi5YqgIn0seyJjaGFyIjoi55qEIn0seyJjaGFyIjoi6YKjIn0seyJjaGFyIjoi6KGMIn0seyJjaGFyIjoi5ZG9In0seyJjaGFyIjoi5LukIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiMTgzNy0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLmraUifSx7ImNoYXIiOiLpqqQifSx7ImNoYXIiOiLlkIwifSx7ImNoYXIiOiLkuIoifV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiI2NzI1LTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjowLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6InYiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiaSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJtIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiLyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InQiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiYyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIvIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im0iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoieSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIuIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJmIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6Ijk5NzgtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6ImltYWdlIiwic3R5bGVzIjp7IndpZHRoIjo0NzEsImhlaWdodCI6MTk1LCJhbGlnbiI6ImxlZnQiLCJmbG9hdCI6Im5vbmUifSwidHlwZSI6ImltYWdlIiwic291cmNlIjoiMzhCODg4RUE0NEJENEQ3OEE2NzZBNjQ0OEIzRDdCNjAiLCJ0aXRsZSI6IiJ9LHsiYmxvY2tJZCI6IjY3ODgtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoiNyJ9LHsiY2hhciI6Ii4ifSx7ImNoYXIiOiLkv64ifSx7ImNoYXIiOiLmlLkifSx7ImNoYXIiOiLlkI4ifSx7ImNoYXIiOiLph40ifSx7ImNoYXIiOiLlkK8ifSx7ImNoYXIiOiJtIn0seyJjaGFyIjoieSJ9LHsiY2hhciI6InMifSx7ImNoYXIiOiJxIn0seyJjaGFyIjoibCJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjYyMjgtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJpIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im0iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoieSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InEiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJkIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiciIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJhIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiI1MzgwLTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjowLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6IjgifSx7ImNoYXIiOiIuIn0seyJjaGFyIjoi5L2/In0seyJjaGFyIjoi55SoIn0seyJjaGFyIjoi5ZG9In0seyJjaGFyIjoi5LukIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiNTA2OC0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiJtIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InkiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJxIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImwiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiItIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im8iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ0Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiLSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJwIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6Ijg0MjQtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoi6L6TIn0seyJjaGFyIjoi5YWlIn0seyJjaGFyIjoi5a+GIn0seyJjaGFyIjoi56CBIn0seyJjaGFyIjoi5bCxIn0seyJjaGFyIjoi5Y+vIn0seyJjaGFyIjoi5LulIn0seyJjaGFyIjoi5L2/In0seyJjaGFyIjoi55SoIn0seyJjaGFyIjoi5LqGIn0seyJjaGFyIjoi44CCIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiNjU3Ny0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLorr4iLCJzdHlsZXMiOnsiYm9sZCI6dHJ1ZSwiZm9udC1zaXplIjoyNH19LHsiY2hhciI6Iue9riIsInN0eWxlcyI6eyJib2xkIjp0cnVlLCJmb250LXNpemUiOjI0fX0seyJjaGFyIjoi6L+cIiwic3R5bGVzIjp7ImJvbGQiOnRydWUsImZvbnQtc2l6ZSI6MjR9fSx7ImNoYXIiOiLnqIsiLCJzdHlsZXMiOnsiYm9sZCI6dHJ1ZSwiZm9udC1zaXplIjoyNH19LHsiY2hhciI6IuiuvyIsInN0eWxlcyI6eyJib2xkIjp0cnVlLCJmb250LXNpemUiOjI0fX0seyJjaGFyIjoi6ZeuIiwic3R5bGVzIjp7ImJvbGQiOnRydWUsImZvbnQtc2l6ZSI6MjR9fSx7ImNoYXIiOiLmnYMiLCJzdHlsZXMiOnsiYm9sZCI6dHJ1ZSwiZm9udC1zaXplIjoyNH19LHsiY2hhciI6IumZkCIsInN0eWxlcyI6eyJib2xkIjp0cnVlLCJmb250LXNpemUiOjI0fX1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiMjc1MC0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLkvb8ifSx7ImNoYXIiOiLnlKgifSx7ImNoYXIiOiLku6UifSx7ImNoYXIiOiLkuIoifSx7ImNoYXIiOiLmraUifSx7ImNoYXIiOiLpqqQifSx7ImNoYXIiOiLlrokifSx7ImNoYXIiOiLoo4UifSx7ImNoYXIiOiLlpb0ifSx7ImNoYXIiOiLnmoQifSx7ImNoYXIiOiJtIn0seyJjaGFyIjoieSJ9LHsiY2hhciI6InMifSx7ImNoYXIiOiJxIn0seyJjaGFyIjoibCJ9LHsiY2hhciI6Iui/mCJ9LHsiY2hhciI6IuaXoCJ9LHsiY2hhciI6IuazlSJ9LHsiY2hhciI6Iui/nCJ9LHsiY2hhciI6IueoiyJ9LHsiY2hhciI6IuiuvyJ9LHsiY2hhciI6IumXriJ9LHsiY2hhciI6Iu+8jCJ9LHsiY2hhciI6IuaOpSJ9LHsiY2hhciI6IuS4iyJ9LHsiY2hhciI6IuadpSJ9LHsiY2hhciI6IuS4uiJ9LHsiY2hhciI6IuWFtiJ9LHsiY2hhciI6IuiuviJ9LHsiY2hhciI6Iue9riJ9LHsiY2hhciI6Iui/nCJ9LHsiY2hhciI6IueoiyJ9LHsiY2hhciI6IuiuvyJ9LHsiY2hhciI6IumXriJ9LHsiY2hhciI6IuadgyJ9LHsiY2hhciI6IumZkCJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjY1MTEtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoi5YWIIn0seyJjaGFyIjoi55yLIn0seyJjaGFyIjoi5LiAIn0seyJjaGFyIjoi5LiLIn0seyJjaGFyIjoidSJ9LHsiY2hhciI6InMifSx7ImNoYXIiOiJlIn0seyJjaGFyIjoiciJ9LHsiY2hhciI6IuihqCJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjM4MzctMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoidSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJtIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InkiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJxIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImwiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiOyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJcbiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImgiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InQiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiLCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ1Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiwiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJhIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ3Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im8iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiciIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJkIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im8iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJlIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiOyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiI1Mjg4LTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJpbWFnZSIsInN0eWxlcyI6eyJ3aWR0aCI6NDQwLCJoZWlnaHQiOjE3OSwiYWxpZ24iOiJsZWZ0IiwiZmxvYXQiOiJub25lIn0sInR5cGUiOiJpbWFnZSIsInNvdXJjZSI6IkQ2MDY5OEMxNzZDNjQ2MTA5MzAyNUREQzIwNzA5Njg0IiwidGl0bGUiOiIifSx7ImJsb2NrSWQiOiIxOTg3LTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjowLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6IuWPryJ9LHsiY2hhciI6IuS7pSJ9LHsiY2hhciI6IueciyJ9LHsiY2hhciI6IuWIsCJ9LHsiY2hhciI6IuWcqCJ9LHsiY2hhciI6InUifSx7ImNoYXIiOiJzIn0seyJjaGFyIjoiZSJ9LHsiY2hhciI6InIifSx7ImNoYXIiOiLooagifSx7ImNoYXIiOiLkuK0ifSx7ImNoYXIiOiLlt7IifSx7ImNoYXIiOiLliJsifSx7ImNoYXIiOiLlu7oifSx7ImNoYXIiOiLnmoQifSx7ImNoYXIiOiJyIn0seyJjaGFyIjoibyJ9LHsiY2hhciI6Im8ifSx7ImNoYXIiOiJ0In0seyJjaGFyIjoi55SoIn0seyJjaGFyIjoi5oi3In0seyJjaGFyIjoi44CCIn0seyJjaGFyIjoiaCJ9LHsiY2hhciI6Im8ifSx7ImNoYXIiOiJzIn0seyJjaGFyIjoidCJ9LHsiY2hhciI6IuWtlyJ9LHsiY2hhciI6IuautSJ9LHsiY2hhciI6IuihqCJ9LHsiY2hhciI6IuekuiJ9LHsiY2hhciI6IueZuyJ9LHsiY2hhciI6IuW9lSJ9LHsiY2hhciI6IueahCJ9LHsiY2hhciI6IuS4uyJ9LHsiY2hhciI6IuacuiJ9LHsiY2hhciI6Iu+8jCJ9LHsiY2hhciI6IuWFtiJ9LHsiY2hhciI6IuWAvCJ9LHsiY2hhciI6IuWPryJ9LHsiY2hhciI6IuS7pSJ9LHsiY2hhciI6IueUqCJ9LHsiY2hhciI6IkkifSx7ImNoYXIiOiJQIn0seyJjaGFyIjoi77yMIn0seyJjaGFyIjoi5LmfIn0seyJjaGFyIjoi5Y+vIn0seyJjaGFyIjoi55SoIn0seyJjaGFyIjoi5Li7In0seyJjaGFyIjoi5py6In0seyJjaGFyIjoi5ZCNIn0seyJjaGFyIjoi77yMIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiNzI0Mi0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLmnIkifSx7ImNoYXIiOiLml7YifSx7ImNoYXIiOiLmg7MifSx7ImNoYXIiOiLnlKgifSx7ImNoYXIiOiLmnKwifSx7ImNoYXIiOiLlnLAifSx7ImNoYXIiOiJJIn0seyJjaGFyIjoiUCJ9LHsiY2hhciI6IueZuyJ9LHsiY2hhciI6IuW9lSJ9LHsiY2hhciI6Iu+8jCJ9LHsiY2hhciI6IumCoyJ9LHsiY2hhciI6IuS5iCJ9LHsiY2hhciI6IuWPryJ9LHsiY2hhciI6IuS7pSJ9LHsiY2hhciI6IuWwhiJ9LHsiY2hhciI6IuS7pSJ9LHsiY2hhciI6IuS4iiJ9LHsiY2hhciI6IueahCJ9LHsiY2hhciI6IkgifSx7ImNoYXIiOiJvIn0seyJjaGFyIjoicyJ9LHsiY2hhciI6InQifSx7ImNoYXIiOiLlgLwifSx7ImNoYXIiOiLmlLkifSx7ImNoYXIiOiLkuLoifSx7ImNoYXIiOiLoh6oifSx7ImNoYXIiOiLlt7EifSx7ImNoYXIiOiLnmoQifSx7ImNoYXIiOiJJIn0seyJjaGFyIjoicCJ9LHsiY2hhciI6IuWNsyJ9LHsiY2hhciI6IuWPryJ9LHsiY2hhciI6IuOAgiJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjgwNjktMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoi5o6lIn0seyJjaGFyIjoi5LiLIn0seyJjaGFyIjoi5p2lIn0seyJjaGFyIjoi5L2/In0seyJjaGFyIjoi55SoIn0seyJjaGFyIjoi5ZG9In0seyJjaGFyIjoi5LukIn0seyJjaGFyIjoi77yaIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiMTg2Ny0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImciLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiciIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJhIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im4iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImEiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJsIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImkiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoidiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJpIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImwiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJnIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJuIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiKiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIuIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IioiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ0Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im8iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6Im8iLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoibyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ0Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IkAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiJyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIlIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiciLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJpIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImQiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJuIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InQiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiaSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJmIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImkiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJkIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiYiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJ5Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IiAiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiXCIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoi5a+GIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6IueggSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJcIiIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiI7Iiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjUwNTEtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoi5LyaIn0seyJjaGFyIjoi5Y+RIn0seyJjaGFyIjoi546wIn0seyJjaGFyIjoi6KGoIn0seyJjaGFyIjoi5LitIn0seyJjaGFyIjoi5pawIn0seyJjaGFyIjoi5aKeIn0seyJjaGFyIjoi5LqGIn0seyJjaGFyIjoi5LiAIn0seyJjaGFyIjoi5p2hIn0seyJjaGFyIjoi6K6wIn0seyJjaGFyIjoi5b2VIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiODk2NS0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoiaW1hZ2UiLCJzdHlsZXMiOnsid2lkdGgiOjQ4MiwiaGVpZ2h0IjoyNDUsImFsaWduIjoibGVmdCIsImZsb2F0Ijoibm9uZSJ9LCJ0eXBlIjoiaW1hZ2UiLCJzb3VyY2UiOiI0NzY0RjQ5NTFDMEE0Q0MzQjRBQzYxRjU3MTM4RUYzQSIsInRpdGxlIjoiIn0seyJibG9ja0lkIjoiMjQ5Ny0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLov5kifSx7ImNoYXIiOiLkuKoifSx7ImNoYXIiOiLlsLEifSx7ImNoYXIiOiLmmK8ifSx7ImNoYXIiOiLlhbcifSx7ImNoYXIiOiLmnIkifSx7ImNoYXIiOiLov5wifSx7ImNoYXIiOiLnqIsifSx7ImNoYXIiOiLorr8ifSx7ImNoYXIiOiLpl64ifSx7ImNoYXIiOiLmnYMifSx7ImNoYXIiOiLpmZAifSx7ImNoYXIiOiLnmoQifSx7ImNoYXIiOiJ1In0seyJjaGFyIjoicyJ9LHsiY2hhciI6ImUifSx7ImNoYXIiOiJyIn0seyJjaGFyIjoi77ybIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiNDkwMC0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLnhLYifSx7ImNoYXIiOiLlkI4ifSx7ImNoYXIiOiLpgIAifSx7ImNoYXIiOiLlh7oifSx7ImNoYXIiOiLvvIwifSx7ImNoYXIiOiLkvb8ifSx7ImNoYXIiOiLnlKgifSx7ImNoYXIiOiLlkb0ifSx7ImNoYXIiOiLku6QifV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiI4MDcyLTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjowLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6InMiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InYiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiaSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJjIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImUiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiICIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJtIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InkiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoicyIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJxIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6ImwiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZCIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiIgIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InIiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiZSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJzIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InQiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX0seyJjaGFyIjoiYSIsInN0eWxlcyI6eyJmb250LWZhbWlseSI6Im1vbm9zcGFjZSJ9fSx7ImNoYXIiOiJyIiwic3R5bGVzIjp7ImZvbnQtZmFtaWx5IjoibW9ub3NwYWNlIn19LHsiY2hhciI6InQiLCJzdHlsZXMiOnsiZm9udC1mYW1pbHkiOiJtb25vc3BhY2UifX1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiOTAxMC0xNTIzNTE3ODI3Njc3IiwiYmxvY2tUeXBlIjoicGFyYWdyYXBoIiwic3R5bGVzIjp7ImFsaWduIjoibGVmdCIsImluZGVudCI6MCwidGV4dC1pbmRlbnQiOjAsImxpbmUtaGVpZ2h0IjoxLjc1fSwidHlwZSI6InBhcmFncmFwaCIsInJpY2hUZXh0Ijp7ImRhdGEiOlt7ImNoYXIiOiLph40ifSx7ImNoYXIiOiLlkK8ifSx7ImNoYXIiOiJtIn0seyJjaGFyIjoieSJ9LHsiY2hhciI6InMifSx7ImNoYXIiOiJxIn0seyJjaGFyIjoibCJ9LHsiY2hhciI6Iu+8jCJ9LHsiY2hhciI6IuWwsSJ9LHsiY2hhciI6IuWPryJ9LHsiY2hhciI6IuS7pSJ9LHsiY2hhciI6IuWVpiJ9LHsiY2hhciI6IuOAgiJ9XSwiaXNSaWNoVGV4dCI6dHJ1ZSwia2VlcExpbmVCcmVhayI6dHJ1ZX19LHsiYmxvY2tJZCI6IjIwMzQtMTUyMzUxNzgyNzY3NyIsImJsb2NrVHlwZSI6InBhcmFncmFwaCIsInN0eWxlcyI6eyJhbGlnbiI6ImxlZnQiLCJpbmRlbnQiOjAsInRleHQtaW5kZW50IjowLCJsaW5lLWhlaWdodCI6MS43NX0sInR5cGUiOiJwYXJhZ3JhcGgiLCJyaWNoVGV4dCI6eyJkYXRhIjpbeyJjaGFyIjoiwqAifV0sImlzUmljaFRleHQiOnRydWUsImtlZXBMaW5lQnJlYWsiOnRydWV9fSx7ImJsb2NrSWQiOiIyNDk2LTE1MjM1MTc4Mjc2NzciLCJibG9ja1R5cGUiOiJwYXJhZ3JhcGgiLCJzdHlsZXMiOnsiYWxpZ24iOiJsZWZ0IiwiaW5kZW50IjowLCJ0ZXh0LWluZGVudCI6MCwibGluZS1oZWlnaHQiOjEuNzV9LCJ0eXBlIjoicGFyYWdyYXBoIiwicmljaFRleHQiOnsiZGF0YSI6W3siY2hhciI6Iua1iyJ9LHsiY2hhciI6IuivlSJ9LHsiY2hhciI6IuS4gCJ9LHsiY2hhciI6IuS4iyJ9LHsiY2hhciI6Iu+8jCJ9LHsiY2hhciI6Ik8ifSx7ImNoYXIiOiJLIn1dLCJpc1JpY2hUZXh0Ijp0cnVlLCJrZWVwTGluZUJyZWFrIjp0cnVlfX0seyJibG9ja0lkIjoiOTk5Ny0xNTIzNTgwNzA3NzY5IiwiYmxvY2tUeXBlIjoiaW1hZ2UiLCJzdHlsZXMiOnsid2lkdGgiOjQwMiwiaGVpZ2h0IjoyOTYsImFsaWduIjoibGVmdCIsImZsb2F0Ijoibm9uZSJ9LCJ0eXBlIjoiaW1hZ2UiLCJzb3VyY2UiOiJDM0Y2OEZCQzc4OUU0Qzk1QTU4Mjc4RjFCQzIwNjFDRSIsInRpdGxlIjoiIn1d--></p>
<p><a href="https://vki.cc/greattruth/experience/484/">CentOS下安装MySQL及相关设置</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>C#中自定义集合排序</title>
		<link>https://vki.cc/greattruth/language/459/</link>
					<comments>https://vki.cc/greattruth/language/459/#respond</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Mon, 09 Apr 2018 03:28:09 +0000</pubDate>
				<category><![CDATA[语言相关]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[教程]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=459</guid>

					<description><![CDATA[<p>有时候我们需要对一个对象数组进行排序，像string这种默认实现了IComparable&#60;T&#62;接口的类型，我们可以直接调用Sort()方法排序。 可是如果元素类型没有实现IComparable&#60;T&#62;，或者默认的比较逻辑不&#8230;</p>
<p><a href="https://vki.cc/greattruth/language/459/">C#中自定义集合排序</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>有时候我们需要对一个对象数组进行排序，像string这种默认实现了IComparable&lt;T&gt;接口的类型，我们可以直接调用Sort()方法排序。</p>
<p>可是如果元素类型没有实现IComparable&lt;T&gt;，或者默认的比较逻辑不符合要求，又该怎么办呢？</p>
<p>为了指定非默认的排序顺序，可以调用List&lt;T&gt;.Sort()的重载版本，它获取一个IComparer&lt;T&gt;作为实参。</p>
<p>&nbsp;</p>
<p>首先我们需要了解一下IComparable&lt;T&gt;和IComparer&lt;T&gt;的区别：</p>
<blockquote><p>IComparable&lt;T&gt;：“我知道如何将我自己和我的类型的另一个实例进行比较”；</p>
<p>IComparer&lt;T&gt;：“我知道如何比较给定类型的两个实例”；</p></blockquote>
<p>很明显，IComparable&lt;T&gt;由需要排序的对象继承并实现，IComparer&lt;T&gt;需要另建一个类继承并实现；</p>
<p>来看下面这个例子：</p>
<p>首先新建一个需要排序的类Name：</p>
<pre class="pure-highlightjs"><code class="cs">class Name
{
    public string FirstName { get; private set; }
    public string LastName { get; private set; }

    public Name(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public override string ToString()
    {
        return String.Format($"{FirstName} {LastName}");
    }
}</code></pre>
<p>然后新建一个比较类，继承并实现IComparer&lt;T&gt;接口：</p>
<pre class="pure-highlightjs"><code class="cs">class NameComparison : IComparer&lt;Name&gt;
{
    public int Compare(Name x, Name y)
    {
        if (Object.ReferenceEquals(x, y))
            return 0;
        if (x == null)
            return 1;
        if (y == null)
            return -1;

        int result = StringCompare(x.FirstName, y.FirstName);
        if (result == 0)
        {
            result = StringCompare(x.LastName, y.LastName);
        }

        return result;
    }

    public static int StringCompare(string x, string y)
    {
        if (Object.ReferenceEquals(x, y))
            return 0;
        if (x == null)
            return 1;
        if (y == null)
            return -1;

        return x.CompareTo(y);
    }
}</code></pre>
<p>接下来在Main方法中调用：</p>
<pre class="pure-highlightjs"><code class="cs">class Program
{
    static void Main(string[] args)
    {
        List&lt;Name&gt; nameList = new List&lt;Name&gt;()
            {
                new Name("Michelle", "Green"),
                new Name("Susan", "Miller"),
                new Name("Susan",""),
                new Name("","Smith"),
                new Name("Keisey","Smith")
            };

        nameList.Sort(new NameComparison());

        foreach (Name item in nameList)
        {
            Console.WriteLine(item);
        }
    }
}</code></pre>
<p>这样就能得到输出结果：</p>
<p><img  loading="lazy"  decoding="async"  class="alignleft wp-image-462 size-medium"  src="https://cdn.vki.cc/wp-content/uploads/2018/04/20180409112302-300x161.png"  alt=""  width="300"  height="161"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/04/20180409112302-300x161.png 300w, https://cdn.vki.cc/wp-content/uploads/2018/04/20180409112302.png 308w"  sizes="auto, (max-width: 300px) 100vw, 300px" ></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<hr />
<p>注意：实现IComparable&lt;T&gt;和IComparer&lt;T&gt;时必须生成一个全序。</p>
<p>CompareTo的实现必须为任何可能的数据排列组合提供完全一致的排序结果。</p>
<p>例如上述代码中考虑到了实参为null的情况。不能“任何一个元素为null就返回0,”，否则两个元素可能等于null，但相互不等，程序可能会崩溃！</p>
<p><a href="https://vki.cc/greattruth/language/459/">C#中自定义集合排序</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/language/459/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>在Unity中制作小地图</title>
		<link>https://vki.cc/greattruth/engine/342/</link>
					<comments>https://vki.cc/greattruth/engine/342/#comments</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Sat, 03 Feb 2018 14:36:54 +0000</pubDate>
				<category><![CDATA[咸鱼心得]]></category>
		<category><![CDATA[引擎相关]]></category>
		<category><![CDATA[UGUI]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[Unity 3D]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[教程]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=342</guid>

					<description><![CDATA[<p>在很多游戏里，小地图都是不可或缺的存在，今天我们就来学习下如何在Unity中制作小地图 _(:з」∠)_ 据我目前所知（知识有限），小地图有两种制作方式： 一是新建一个小摄像机，放在场景上空朝下进行拍摄； 二&#8230;</p>
<p><a href="https://vki.cc/greattruth/engine/342/">在Unity中制作小地图</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>在很多游戏里，小地图都是不可或缺的存在，今天我们就来学习下如何在Unity中制作小地图</p>
<p>_(:з」∠)_</p>
<p>据我目前所知（知识有限），小地图有两种制作方式：</p>
<p>一是新建一个小摄像机，放在场景上空朝下进行拍摄；</p>
<p>二是计算场景中物体的相对位置，通过UI显示出来；</p>
<p>在本例中，我使用的是第一张方式，这种方式实现相对简单一点，所以很方便。</p>
<h2 id="%e9%a6%96%e5%85%88%e5%9c%a8project%e4%b8%ad%e6%96%b0%e5%bb%ba%e4%b8%80%e4%b8%aarender-texture%ef%bc%8c%e5%91%bd%e5%90%8d%e4%b8%baminimap">首先在Project中新建一个Render Texture，命名为“Minimap”</h2>
<p><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-351"  src="https://cdn.vki.cc/wp-content/uploads/2018/02/20180203224324.jpg"  alt=""  width="505"  height="446"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/02/20180203224324.jpg 505w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180203224324-300x265.jpg 300w"  sizes="auto, (max-width: 505px) 100vw, 505px" ></p>
<p>然后在场景中新建一个Camera，将其设为Player（将会在小地图中处于中心位置的玩家）的子物体，并调整其位置和方向，令其处于Player上方且朝向正下方，再将其Target Texture指定为刚才创建的Render Texture，如图：</p>
<p><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-352"  src="https://cdn.vki.cc/wp-content/uploads/2018/02/20180203224607.jpg"  alt=""  width="389"  height="406"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/02/20180203224607.jpg 389w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180203224607-287x300.jpg 287w"  sizes="auto, (max-width: 389px) 100vw, 389px" ></p>
<p>然后在场景中创建UI-Raw Image，并设置Texture为刚才创建的Render Texture，你会发现image显示的是小地图Camera拍的内容 _(:з」∠)_</p>
<p>这样大体上就做出来了，不过还要调节下。</p>
<h2 id="%e8%ae%be%e7%bd%ae%e9%9c%80%e8%a6%81%e6%98%be%e7%a4%ba%e5%9c%a8%e5%b0%8f%e5%9c%b0%e5%9b%be%e4%b8%8a%e7%9a%84%e5%ad%90%e7%89%a9%e4%bd%93">设置需要显示在小地图上的子物体</h2>
<p>在需要显示在小地图上的的物体上添加一个Sphere子物体，改成绿色，同样改变高度使其位于上方（注意不要超过小地图Camera的高度）</p>
<p>新建一个Layer层，命名为Minimap，将Sphere置为Minimap层，</p>
<p>将地面模型也置为Minimap层，</p>
<p>更改小地图Camera的Culling Mask，只勾选刚才创建的Minimap层，注意勾选Occlusion Culling，这样小地图就只显示Minimap层的东西了。</p>
<p><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-354"  src="https://cdn.vki.cc/wp-content/uploads/2018/02/20180203230422.jpg"  alt=""  width="285"  height="350"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/02/20180203230422.jpg 285w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180203230422-244x300.jpg 244w"  sizes="auto, (max-width: 285px) 100vw, 285px" ></p>
<p><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-355"  src="https://cdn.vki.cc/wp-content/uploads/2018/02/20180203230741.jpg"  alt=""  width="244"  height="234" ></p>
<h2 id="%e7%be%8e%e5%8c%96%e5%b0%8f%e5%9c%b0%e5%9b%be">美化小地图</h2>
<p>现在的小地图还是方形的，如何改成圆形呢？</p>
<p>打开ps，制作一个白色的圆，背景为透明，保存为png格式，导入到unity中，再设置属性为Sprite(2D and UI)，</p>
[infobox title=&#8221;白色圆&#8221;]<a href="https://cdn.vki.cc/wp-content/uploads/2018/02/mask-1.png" target="_blank" rel="noopener noreferrer"><img  loading="lazy"  decoding="async"  class="alignnone wp-image-356 size-medium"  src="https://cdn.vki.cc/wp-content/uploads/2018/02/mask-1-300x300.png"  alt=""  width="300"  height="300"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/02/mask-1-300x300.png 300w, https://cdn.vki.cc/wp-content/uploads/2018/02/mask-1-150x150.png 150w, https://cdn.vki.cc/wp-content/uploads/2018/02/mask-1.png 512w"  sizes="auto, (max-width: 300px) 100vw, 300px" ></a> [/infobox]
<p>在场景中新建UI-Image，image指定为白色的圆，添加上Mask组件，设置为Raw Image的父物体。这样小地图就变成圆形了：</p>
<p><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-358"  src="https://cdn.vki.cc/wp-content/uploads/2018/02/20180203231256.jpg"  alt=""  width="216"  height="214"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/02/20180203231256.jpg 216w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180203231256-150x150.jpg 150w"  sizes="auto, (max-width: 216px) 100vw, 216px" ></p>
<p>或者可以再加上一个圈：</p>
<p><a href="https://cdn.vki.cc/wp-content/uploads/2018/02/mask3.png" target="_blank" rel="noopener noreferrer">[infobox title=&#8221;圆圈&#8221;]<img  loading="lazy"  decoding="async"  class="alignnone wp-image-357 size-medium"  src="https://cdn.vki.cc/wp-content/uploads/2018/02/mask3-300x300.png"  alt=""  width="300"  height="300"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/02/mask3-300x300.png 300w, https://cdn.vki.cc/wp-content/uploads/2018/02/mask3-150x150.png 150w, https://cdn.vki.cc/wp-content/uploads/2018/02/mask3.png 512w"  sizes="auto, (max-width: 300px) 100vw, 300px" >[/infobox]</a></p>
<p>最终效果：</p>
<p><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-359"  src="https://cdn.vki.cc/wp-content/uploads/2018/02/20180203231458.jpg"  alt=""  width="208"  height="213" ></p>
<hr />
<p>写完了，睡觉 _(:з」∠)_</p>
<p><a href="https://vki.cc/greattruth/engine/342/">在Unity中制作小地图</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/engine/342/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>利用图灵机器人API开发聊天功能</title>
		<link>https://vki.cc/greattruth/language/329/</link>
					<comments>https://vki.cc/greattruth/language/329/#respond</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Thu, 01 Feb 2018 00:59:34 +0000</pubDate>
				<category><![CDATA[语言相关]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[原创]]></category>
		<category><![CDATA[教程]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=329</guid>

					<description><![CDATA[<p>效果如下 （由于我还不会图形界面程序的开发，所以使用的Unity _(:з」∠)_） 在开始制作之前，我们需要先去图灵机器人官网申请一个机器人，并获取它的key： 帮助文档：http://www.tuling123.com/help/h_cent_&#8230;</p>
<p><a href="https://vki.cc/greattruth/language/329/">利用图灵机器人API开发聊天功能</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p>效果如下</p>
<p>（由于我还不会图形界面程序的开发，所以使用的Unity _(:з」∠)_）</p>
<p><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-332"  src="https://cdn.vki.cc/wp-content/uploads/2018/02/20180131212704.jpg"  alt=""  width="1372"  height="797"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/02/20180131212704.jpg 1372w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180131212704-300x174.jpg 300w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180131212704-768x446.jpg 768w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180131212704-1024x595.jpg 1024w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180131212704-750x436.jpg 750w"  sizes="auto, (max-width: 1372px) 100vw, 1372px" ></p>
<hr>
<p>在开始制作之前，我们需要先去<span style="color: #3366ff;"><a style="color: #3366ff;" href="http://www.tuling123.com/" target="_blank" rel="noopener noreferrer">图灵机器人官网</a></span>申请一个机器人，并获取它的key：</p>
<p>帮助文档：<a href="http://www.tuling123.com/help/h_cent_webapi.jhtml?nav=doc" target="_blank" rel="noopener noreferrer">http://www.tuling123.com/help/h_cent_webapi.jhtml?nav=doc</a></p>
<p><a href="https://cdn.vki.cc/wp-content/uploads/2018/02/20180201083112.jpg" target="_blank" rel="noopener noreferrer"><img  loading="lazy"  decoding="async"  class="alignnone wp-image-333 size-full"  src="https://cdn.vki.cc/wp-content/uploads/2018/02/20180201083112.jpg"  alt=""  width="1084"  height="918"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/02/20180201083112.jpg 1084w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180201083112-300x254.jpg 300w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180201083112-768x650.jpg 768w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180201083112-1024x867.jpg 1024w, https://cdn.vki.cc/wp-content/uploads/2018/02/20180201083112-750x635.jpg 750w"  sizes="auto, (max-width: 1084px) 100vw, 1084px" ></a></p>
<p>这样前期准备工作就好啦！</p>
<hr>
<p>接下来我们看下图灵机器人官方给的开发文档：</p>
<p id="interface"><strong>接口地址</strong>：<a href="http://www.tuling123.com/openapi/api" target="_blank" rel="noopener noreferrer">http://www.tuling123.com/openapi/api</a></p>
<p id="way"><strong>请求方式</strong>：HTTP POST</p>
<p class="red">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">注：若之前使用get请求方式，仍能继续使用,日后将对该请求方式不再进行更新及维护工作，建议采用post请求方式。</span></p>
<p id="parameter"><strong>请求参数</strong>：请求参数格式为json</p>
<h2 id="%e8%af%b7%e6%b1%82%e7%a4%ba%e4%be%8b"><strong>请求示例</strong></h2>
<pre class="pure-highlightjs"><code class="null">{
                
    “key”: “APIKEY”,
            
    “info”: “今天天气怎么样”，
                
    “loc”：“北京市中关村”，
               
    “userid”：“123456”
                
}
            </code></pre>
<p>部分参数如下：</p>
<table class="table" style="height: 171px;" width="980">
<tbody>
<tr>
<th>参数</th>
<th>是否必须</th>
<th>长度</th>
<th>示例</th>
<th>说明</th>
</tr>
<tr>
<td>key</td>
<td>必须</td>
<td>32</td>
<td>1ca8089********736b8ce41591426(32位)</td>
<td>注册之后在机器人接入页面获得（参见本文档第2部分）</td>
</tr>
<tr>
<td>info</td>
<td>必须</td>
<td>1-30</td>
<td>打招呼“你好”<br />
查天气“北京今天天气”</td>
<td>请求内容，<b>编码方式为UTF-8</b></td>
</tr>
<tr>
<td>userid</td>
<td>必须</td>
<td>1-32</td>
<td>abc123（支持0-9，a-z,A-Z组合，不能包含特殊字符）</td>
<td>用户唯一标志（对应自己的每一个用户）<br />
<b>用户对话上下文控制</b></td>
</tr>
</tbody>
</table>
<h2 id="%e8%bf%94%e5%9b%9e%e7%a4%ba%e4%be%8b"><strong><br />
返回示例</strong></h2>
<pre class="pure-highlightjs"><code class="null">{
                
    "code":100000,
                
    "text":"你也好 嘻嘻"
             
}
           </code></pre>
<p>部分参数如下：</p>
<table class="table table1 text1">
<tbody>
<tr>
<th>字段</th>
<th>说明</th>
</tr>
<tr>
<td>code</td>
<td>文本类标识码</td>
</tr>
<tr>
<td>text</td>
<td>结果</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>看到这里我们大概有了思路，首先我们将需要发送的文本和key等封装在一个json里，通过post方式发送给图灵机器人的接口地址，然后获取其返回的信息（json格式），解析出来其中的text就是我们想要的结果。</p>
<p>这里我用了Litjson作为json解析工具，首先我创建了一个用于封装发送信息的类RequstData：</p>
<p>其中key是从图灵机器人官网获得的key，info代表发送的文本，userid是区别用户的id，可自定义设置。ConvertToJson()方法将上述信息封装成一个json字符串。</p>
<pre class="pure-highlightjs"><code class="cs">class RequstData
{
    private const string key = "你的KEY";

    public string Key { get; private set; }
    public string Info { get; set; }
    public string UserID { get; set; }


    public RequstData(string info, string userid)
    {
        Info = info;
        UserID = userid;
    }


    public string ConverToJson()
    {
        JsonData jd = new JsonData();
        jd["key"] = key;
        jd["info"] = Info;
        jd["userid"] = UserID;

        return JsonMapper.ToJson(jd);
    }
}</code></pre>
<p>然后是post方法发送并接受数据，返回值为结果字符串，参数postUrl为目标地址，这里就是&#8221;http://www.tuling123.com/openapi/api&#8221;，paramData就是上面封装的json字符串。</p>
<p>emmmm说实话这部分我也不是很熟悉，自己看吧。。。</p>
<pre class="pure-highlightjs"><code class="cs">/// &lt;summary&gt;
/// Post提交数据
/// &lt;/summary&gt;
/// &lt;param name="postUrl"&gt;URL&lt;/param&gt;
/// &lt;param name="paramData"&gt;参数&lt;/param&gt;
/// &lt;returns&gt;&lt;/returns&gt;
private string PostWebRequest(string postUrl, string paramData)
{
    string ret = string.Empty;
    try
    {
        if (!postUrl.StartsWith("http://"))
            return "";

        byte[] byteArray = Encoding.UTF8.GetBytes(paramData); //转化
        HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(postUrl));
        webReq.Method = "POST";

        webReq.ContentLength = byteArray.Length;
        Stream newStream = webReq.GetRequestStream();
        newStream.Write(byteArray, 0, byteArray.Length);//写入参数
        newStream.Close();
        HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
        StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
        ret = sr.ReadToEnd();
        sr.Close();
        response.Close();
        newStream.Close();
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
    return ret;
}</code></pre>
<p>最后是解析获得的json字符串，依旧是利用litjson做解析，还是挺简单的</p>
<pre class="pure-highlightjs"><code class="cs">// 获取到结果字符串
string result = PostWebRequest(url, requstData.ConverToJson()); 
JsonData dejson = JsonMapper.ToObject(result);  
// 通过索引获得text
Debug.Log(dejson["text"].ToString()); </code></pre>
<p><a href="https://vki.cc/greattruth/language/329/">利用图灵机器人API开发聊天功能</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/language/329/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【设计模式】学习笔记</title>
		<link>https://vki.cc/greattruth/experience/311/</link>
					<comments>https://vki.cc/greattruth/experience/311/#comments</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Mon, 22 Jan 2018 09:13:56 +0000</pubDate>
				<category><![CDATA[咸鱼心得]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[设计模式]]></category>
		<category><![CDATA[转载]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=311</guid>

					<description><![CDATA[<p>01 &#8211; 单例模式 02 &#8211; 中介者模式 03 &#8211; 状态模式 04 &#8211; 外观模式</p>
<p><a href="https://vki.cc/greattruth/experience/311/">【设计模式】学习笔记</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://cdn.vki.cc/wp-content/uploads/2018/01/DesignModes.jpg" target="_blank" rel="noopener noreferrer"><img  loading="lazy"  decoding="async"  class="alignnone wp-image-314 size-full"  src="https://cdn.vki.cc/wp-content/uploads/2018/01/DesignModes.jpg"  alt=""  width="1587"  height="673"  srcset="https://cdn.vki.cc/wp-content/uploads/2018/01/DesignModes.jpg 1587w, https://cdn.vki.cc/wp-content/uploads/2018/01/DesignModes-300x127.jpg 300w, https://cdn.vki.cc/wp-content/uploads/2018/01/DesignModes-768x326.jpg 768w, https://cdn.vki.cc/wp-content/uploads/2018/01/DesignModes-1024x434.jpg 1024w, https://cdn.vki.cc/wp-content/uploads/2018/01/DesignModes-750x318.jpg 750w"  sizes="auto, (max-width: 1587px) 100vw, 1587px" ></a></p>
<p><span style="text-decoration: underline;"><strong><a href="https://vki.cc/greattruth/experience/538/" target="_blank" rel="noopener">01 &#8211; 单例模式</a></strong></span></p>
<p><span style="text-decoration: underline;"><strong><a href="https://vki.cc/greattruth/experience/546/" target="_blank" rel="noopener">02 &#8211; 中介者模式</a></strong></span></p>
<p><span style="text-decoration: underline;"><strong><a href="https://vki.cc/greattruth/experience/558/" target="_blank" rel="noopener">03 &#8211; 状态模式</a></strong></span></p>
<p><span style="text-decoration: underline;"><strong><a href="https://vki.cc/greattruth/experience/563/" target="_blank" rel="noopener">04 &#8211; 外观模式</a></strong></span></p>
<p><a href="https://vki.cc/greattruth/experience/311/">【设计模式】学习笔记</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/experience/311/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>【转】Unity中的序列化</title>
		<link>https://vki.cc/greattruth/engine/276/</link>
					<comments>https://vki.cc/greattruth/engine/276/#comments</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Sat, 09 Sep 2017 12:34:53 +0000</pubDate>
				<category><![CDATA[引擎相关]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[Unity 3D]]></category>
		<category><![CDATA[心得]]></category>
		<category><![CDATA[教程]]></category>
		<category><![CDATA[解析]]></category>
		<category><![CDATA[转载]]></category>
		<guid isPermaLink="false">http://www.icemaplen.com/?p=276</guid>

					<description><![CDATA[<p>What is it?  序列化的概念 长篇大论起来，序列化就是一个将对象的状态信息转换为可以存储或传输到内存，数据库或者文件的过程。简而言之，就是如何存储对象以便后续调用的过程。   假设我们需要定义和存储&#8230;</p>
<p><a href="https://vki.cc/greattruth/engine/276/">【转】Unity中的序列化</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[<h2 id="what-is-it-%e5%ba%8f%e5%88%97%e5%8c%96%e7%9a%84%e6%a6%82%e5%bf%b5"><strong><span style="font-size: medium;"><span style="color: black;"><span style="font-family: 微软雅黑, sans-serif;">What is it?  </span></span><span style="color: black;"><span style="font-family: 微软雅黑, sans-serif;">序列化的概念</span></span></span></strong><span style="font-size: medium;"><strong><span style="color: black;"><span style="font-family: 微软雅黑, sans-serif;"><br />
</span></span></strong></span></h2>
<div align="left"><span style="font-size: medium;">长篇大论起来，序列化就是一个将对象的状态信息转换为可以存储或传输到内存，数据库或者文件的过程。简而言之，就是如何存储对象以便后续调用的过程。</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">假设我们需要定义和存储一个向量，那这个向量的哪些字段状态我们需要保存起来？很明显是向量的三个分量X.Y,Z啦。您可以考虑将重要的数据进行序列化操作，以便在后续进行反序列化的操作。在这里我们再次简明概括一下序列化以及反序列化。</span></div>
<div align="left"><span style="font-size: medium;">序列化： 将数据结构或对象转换成二进制串的过程</span></div>
<div align="left"><span style="font-size: medium;">反序列化：将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程</span></div>
<div align="left"></div>
<div align="left"><span style="font-size: medium;">正如我们所分析那样，序列化经常用于存储或者转化数据。假设我们在我们的服务器上部署了一个商城，并且正常运行了数据库管理应用。那么，将内存数据（（内存数据断电即丢失））写入硬盘的操作过程就是将对象序列化成数据表的实例。其他平台的数据存储操作，也属于序列化的范畴。</span></div>
<h2 id="how-unity-does-unity%e7%9a%84%e5%ba%8f%e5%88%97%e5%8c%96%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86"><strong><span style="font-size: medium;"><span style="color: black;"><span style="font-family: 微软雅黑, sans-serif;">How Unity Does  </span></span><span style="font-family: 微软雅黑, sans-serif;">Unity</span><span style="font-family: 微软雅黑, sans-serif;">的序列化工作原理</span></span></strong></h2>
<p><span style="font-size: medium;">Unity作为一个<a class="relatedlink" href="http://www.manew.com/forum-news-1.html" target="_blank" rel="noopener noreferrer">游戏引擎</a>，除了需要从外部（磁盘）加载一大堆资源，如脚本，预设以及场景等到内存，还需要将数据从原生C++端转移到C#端进行托管。序列化操作不仅限于底层数据的加载和存储，它在前端界面也有所应用，如属性窗口，编辑器重定义以及场景对象实例化等。鉴于个人能力有限，您可以在本帖子的延伸阅读（最下方）找寻其他作者关于Unity序列化的博文。我相信处女座的同学会立马谷歌一下。</span></p>
<div align="left"><span style="font-size: medium;">已被序列化的UnityEngine.Object类会提供相应的序列化资源 ：如MonoBehaviour，ScriptableObject（稍后会提到），Shader,Sprite以及Unity的基础内置资源。一般上述资源在游戏开发过程中的调用不可见，除了在脚本编写的环节才有所体现。毕竟在脚本编码过程中，您需要关注哪些字段需要被序列化。如果要对字段进行序列化，您必须遵循以下规则：</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">将该字段定义为public,或者为其添加【SerializeField】的属性</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">该字段不能使用static关键字</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">该字段不能使用const关键字</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">该字段不能使用readonly关键字</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">字段的数据类型必须能序列化</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">通过查询unity文档可知，以下类型可被序列化：</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">带有[Serializable]属性的自定义非抽象类</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">带有[Serializable]属性的自定义结构体</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">继承自UntiyEngine.Object的对象引用</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">基本数据类型（int,float,double,bool,string等）</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">能序列化的字段数组</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">能序列化的线性表</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">需要重点关注的是，自定义的字典类型数据是不能序列化的，就算定义其为公有或附带[SerializeField]属性。鉴于上述原因，在游戏开发过程中，应避免使用字典进行序列化。</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">说了那么多，让我们来实战一下。</span></div>
<h2 id="examples-%e6%a1%88%e4%be%8b"><strong><span style="font-size: medium;"><span style="color: black;"><span style="font-family: 微软雅黑, sans-serif;">Examples </span></span><span style="font-family: 微软雅黑, sans-serif;">案例</span></span></strong><span style="font-size: medium;"><span style="font-family: 微软雅黑, sans-serif;"><br />
</span></span></h2>
<div align="left"><span style="font-size: medium;">可复制以下代码到C#文件进行调试：</span></div>
<div align="left">
<pre class="pure-highlightjs"><code class="cs">using UnityEngine;public class MyBehaviour : MonoBehaviour
{
    [SerializeField] private int x = 3;
    [SerializeField] private float y = 5.6f;
    public float pi = 3.1415f;
    private int mySecret = 42;
    public static int myStatic = 10;
    public const int myConst = 22;
    public readonly int myReadOnly = 99;
    public int MyProperty { get { return 100; } }
}</code></pre>
</div>
<div align="left"></div>
<div align="left"><span style="font-size: medium;">根据序列化原则可知，当字段含有static, const, readonly关键字或该字段定义为非公有时，不能被序列化，综上所述仅”x,y和pi”能被序列化。这些能被序列化的字段都可在脚本的属性面板进行查看。</span></div>
<div align="left"><span style="font-size: medium;"> <img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-278"  src="https://cdn.vki.cc/wp-content/uploads/2017/09/044950iagkaazzmd4ieaio.png.thumb_.png"  alt=""  width="274"  height="91" ></span></div>
<div align="left"><span style="font-size: medium;">通过对象克隆的方式，可输出并调试非序列化的字段。以下案例将阐述序列化过程中调用Instantiate方法的过程。</span></div>
<div align="left"></div>
<div align="left">
<pre class="pure-highlightjs"><code class="cs">private void Start()
{
   Debug.Log(“Pi: “ + pi + “. MySecret: “ + x+ “. MyStatic: “ + myStatic);// 译者注：MySecret的值引用的x,不知道是否错误，但我改为mySecrte时，2次输出同为42
}private void Update()
{
   if (Input.GetMouseButtonDown(0))
   {
       pi = –4;
       mySecret = –11;
       myStatic = 13;
       GameObject.Instantiate(gameObject);
   }
}</code></pre>
</div>
<div align="left"><span style="font-size: medium;">运行上述程序并点击鼠标左键时，会在场景中引用当前对象并创建第二个对象。由于第二个对象是第一个对象的拷贝，我们是否可以认为第二个对象的值与第一个对象相同？参照输出列表发现，MySecret的值保持不变（没被序列化），而Pi的值改变了（序列化了）。</span></div>
<div align="left"><span style="font-size: medium;"> <img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-279"  src="https://cdn.vki.cc/wp-content/uploads/2017/09/044950v4by6zynpxg95nss.png.thumb_.png"  alt=""  width="226"  height="69" ></span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">鉴于mySecret字段为private且没附带【SerializeField】属性，所以它不能被序列化。（某些场合私有字段可被序列化）。</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">某些场合私有字段可被序列化，这种特殊情况会在【Problems】章节中进行描述。</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;">细心的读者肯定会发现，字段myStatic的值也发生了改变，那是否意味着它也被序列化了。答案是否定的。虽然控制台所输出的值会让我们认为该字段被序列化，但事实上仅仅因为它是静态字段，而静态字段仅属于类，而不属于类实例。如果我们新建一个空的物体【GameObject &gt; Create Empty】并赋予它该脚本时，运行上述程序时，myStatic的值一样为13(没被序列化)。需要注意的是，Pi的值变为原来的值。</span></div>
<div align="left"><span style="font-size: medium;"> </span></div>
<div align="left"><span style="font-size: medium;"><span style="color: #ff0000;"><img  loading="lazy"  decoding="async"  class="alignnone size-full wp-image-280"  src="https://cdn.vki.cc/wp-content/uploads/2017/09/044950d2flygiyl29lgyzl.png.thumb_.png"  alt=""  width="233"  height="105" ></span></span></div>
<blockquote>
<div align="left">序列化的意思是说再次读取Unity时序列化的变量是有值的，不需要你再次去赋值，因为它已经被保存下来。</div>
</blockquote>
<div align="left"></div>
<div align="left">
<h2 id="unity%e5%ba%8f%e5%88%97%e5%8c%96">Unity序列化</h2>
<p>在Unity中，在检视面板中可以看到的，就是被成功序列化了的参数。与序列化相关的常用的关键字有SerializeField，HideInInspector，NonSerialized，Serializable并可以组合使用。</p>
<ul>
<li>SerializeField : 表示变量可被序列化。众所周知，公有变量可以在检视面板中看到并编辑，而私有和保护变量不行。SerializeField与private，protected结合使用可以达到让脚本的变量在检视面板里可视化编辑，同时保持它的私有性的目的。</li>
<li>HideInInspector : 将原本显示在检视面板上的序列化值隐藏起来。</li>
<li>NonSerialized :通过此方法可以将一个公有变量不序列化并且不显示在检视面板中。</li>
<li>Serializable：用在类的前面，表示该类可被序列化。</li>
</ul>
<pre class="pure-highlightjs"><code class="cs">public class Test :Monobehavior
{
    public int  a;                               //序列化，显示
    private int b;                               //不序列化，不显示
    [SerializeField ] int c;                     //序列化，显示
    [HideInInspector] public int d;              //序列化，不显示
    [NonSerialized ] public int e;               //不序列化，不显示
    public Test2 test2;                          //序列化，显示（可序列化的部分）
}

[Serializable ]
public class Test2
{
     public int aa;
     private int bb;
}</code></pre>
</div>
<p><a href="https://vki.cc/greattruth/engine/276/">【转】Unity中的序列化</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/engine/276/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
	</channel>
</rss>
