UNPKG

ng-cw-v12

Version:

Angular UI component library

920 lines 77 kB
(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common'), require('three'), require('three/examples/jsm/controls/OrbitControls'), require('three/examples/jsm/environments/RoomEnvironment'), require('three/examples/jsm/libs/lil-gui.module.min'), require('three/examples/jsm/loaders/MTLLoader.js'), require('three/examples/jsm/loaders/OBJLoader.js')) :
    typeof define === 'function' && define.amd ? define('ng-cw-v12/obj-viewer', ['exports', '@angular/core', '@angular/common', 'three', 'three/examples/jsm/controls/OrbitControls', 'three/examples/jsm/environments/RoomEnvironment', 'three/examples/jsm/libs/lil-gui.module.min', 'three/examples/jsm/loaders/MTLLoader.js', 'three/examples/jsm/loaders/OBJLoader.js'], factory) :
    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global["ng-cw-v12"] = global["ng-cw-v12"] || {}, global["ng-cw-v12"]["obj-viewer"] = {}), global.ng.core, global.ng.common, global.THREE, global.OrbitControls, global.RoomEnvironment, global.lilGui_module_min, global.MTLLoader_js, global.OBJLoader_js));
})(this, (function (exports, i0, i2, THREE, OrbitControls, RoomEnvironment, lilGui_module_min, MTLLoader_js, OBJLoader_js) { 'use strict';

    function _interopNamespace(e) {
        if (e && e.__esModule) return e;
        var n = Object.create(null);
        if (e) {
            Object.keys(e).forEach(function (k) {
                if (k !== 'default') {
                    var d = Object.getOwnPropertyDescriptor(e, k);
                    Object.defineProperty(n, k, d.get ? d : {
                        enumerable: true,
                        get: function () { return e[k]; }
                    });
                }
            });
        }
        n["default"] = e;
        return Object.freeze(n);
    }

    var i0__namespace = /*#__PURE__*/_interopNamespace(i0);
    var i2__namespace = /*#__PURE__*/_interopNamespace(i2);
    var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);

    var LocalService = /** @class */ (function () {
        function LocalService(platformId) {
            this.platformId = platformId;
            this.isBrowser = false;
            this.isBrowser = i2.isPlatformBrowser(this.platformId);
        }
        return LocalService;
    }());
    LocalService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0__namespace, type: LocalService, deps: [{ token: i0.PLATFORM_ID }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
    LocalService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0__namespace, type: LocalService, providedIn: 'root' });
    i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0__namespace, type: LocalService, decorators: [{
                type: i0.Injectable,
                args: [{
                        providedIn: 'root'
                    }]
            }], ctorParameters: function () {
            return [{ type: Object, decorators: [{
                            type: i0.Inject,
                            args: [i0.PLATFORM_ID]
                        }] }];
        } });

    var ObjViewerComponent = /** @class */ (function () {
        function ObjViewerComponent(eleRef, ls) {
            this.eleRef = eleRef;
            this.ls = ls;
            this.tipsMode = false;
            this.controlMode = false;
            this.alphaMode = false;
            this.parametersOk = true;
            this.objInfo = {
                objUrl: '',
                mtlUrl: '',
            };
            this.showLoading = false;
            this.loadingText = '';
            this.loadingText2 = '';
            this.domId = '#objViewer';
            this.cameraPlacement = 'default';
            this.bgUrl = '';
            this.size = 0;
            this.state = {
                toneMapping: THREE__namespace.LinearToneMapping,
                toneMappingExposure: 0,
                background: false,
                backgroundColor: '#191919',
                useBgUrl: false,
                useBgSphere: false,
                axesHelper: false,
                wireframe: false,
                autoRotate: false,
                autoRotateSpeed: 0.5,
                ambientLight: true,
                ambientLightColor: '#FFFFFF',
                ambientLightIntensity: 2,
                directionalLight: true,
                directionalLightColor: '#FFFFFF',
                directionalLightIntensity: 2,
                directionalLightPosition: {
                    x: 0,
                    y: 0,
                    z: 0
                },
                directionalLightHelper: false,
                directionalLight2: true,
                directionalLightColor2: '#FFFFFF',
                directionalLightIntensity2: 2,
                directionalLightPosition2: {
                    x: 0,
                    y: 0,
                    z: 0
                },
                directionalLightHelper2: false,
                pointLight: false,
                pointLightColor: '#FFFFFF',
                pointLightIntensity: 1,
                pointLightDistance: 0,
                pointLightDecay: 0.1,
                pointLightPosition: {
                    x: 0,
                    y: 0,
                    z: 0
                },
                pointLightHelper: false
            };
        }
        Object.defineProperty(ObjViewerComponent.prototype, "ncObjInfo", {
            //模型地址
            set: function (value) {
                var _this = this;
                this.objInfo = value;
                setTimeout(function () {
                    //加延迟,防止其他传入参数未获取到
                    if (_this.scene) {
                        _this.updateModel();
                    }
                });
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ObjViewerComponent.prototype, "ncCameraPlacement", {
            //摄像机初始方位default,left,right,top,bottom,back,front
            set: function (value) {
                this.cameraPlacement = value;
                if (this.scene) {
                    this.setCameraPlacement();
                }
            },
            enumerable: false,
            configurable: true
        });
        ;
        Object.defineProperty(ObjViewerComponent.prototype, "ncBg", {
            //是否启用背景
            set: function (value) {
                this.state.background = value !== null && value !== undefined && value !== false && value !== 'false';
                if (this.scene) {
                    this.updateBackground();
                }
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ObjViewerComponent.prototype, "ncBgColor", {
            //背景色值
            set: function (value) {
                this.state.backgroundColor = value;
                if (this.scene) {
                    this.updateBackground();
                }
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ObjViewerComponent.prototype, "ncBgUrl", {
            //背景图片URL
            set: function (value) {
                this.bgUrl = value;
                this.state.useBgUrl = value ? true : false; //传了值,默认启用背景图
                this.state.useBgSphere = value ? true : false; //传了值,默认启用背景球
                if (this.scene) {
                    this.updateBackground();
                }
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ObjViewerComponent.prototype, "ncTips", {
            //操作提示
            set: function (value) {
                this.tipsMode = value !== null && value !== undefined && value !== false && value !== 'false';
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ObjViewerComponent.prototype, "ncControl", {
            //控制面板
            set: function (value) {
                this.controlMode = value !== null && value !== undefined && value !== false && value !== 'false';
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ObjViewerComponent.prototype, "ncAlpha", {
            //背景是否透明
            set: function (value) {
                this.alphaMode = value !== null && value !== undefined && value !== false && value !== 'false';
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ObjViewerComponent.prototype, "ncAutoRotate", {
            //自动旋转
            set: function (value) {
                this.state.autoRotate = value !== null && value !== undefined && value !== false && value !== 'false';
                if (this.scene) {
                    this.toggleAutoRotate();
                }
            },
            enumerable: false,
            configurable: true
        });
        Object.defineProperty(ObjViewerComponent.prototype, "ncAutoRotateSpeed", {
            //自动旋转速度
            set: function (value) {
                this.state.autoRotateSpeed = value;
                if (this.scene) {
                    this.toggleAutoRotate();
                }
            },
            enumerable: false,
            configurable: true
        });
        ObjViewerComponent.prototype.ngOnInit = function () {
            var _this = this;
            if (this.objInfo.objUrl == '') {
                this.parametersOk = false;
                console.error('objUrl为空');
            }
            if (this.objInfo.mtlUrl == '') {
                this.parametersOk = false;
                console.error('mtlUrl为空');
            }
            if (!this.parametersOk) {
                return;
            }
            this.onWindowResize = this.onWindowResize.bind(this);
            this.animate = this.animate.bind(this);
            if (this.ls.isBrowser) {
                window.addEventListener('resize', this.onWindowResize);
            }
            setTimeout(function () {
                _this.init();
            }, 20);
        };
        ObjViewerComponent.prototype.ngOnDestroy = function () {
            if (this.ls.isBrowser) {
                window.removeEventListener('resize', this.onWindowResize);
            }
            this.webglLoseContext();
        };
        ObjViewerComponent.prototype.init = function () {
            if (!this.parametersOk) {
                return;
            }
            var objArea = this.eleRef.nativeElement.querySelector(this.domId);
            this.domWidth = objArea.offsetWidth;
            this.domHeight = objArea.offsetHeight;
            this.renderer = new THREE__namespace.WebGLRenderer({ antialias: true, alpha: this.alphaMode });
            this.renderer.setPixelRatio(objArea.devicePixelRatio);
            this.renderer.setSize(this.domWidth, this.domHeight);
            this.renderer.outputColorSpace = THREE__namespace.SRGBColorSpace;
            objArea.appendChild(this.renderer.domElement);
            this.scene = new THREE__namespace.Scene();
            var environment = new RoomEnvironment.RoomEnvironment();
            var pmremGenerator = new THREE__namespace.PMREMGenerator(this.renderer);
            this.scene.environment = pmremGenerator.fromScene(environment).texture;
            this.updateModel();
            requestAnimationFrame(this.animate);
        };
        ObjViewerComponent.prototype.render = function () {
            this.renderer.render(this.scene, this.camera);
        };
        ObjViewerComponent.prototype.animate = function () {
            requestAnimationFrame(this.animate);
            // required if controls.enableDamping or controls.autoRotate are set to true
            if (this.controls) {
                this.controls.update();
            }
            if (this.scene && this.camera) {
                this.render();
            }
        };
        ObjViewerComponent.prototype.onWindowResize = function () {
            var _this = this;
            setTimeout(function () {
                var objArea = _this.eleRef.nativeElement.querySelector(_this.domId);
                var width = objArea.offsetWidth;
                var height = objArea.offsetHeight;
                _this.renderer.setPixelRatio(objArea.devicePixelRatio);
                _this.renderer.setSize(width, height);
                _this.render();
            });
        };
        //更新模型
        ObjViewerComponent.prototype.updateModel = function () {
            var _this = this;
            this.showLoading = true;
            this.loadingText = '模型加载中...';
            this.loadingText2 = '';
            if (this.objScene) {
                this.scene.remove(this.objScene);
                this.objScene = null;
            }
            var baseUrl = this.objInfo.objUrl.split('/').slice(0, -1).join('/');
            // 创建新的LoadingManager来重置进度计数
            var manager = new THREE__namespace.LoadingManager();
            manager.onProgress = function (url, loaded, total) {
                _this.loadingText = "\u6B63\u5728\u52A0\u8F7D\u8D44\u6E90\uFF08" + loaded + "/" + total + "\uFF09";
                if (loaded == total) {
                    _this.showLoading = false;
                }
            };
            new MTLLoader_js.MTLLoader(manager).load(this.objInfo.mtlUrl, function (MaterialCreator) {
                var _loop_1 = function (name) {
                    var materialInfo = MaterialCreator.materialsInfo[name];
                    // 需要处理的贴图类型
                    var mapTypes = [
                        'map_kd',
                        'map_ks',
                        'map_ka',
                        'map_d',
                        'map_bump',
                        'bump',
                        'disp',
                        'decal' // 贴花贴图
                    ];
                    mapTypes.map(function (type) {
                        if (materialInfo.hasOwnProperty(type)) {
                            var map_type_url = materialInfo[type];
                            var map_type_name = map_type_url.split(/[\/\\]/).pop();
                            materialInfo[type] = baseUrl + '/' + map_type_name;
                        }
                    });
                };
                // 在preload()之前先处理材质信息,如果有贴图,则替换为obj同目录下的图片
                for (var name in MaterialCreator.materialsInfo) {
                    _loop_1(name);
                }
                MaterialCreator.preload();
                new OBJLoader_js.OBJLoader(manager).setMaterials(MaterialCreator).load(_this.objInfo.objUrl, function (object) {
                    _this.objScene = object;
                    var box = new THREE__namespace.Box3().setFromObject(_this.objScene);
                    _this.size = box.getSize(new THREE__namespace.Vector3()).length();
                    _this.center = box.getCenter(new THREE__namespace.Vector3());
                    //将坐标系原点设置在模型中心
                    _this.objScene.position.x -= _this.center.x;
                    _this.objScene.position.y -= _this.center.y;
                    _this.objScene.position.z -= _this.center.z;
                    //PerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number )
                    // fov — 摄像机视锥体垂直视野角度,眼睛张开的角度,0闭眼
                    // aspect — 摄像机视锥体长宽比
                    // near — 摄像机视锥体近端面,能看到的最近垂直距离
                    // far — 摄像机视锥体远端面,能看到的最远垂直距离
                    _this.camera = new THREE__namespace.PerspectiveCamera(50, _this.domWidth / _this.domHeight, _this.size / 100, _this.size * 100);
                    _this.camera.updateProjectionMatrix();
                    //position-摄像机位置
                    //lookAt-摄像机望向位置  
                    _this.setCameraPlacement();
                    //controls
                    _this.controls = new OrbitControls.OrbitControls(_this.camera, _this.renderer.domElement);
                    //根据模型size初始化state部分参数
                    _this.state.directionalLightPosition.x = _this.size;
                    _this.state.directionalLightPosition.y = _this.size / 2;
                    _this.state.directionalLightPosition.z = _this.size;
                    _this.state.directionalLightPosition2.x = -_this.size;
                    _this.state.directionalLightPosition2.y = -_this.size / 2;
                    _this.state.directionalLightPosition2.z = -_this.size;
                    _this.state.pointLightPosition.x = _this.size / 2;
                    _this.state.pointLightPosition.y = 0;
                    _this.state.pointLightPosition.z = 0;
                    _this.state.pointLightDistance = _this.size;
                    //添加默认光源(添加至camera,光源固定位置,不随场景旋转)
                    // this.scene.add(this.camera);
                    // let defaultLight = new THREE.DirectionalLight('#FFFFFF', 1.5);
                    // defaultLight.position.set(0, 0, this.size / 2);
                    // this.camera.add(defaultLight);
                    //添加GUI控制面板
                    if (_this.controlMode) {
                        _this.addGUI();
                    }
                    else {
                        if (_this.gui) {
                            _this.gui.destroy();
                            _this.gui = null;
                        }
                    }
                    //根据state参数初始化相关设置
                    _this.updateToneMapping();
                    _this.updateToneMappingExposure();
                    _this.updateBackground();
                    _this.toggleAxesHelper();
                    _this.toggleWireframe();
                    _this.toggleAutoRotate();
                    _this.toggleAmbientLight();
                    // this.updateAmbientLight();
                    _this.toggleDirectionalLight();
                    // this.updateDirectionalLight();
                    _this.toggleDirectionalLightHelper();
                    _this.toggleDirectionalLight2();
                    // this.updateDirectionalLight2();
                    _this.toggleDirectionalLightHelper2();
                    _this.togglePointLight();
                    // this.updatePointLight();
                    _this.togglePointLightHelper();
                    _this.scene.add(_this.objScene);
                }, function (xhr) {
                    if (xhr.loaded != xhr.total) {
                        _this.loadingText2 = '模型下载 ' + (xhr.loaded / xhr.total * 100).toFixed(0) + ' %';
                    }
                    else {
                        _this.loadingText2 = '';
                    }
                });
            });
        };
        //设置相机角度和望向位置
        ObjViewerComponent.prototype.setCameraPlacement = function () {
            switch (this.cameraPlacement) {
                case 'left': //x-红
                    this.camera.position.set(-this.size, 0, 0);
                    this.camera.lookAt(0, 0, 0);
                    break;
                case 'right': //x-红
                    this.camera.position.set(this.size, 0, 0);
                    this.camera.lookAt(0, 0, 0);
                    break;
                case 'top': //y-绿
                    this.camera.position.set(0, this.size, 0);
                    this.camera.lookAt(0, 0, 0);
                    break;
                case 'bottom': //y-绿
                    this.camera.position.set(0, -this.size, 0);
                    this.camera.lookAt(0, 0, 0);
                    break;
                case 'front': //z-蓝
                    this.camera.position.set(0, 0, this.size);
                    this.camera.lookAt(0, 0, 0);
                    break;
                case 'back': //z-蓝
                    this.camera.position.set(0, 0, -this.size);
                    this.camera.lookAt(0, 0, 0);
                    break;
                default:
                    this.camera.position.set(this.size / 1.3, this.size / 1.5, this.size / 1.3);
                    this.camera.lookAt(0, 0, 0);
                    break;
            }
        };
        //add GUI
        ObjViewerComponent.prototype.addGUI = function () {
            var _this = this;
            //折叠参数
            var closeState = {
                gui: false,
                displayFolder: false,
                ambientLightFolder: true,
                directionalLightFolder: true,
                directionalLightHelperFolder: false,
                directionalLightFolder2: true,
                directionalLightHelperFolder2: false,
                pointLightFolder: true,
                pointlLightHelperFolder: false
            };
            if (this.gui) {
                //记录上个gui的面板折叠值
                closeState = {
                    gui: this.gui._closed,
                    displayFolder: this.gui.children[0]._closed,
                    ambientLightFolder: this.gui.children[1]._closed,
                    directionalLightFolder: this.gui.children[2]._closed,
                    directionalLightHelperFolder: this.gui.children[2].children[3]._closed,
                    directionalLightFolder2: this.gui.children[3]._closed,
                    directionalLightHelperFolder2: this.gui.children[3].children[3]._closed,
                    pointLightFolder: this.gui.children[4]._closed,
                    pointlLightHelperFolder: this.gui.children[4].children[5]._closed
                };
                this.gui.destroy();
                this.gui = null;
            }
            this.gui = new lilGui_module_min.GUI({ title: '控制面板', container: this.eleRef.nativeElement.querySelector('#control') });
            if (closeState.gui) {
                this.gui.close();
            }
            var displayFolder = this.gui.addFolder('显示设置');
            if (closeState.displayFolder) {
                displayFolder.close();
            }
            displayFolder.add(this.state, 'toneMapping', {
                'ACESFilmic': THREE__namespace.ACESFilmicToneMapping,
                'Linear': THREE__namespace.LinearToneMapping,
                'Reinhard': THREE__namespace.ReinhardToneMapping,
                'Cineon': THREE__namespace.CineonToneMapping,
                'AgX': THREE__namespace.AgXToneMapping,
                'Neutral': THREE__namespace.NeutralToneMapping
            }).name('色调').onChange(function () { return _this.updateToneMapping(); });
            displayFolder.add(this.state, 'toneMappingExposure', -10, 5, 0.01).name('曝光').onChange(function () { return _this.updateToneMappingExposure(); });
            displayFolder.add(this.state, 'background').name('启用场景背景').listen().onChange(function () { return _this.updateBackground(); });
            displayFolder.addColor(this.state, 'backgroundColor').name('场景背景色').listen().onChange(function () { return _this.updateBackground(); });
            //传入背景图才显示背景图设置
            if (this.bgUrl) {
                displayFolder.add(this.state, 'useBgUrl').name('使用背景贴图').listen().onChange(function () { return _this.updateBackground(); });
                displayFolder.add(this.state, 'useBgSphere').name('球形背景贴图').listen().onChange(function () { return _this.updateBackground(); });
            }
            displayFolder.add(this.state, 'axesHelper').name('坐标系').onChange(function () { return _this.toggleAxesHelper(); });
            displayFolder.add(this.state, 'wireframe').name('线框模式').onChange(function () { return _this.toggleWireframe(); });
            displayFolder.add(this.state, 'autoRotate').listen().name('自动旋转').onChange(function () { return _this.toggleAutoRotate(); });
            displayFolder.add(this.state, 'autoRotateSpeed', -10.0, 10.0, 0.1).listen().name('旋转速度').onChange(function () { return _this.toggleAutoRotate(); });
            var ambientLightFolder = this.gui.addFolder('环境光');
            if (closeState.ambientLightFolder) {
                ambientLightFolder.close();
            }
            ambientLightFolder.add(this.state, 'ambientLight').name('启用').onChange(function () { return _this.toggleAmbientLight(); });
            ambientLightFolder.addColor(this.state, 'ambientLightColor').name('颜色').onChange(function () { return _this.updateAmbientLight(); });
            ambientLightFolder.add(this.state, 'ambientLightIntensity', 0, 10, 0.1).name('强度').onChange(function () { return _this.updateAmbientLight(); });
            var directionalLightFolder = this.gui.addFolder('定向光1');
            if (closeState.directionalLightFolder) {
                directionalLightFolder.close();
            }
            directionalLightFolder.add(this.state, 'directionalLight').name('启用').onChange(function () { return _this.toggleDirectionalLight(); });
            directionalLightFolder.addColor(this.state, 'directionalLightColor').name('颜色').onChange(function () { return _this.updateDirectionalLight(); });
            directionalLightFolder.add(this.state, 'directionalLightIntensity', 0, 10, 0.1).name('强度').onChange(function () { return _this.updateDirectionalLight(); });
            var directionalLightHelperFolder = directionalLightFolder.addFolder('定向光位置');
            if (closeState.directionalLightHelperFolder) {
                directionalLightHelperFolder.close();
            }
            directionalLightHelperFolder.add(this.state, 'directionalLightHelper').listen().name('位置模拟').onChange(function () { return _this.toggleDirectionalLightHelper(); });
            directionalLightHelperFolder.add(this.state.directionalLightPosition, 'x', -this.size, this.size).name('x(坐标系-红)').decimals(2).onChange(function () { return _this.updateDirectionalLight(); });
            directionalLightHelperFolder.add(this.state.directionalLightPosition, 'y', -this.size, this.size).name('y(坐标系-绿)').decimals(2).onChange(function () { return _this.updateDirectionalLight(); });
            directionalLightHelperFolder.add(this.state.directionalLightPosition, 'z', -this.size, this.size).name('z(坐标系-蓝)').decimals(2).onChange(function () { return _this.updateDirectionalLight(); });
            var directionalLightFolder2 = this.gui.addFolder('定向光2');
            if (closeState.directionalLightFolder2) {
                directionalLightFolder2.close();
            }
            directionalLightFolder2.add(this.state, 'directionalLight2').name('启用').onChange(function () { return _this.toggleDirectionalLight2(); });
            directionalLightFolder2.addColor(this.state, 'directionalLightColor2').name('颜色').onChange(function () { return _this.updateDirectionalLight2(); });
            directionalLightFolder2.add(this.state, 'directionalLightIntensity2', 0, 10, 0.1).name('强度').onChange(function () { return _this.updateDirectionalLight2(); });
            var directionalLightHelperFolder2 = directionalLightFolder2.addFolder('定向光位置');
            if (closeState.directionalLightHelperFolder2) {
                directionalLightHelperFolder2.close();
            }
            directionalLightHelperFolder2.add(this.state, 'directionalLightHelper2').listen().name('位置模拟').onChange(function () { return _this.toggleDirectionalLightHelper2(); });
            directionalLightHelperFolder2.add(this.state.directionalLightPosition2, 'x', -this.size, this.size).name('x(坐标系-红)').decimals(2).onChange(function () { return _this.updateDirectionalLight2(); });
            directionalLightHelperFolder2.add(this.state.directionalLightPosition2, 'y', -this.size, this.size).name('y(坐标系-绿)').decimals(2).onChange(function () { return _this.updateDirectionalLight2(); });
            directionalLightHelperFolder2.add(this.state.directionalLightPosition2, 'z', -this.size, this.size).name('z(坐标系-蓝)').decimals(2).onChange(function () { return _this.updateDirectionalLight2(); });
            var pointLightFolder = this.gui.addFolder('点光源');
            if (closeState.pointLightFolder) {
                pointLightFolder.close();
            }
            pointLightFolder.add(this.state, 'pointLight').name('启用').onChange(function () { return _this.togglePointLight(); });
            pointLightFolder.addColor(this.state, 'pointLightColor').name('颜色').onChange(function () { return _this.updatePointLight(); });
            pointLightFolder.add(this.state, 'pointLightIntensity', 0, 10, 0.1).name('强度').onChange(function () { return _this.updatePointLight(); });
            pointLightFolder.add(this.state, 'pointLightDistance', 0, this.size).name('范围').decimals(2).onChange(function () { return _this.updatePointLight(); });
            pointLightFolder.add(this.state, 'pointLightDecay', 0, 2, 0.1).name('衰减').onChange(function () { return _this.updatePointLight(); });
            var pointlLightHelperFolder = pointLightFolder.addFolder('点光源位置');
            if (closeState.pointlLightHelperFolder) {
                pointlLightHelperFolder.close();
            }
            pointlLightHelperFolder.add(this.state, 'pointLightHelper').listen().name('位置模拟').onChange(function () { return _this.togglePointLightHelper(); });
            pointlLightHelperFolder.add(this.state.pointLightPosition, 'x', -this.size, this.size).name('x(坐标系-红)').decimals(2).onChange(function () { return _this.updatePointLight(); });
            pointlLightHelperFolder.add(this.state.pointLightPosition, 'y', -this.size, this.size).name('y(坐标系-绿)').decimals(2).onChange(function () { return _this.updatePointLight(); });
            pointlLightHelperFolder.add(this.state.pointLightPosition, 'z', -this.size, this.size).name('z(坐标系-蓝)').decimals(2).onChange(function () { return _this.updatePointLight(); });
        };
        //色调
        ObjViewerComponent.prototype.updateToneMapping = function () {
            this.renderer.toneMapping = this.state.toneMapping;
        };
        //曝光
        ObjViewerComponent.prototype.updateToneMappingExposure = function () {
            this.renderer.toneMappingExposure = Math.pow(2, this.state.toneMappingExposure);
        };
        //背景
        ObjViewerComponent.prototype.updateBackground = function () {
            var _this = this;
            // 移除已存在的背景球体
            if (this.backgroundSphere) {
                this.scene.remove(this.backgroundSphere);
                this.backgroundSphere = null;
            }
            //启用背景
            if (this.state.background) {
                //使用背景图
                if (this.state.useBgUrl && this.bgUrl) {
                    //使用球体背景
                    if (this.state.useBgSphere) {
                        // 创建球形几何体
                        var geometry_1 = new THREE__namespace.SphereGeometry(this.size * 50, 32, 32);
                        // 将法线朝内,这样纹理会显示在球体内侧
                        geometry_1.scale(-1, 1, 1);
                        // 加载背景图纹理
                        new THREE__namespace.TextureLoader().load(this.bgUrl, function (texture) {
                            texture.colorSpace = THREE__namespace.SRGBColorSpace;
                            var material = new THREE__namespace.MeshBasicMaterial({
                                map: texture
                            });
                            _this.backgroundSphere = new THREE__namespace.Mesh(geometry_1, material);
                            _this.scene.add(_this.backgroundSphere);
                        });
                    }
                    else {
                        //使用平面背景图
                        new THREE__namespace.TextureLoader().load(this.bgUrl, function (texture) {
                            texture.colorSpace = THREE__namespace.SRGBColorSpace;
                            _this.scene.background = texture;
                        });
                    }
                }
                else {
                    //使用背景色
                    this.scene.background = new THREE__namespace.Color(this.state.backgroundColor);
                }
            }
            else {
                //关闭背景
                this.scene.background = null;
            }
        };
        ObjViewerComponent.prototype.toggleAxesHelper = function () {
            //x-红,y-绿,z-蓝
            if (this.state.axesHelper) {
                if (this.axesHelper) {
                    this.scene.remove(this.axesHelper);
                    this.axesHelper = null;
                }
                this.axesHelper = new THREE__namespace.AxesHelper(this.size);
                this.scene.add(this.axesHelper);
            }
            else {
                if (this.axesHelper) {
                    this.scene.remove(this.axesHelper);
                    this.axesHelper = null;
                }
            }
        };
        //线框模式
        ObjViewerComponent.prototype.toggleWireframe = function () {
            var _this = this;
            this.traverseMaterials(this.objScene, function (material) {
                material.wireframe = _this.state.wireframe;
                if (material instanceof THREE__namespace.PointsMaterial) {
                    material.size = 1;
                }
            });
        };
        //遍历材质
        ObjViewerComponent.prototype.traverseMaterials = function (object, callback) {
            object.traverse(function (node) {
                if (!node.geometry)
                    return;
                var materials = Array.isArray(node.material) ? node.material : [node.material];
                materials.forEach(callback);
            });
        };
        //自动旋转
        ObjViewerComponent.prototype.toggleAutoRotate = function () {
            this.controls.autoRotate = this.state.autoRotate;
            this.controls.autoRotateSpeed = this.state.autoRotateSpeed;
        };
        ObjViewerComponent.prototype.toggleAmbientLight = function () {
            if (this.state.ambientLight) {
                if (this.ambientLight) {
                    this.scene.remove(this.ambientLight);
                    this.ambientLight = null;
                }
                this.ambientLight = new THREE__namespace.AmbientLight(this.state.ambientLightColor, this.state.ambientLightIntensity);
                this.scene.add(this.ambientLight);
            }
            else {
                if (this.ambientLight) {
                    this.scene.remove(this.ambientLight);
                    this.ambientLight = null;
                }
            }
        };
        //更新环境光
        ObjViewerComponent.prototype.updateAmbientLight = function () {
            if (this.state.ambientLight) {
                this.ambientLight.color.set(this.state.ambientLightColor);
                this.ambientLight.intensity = this.state.ambientLightIntensity;
            }
        };
        ObjViewerComponent.prototype.toggleDirectionalLight = function () {
            if (this.state.directionalLight) {
                if (this.directionalLight) {
                    this.scene.remove(this.directionalLight);
                    this.directionalLight = null;
                }
                this.directionalLight = new THREE__namespace.DirectionalLight(this.state.directionalLightColor, this.state.directionalLightIntensity);
                this.directionalLight.position.set(this.state.directionalLightPosition.x, this.state.directionalLightPosition.y, this.state.directionalLightPosition.z);
                this.scene.add(this.directionalLight);
            }
            else {
                if (this.directionalLight) {
                    this.scene.remove(this.directionalLight);
                    this.directionalLight = null;
                }
                //关闭位置模拟
                this.state.directionalLightHelper = false;
                this.toggleDirectionalLightHelper();
            }
        };
        //更新定向光
        ObjViewerComponent.prototype.updateDirectionalLight = function () {
            if (this.state.directionalLight) {
                this.directionalLight.color.set(this.state.directionalLightColor);
                this.directionalLight.intensity = this.state.directionalLightIntensity;
                this.directionalLight.position.set(this.state.directionalLightPosition.x, this.state.directionalLightPosition.y, this.state.directionalLightPosition.z);
                if (this.directionalLightHelper) {
                    this.directionalLightHelper.update();
                }
            }
        };
        ObjViewerComponent.prototype.toggleDirectionalLightHelper = function () {
            if (this.state.directionalLightHelper) {
                if (this.directionalLight) { //开启定向光才能开启位置模拟
                    if (this.directionalLightHelper) {
                        this.scene.remove(this.directionalLightHelper);
                        this.directionalLightHelper = null;
                    }
                    this.directionalLightHelper = new THREE__namespace.DirectionalLightHelper(this.directionalLight, this.size / 20, 0xff0000);
                    this.scene.add(this.directionalLightHelper);
                }
                else {
                    this.state.directionalLightHelper = false;
                }
            }
            else {
                if (this.directionalLightHelper) {
                    this.scene.remove(this.directionalLightHelper);
                    this.directionalLightHelper = null;
                }
            }
        };
        ObjViewerComponent.prototype.toggleDirectionalLight2 = function () {
            if (this.state.directionalLight2) {
                if (this.directionalLight2) {
                    this.scene.remove(this.directionalLight2);
                    this.directionalLight2 = null;
                }
                this.directionalLight2 = new THREE__namespace.DirectionalLight(this.state.directionalLightColor2, this.state.directionalLightIntensity2);
                this.directionalLight2.position.set(this.state.directionalLightPosition2.x, this.state.directionalLightPosition2.y, this.state.directionalLightPosition2.z);
                this.scene.add(this.directionalLight2);
            }
            else {
                if (this.directionalLight2) {
                    this.scene.remove(this.directionalLight2);
                    this.directionalLight2 = null;
                }
                //关闭位置模拟
                this.state.directionalLightHelper2 = false;
                this.toggleDirectionalLightHelper2();
            }
        };
        //更新定向光2
        ObjViewerComponent.prototype.updateDirectionalLight2 = function () {
            if (this.state.directionalLight2) {
                this.directionalLight2.color.set(this.state.directionalLightColor2);
                this.directionalLight2.intensity = this.state.directionalLightIntensity2;
                this.directionalLight2.position.set(this.state.directionalLightPosition2.x, this.state.directionalLightPosition2.y, this.state.directionalLightPosition2.z);
                if (this.directionalLightHelper2) {
                    this.directionalLightHelper2.update();
                }
            }
        };
        ObjViewerComponent.prototype.toggleDirectionalLightHelper2 = function () {
            if (this.state.directionalLightHelper2) {
                if (this.directionalLight2) { //开启定向光才能开启位置模拟
                    if (this.directionalLightHelper2) {
                        this.scene.remove(this.directionalLightHelper2);
                        this.directionalLightHelper2 = null;
                    }
                    this.directionalLightHelper2 = new THREE__namespace.DirectionalLightHelper(this.directionalLight2, this.size / 20, 0xffff00);
                    this.scene.add(this.directionalLightHelper2);
                }
                else {
                    this.state.directionalLightHelper2 = false;
                }
            }
            else {
                if (this.directionalLightHelper2) {
                    this.scene.remove(this.directionalLightHelper2);
                    this.directionalLightHelper2 = null;
                }
            }
        };
        ObjViewerComponent.prototype.togglePointLight = function () {
            if (this.state.pointLight) {
                if (this.pointLight) {
                    this.scene.remove(this.pointLight);
                    this.pointLight = null;
                }
                //PointLight( color : Integer, intensity : Float, distance : Number, decay : Float )
                this.pointLight = new THREE__namespace.PointLight(this.state.pointLightColor, this.state.pointLightIntensity, this.state.pointLightDistance, this.state.pointLightDecay);
                this.pointLight.position.set(this.state.pointLightPosition.x, this.state.pointLightPosition.y, this.state.pointLightPosition.z);
                this.scene.add(this.pointLight);
            }
            else {
                if (this.pointLight) {
                    this.scene.remove(this.pointLight);
                    this.pointLight = null;
                }
                //关闭位置模拟
                this.state.pointLightHelper = false;
                this.togglePointLightHelper();
            }
        };
        //更新点光源
        ObjViewerComponent.prototype.updatePointLight = function () {
            if (this.state.pointLight) {
                this.pointLight.color.set(this.state.pointLightColor);
                this.pointLight.intensity = this.state.pointLightIntensity;
                this.pointLight.decay = this.state.pointLightDecay;
                this.pointLight.distance = this.state.pointLightDistance;
                this.pointLight.position.set(this.state.pointLightPosition.x, this.state.pointLightPosition.y, this.state.pointLightPosition.z);
                if (this.pointLightHelper) {
                    this.pointLightHelper.update();
                }
            }
        };
        ObjViewerComponent.prototype.togglePointLightHelper = function () {
            if (this.state.pointLightHelper) {
                if (this.pointLight) { //开启点光源才能开启位置模拟
                    if (this.pointLightHelper) {
                        this.scene.remove(this.pointLightHelper);
                        this.pointLightHelper = null;
                    }
                    this.pointLightHelper = new THREE__namespace.PointLightHelper(this.pointLight, this.size / 20, 0x2bff00);
                    this.scene.add(this.pointLightHelper);
                }
                else {
                    this.state.pointLightHelper = false;
                }
            }
            else {
                if (this.pointLightHelper) {
                    this.scene.remove(this.pointLightHelper);
                    this.pointLightHelper = null;
                }
            }
        };
        //webgl销毁
        ObjViewerComponent.prototype.webglLoseContext = function () {
            var objCanvasDom = this.eleRef.nativeElement.querySelector(this.domId + " canvas");
            if (objCanvasDom) {
                //手动销毁WebGL context对象(最多16个,超出的话最先加载的会被移除)
                var gl = objCanvasDom.getContext('webgl2');
                gl.getExtension('WEBGL_lose_context').loseContext();
                //dom移除
                objCanvasDom.remove();
            }
        };
        return ObjViewerComponent;
    }());
    ObjViewerComponent.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0__namespace, type: ObjViewerComponent, deps: [{ token: i0__namespace.ElementRef }, { token: LocalService }], target: i0__namespace.ɵɵFactoryTarget.Component });
    ObjViewerComponent.ɵcmp = i0__namespace.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ObjViewerComponent, selector: "nc-obj-viewer", inputs: { ncObjInfo: "ncObjInfo", ncCameraPlacement: "ncCameraPlacement", ncBg: "ncBg", ncBgColor: "ncBgColor", ncBgUrl: "ncBgUrl", ncTips: "ncTips", ncControl: "ncControl", ncAlpha: "ncAlpha", ncAutoRotate: "ncAutoRotate", ncAutoRotateSpeed: "ncAutoRotateSpeed" }, ngImport: i0__namespace, template: "<div id=\"objViewer\" *ngIf=\"parametersOk\">\r\n    <div class=\"loading\" *ngIf=\"showLoading\">\r\n        <div class=\"nc-loading\">\r\n            <svg class=\"nc-loading-svg\" version=\"1.1\" viewBox=\"0 0 60 60\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\"\r\n                xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n                <defs>\r\n                    <clipPath id=\"d-5\">\r\n                        <use width=\"100%\" height=\"100%\" overflow=\"visible\" xlink:href=\"#c\" />\r\n                    </clipPath>\r\n                </defs>\r\n                <g transform=\"translate(4.4 -.117)\">\r\n                    <defs>\r\n                        <path id=\"a\" d=\"m-5-1h62v62h-62z\" />\r\n                    </defs>\r\n                    <clipPath id=\"b\">\r\n                        <use width=\"100%\" height=\"100%\" overflow=\"visible\" xlink:href=\"#a\" />\r\n                    </clipPath>\r\n                    <g clip-path=\"url(#b)\">\r\n                        <defs>\r\n                            <path id=\"c\" d=\"m-5-1h62v62h-62z\" />\r\n                        </defs>\r\n                        <clipPath id=\"d\">\r\n                            <use width=\"100%\" height=\"100%\" overflow=\"visible\" xlink:href=\"#c\" />\r\n                        </clipPath>\r\n                        <g style=\"stroke:var(--ov_logo_border_color);\" stroke=\"#000\" stroke-linecap=\"round\"\r\n                            stroke-linejoin=\"round\" stroke-miterlimit=\"10\">\r\n                            <path transform=\"translate(.039092 .02257)\"\r\n                                d=\"m38.361 22.877-12.4-7.3 9.2e-5 -14.177 24.8 14.2v28.8l-12.4-7.3226z\"\r\n                                clip-path=\"url(#d)\" fill=\"#4688b4\" />\r\n                            <path transform=\"rotate(120,26,30.082)\"\r\n                                d=\"m38.4 22.923-12.522-7.0887 0.14178-14.4 24.78 14.166v28.8l-12.522-7.0883z\"\r\n                                clip-path=\"url(#d-5)\" fill=\"#64c0ff\" />\r\n                            <path d=\"m26 30v14.4l12.4-7.3v-14.2z\" clip-path=\"url(#d)\" fill=\"#294e67\" />\r\n                            <path d=\"m13.6 37.1v-14.2l12.4-7.3v-14.177l-24.8 14.177v28.8z\" clip-path=\"url(#d)\"\r\n                                fill=\"#294e67\" />\r\n                            <path d=\"m26 15.6-12.4 7.3 12.4 7.1 12.4-7.1z\" clip-path=\"url(#d)\" fill=\"#64c0ff\" />\r\n                            <path d=\"m13.6 22.9 12.4 7.1v14.4l-12.4-7.3z\" clip-path=\"url(#d)\" fill=\"#4688b4\" />\r\n                        </g>\r\n                    </g>\r\n                </g>\r\n            </svg>\r\n            <div class=\"ncTips\">\r\n                <div>{{loadingText}}</div>\r\n                <div>{{loadingText2}}</div>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    <div id=\"tips\" *ngIf=\"tipsMode\">\r\n        <div class=\"tip-row\">\r\n            <div class=\"row-img\">\r\n                <img\r\n                    src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iTGF5ZXJfMSIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHdpZHRoPSI2NHB4IgogICBoZWlnaHQ9IjY0cHgiCiAgIHZpZXdCb3g9IjAgMCA2NCA2NCIKICAgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNjQgNjQiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDguNCByOTkzOSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iTW91c2VMZWZ0LnN2ZyI+PG1ldGFkYXRhCiAgIGlkPSJtZXRhZGF0YTIxIj48cmRmOlJERj48Y2M6V29yawogICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+PGRjOnRpdGxlIC8+PC9jYzpXb3JrPjwvcmRmOlJERj48L21ldGFkYXRhPjxkZWZzCiAgIGlkPSJkZWZzMTkiIC8+PHNvZGlwb2RpOm5hbWVkdmlldwogICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICBib3JkZXJvcGFjaXR5PSIxIgogICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICBncmlkdG9sZXJhbmNlPSIxMCIKICAgZ3VpZGV0b2xlcmFuY2U9IjEwIgogICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMjgyIgogICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4ODYiCiAgIGlkPSJuYW1lZHZpZXcxNyIKICAgc2hvd2dyaWQ9ImZhbHNlIgogICBpbmtzY2FwZTp6b29tPSIzLjY4NzUiCiAgIGlua3NjYXBlOmN4PSItMTAuMzA1MDg1IgogICBpbmtzY2FwZTpjeT0iMzIiCiAgIGlua3NjYXBlOndpbmRvdy14PSIxMDQiCiAgIGlua3NjYXBlOndpbmRvdy15PSIxMzYiCiAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiCiAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImczIiAvPgo8ZwogICBpZD0iZzMiPgoJPGcKICAgaWQ9Imc1IgogICBzdHlsZT0iZmlsbDojNGQ0ZDRkO3N0cm9rZTojNGQ0ZDRkIj4KCQk8cGF0aAogICBmaWxsPSIjMDIwMjAyIgogICBkPSJNMzIuODU0LDIwLjAyOGMtMC4wMTUtMS4yNzQsMC41NzYtMi4yNjksMS4xNTEtMy4yMzZjMC43NTgtMS4yNzgsMS41NDMtMi42LDAuOTk3LTQuNDE3ICAgIGMtMC41NTUtMS42NjctMS42MDctMi40ODUtMi41MzktMy4yMTJjLTEuMjU0LTAuOTczLTIuMTU5LTEuNjc2LTEuNjg3LTQuMzQzbDAuMDQxLTAuMjI5bC0xLjM1LTAuMjM4TDI5LjQyNyw0LjU4ICAgIGMtMC42MTUsMy40ODQsMC44NzgsNC42NDMsMi4xOTUsNS42NjZjMC44NSwwLjY2MywxLjY1MywxLjI4OCwyLjA3MiwyLjU0MmMwLjM2NiwxLjIyNC0wLjE4LDIuMTQzLTAuODY5LDMuMzA2ICAgIGMtMC42NDEsMS4wODEtMS4zNjYsMi4zLTEuMzQ5LDMuOTMzYy02LjgzNywwLjAwNy0xMy44MjMsMC4yOTEtMTMuODIzLDI0LjU5YzAsMTAuOTUxLDguNzk5LDE1LjAzMiwxNC4zNDcsMTUuMDMyICAgIGM1LjU0NSwwLDE0LjM0Ny00LjA4MSwxNC4zNDctMTUuMDMyQzQ2LjM0NywyMC4zNDcsMzkuMjI4LDIwLjA0OCwzMi44NTQsMjAuMDI4eiBNMzIuNjg1LDIxLjM5OSAgICBjNS42NDMsMC4wMTIsMTAuOTI3LDAuMjM2LDEyLjA2MywxNi4xNTNjLTMuODYsMS44MDUtNy45MTYsMi43NjUtMTIuMDYzLDIuODZ2LTIuOTY2YzAuODQ1LTAuMTYyLDEuNDgxLTAuOTA5LDEuNDgxLTEuNzgydi04Ljk1NiAgICBjMC0wLjg3Ni0wLjYzNy0xLjYyMS0xLjQ4MS0xLjc4NFYyMS4zOTl6IE0zMS42NTgsMjYuMjU0aDAuNjg1YzAuMjQ5LDAsMC40NTMsMC4yMDUsMC40NTMsMC40NTR2OC45NTYgICAgYzAsMC4yNDktMC4yMDQsMC40NDktMC40NTMsMC40NDloLTAuNjg1Yy0wLjI0OSwwLTAuNDUyLTAuMi0wLjQ1Mi0wLjQ0OXYtOC45NTZDMzEuMjA2LDI2LjQ1OSwzMS40MDksMjYuMjU0LDMxLjY1OCwyNi4yNTR6ICAgICBNMzEuMzEzLDIxLjM5OXYzLjUyNWMtMC44NDUsMC4xNjMtMS40NzksMC45MS0xLjQ3OSwxLjc4NHY4Ljk1NmMwLDAuODczLDAuNjM0LDEuNjIsMS40NzksMS43ODJ2Mi45NjYgICAgYy02LjMxMS0wLjE0OC0xMC45MDUtMi4yNTItMTIuMDYzLTIuODM5QzIwLjM4MSwyMS42MzMsMjUuNjY4LDIxLjQxMSwzMS4zMTMsMjEuMzk5eiBNMzIsNTguMjc0ICAgIGMtNS4wMTYsMC0xMi45NzYtMy43MDctMTIuOTc2LTEzLjY1OGMwLTEuOTgzLDAuMDQ1LTMuODUzLDAuMTM0LTUuNTYzYzIuMDAzLDAuOTI5LDYuNjk2LDIuNzQsMTIuODY4LDIuNzQgICAgYzQuMzk0LDAsOC43MDQtMC45MzQsMTIuODEzLTIuNzcxYzAuMDg5LDEuNzE4LDAuMTM1LDMuNiwwLjEzNSw1LjU5NUM0NC45NzQsNTQuNTY3LDM3LjAxNiw1OC4yNzQsMzIsNTguMjc0eiIKICAgaWQ9InBhdGg3IgogICBzdHlsZT0iZmlsbDojNGQ0ZDRkO3N0cm9rZTojNGQ0ZDRkIiAvPgoJPC9nPgoJCgkKPHBhdGgKICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtzdHJva2U6I2ZmZmZmZjtzdHJva2Utd2lkdGg6MC4yNzExODY0NCIKICAgZD0ibSAzMi45MjIwMzQsMzguOTUwNzkzIGMgMCwtMS4xMzU4MjUgMC4xMTQ5MTksLTEuNDU4MDQ1IDAuNjc3OTY2LC0xLjkwMDkzOCBsIDAuNjc3OTY2LC0wLjUzMzI4OCAwLC01LjI4MDc4IGMgMCwtNS4yNzEyNDkgLTAuMDAxMiwtNS4yODIwMDMgLTAuNjc3OTY2LC01Ljk1ODc0NSAtMC41NTc0MzksLTAuNTU3NDM5IC0wLjY3Nzk2NiwtMC45NDA5MzUgLTAuNjc3OTY2LC0yLjE1NzE2NSBsIDAsLTEuNDc5MTk5IDEuNTM1NDg3LDAgYyA1LjY1NzU1NCwwIDguNTg0MzM4LDMuNzI4NTI5IDkuNzE4NTUsMTIuMzgwNzkxIDAuNDk4NDM0LDMuODAyMjY1IDAuNTAzNDgsMy41MjU3MzEgLTAuMDY3NiwzLjcwNDU3MiAtMC4yNjEwMTcsMC4wODE3NCAtMS41Mjg2OTQsMC41MTIwMTYgLTIuODE3MDU5LDAuOTU2MTY3IC0yLjAzNzIwNiwwLjcwMjMwNiAtNC4wNDgwMzIsMS4xMTMwNDQgLTcuNDg4MDI2LDEuNTI5NTI4IGwgLTAuODgxMzU2LDAuMTA2NzA3IDAsLTEuMzY3NjUgeiIKICAgaWQ9InBhdGgzNzY4IgogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPjxwYXRoCiAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjAuMjcxMTg2NDQiCiAgIGQ9Im0gMzEuNDg1MDgxLDM1Ljg0MjE0MyBjIC0wLjEwNDU5MSwtMC4xMDQ1OTEgLTAuMTkwMTY2LC0yLjIzMTM0NyAtMC4xOTAxNjYsLTQuNzI2MTIzIDAsLTMuOTgzOTk0IDAuMDU1MDIsLTQuNTU3MDcxIDAuNDUyMTI3LC00LjcwOTQ1NiAwLjI0ODY3LC0wLjA5NTQyIDAuNTU2ODAyLC0wLjA2ODgyIDAuNjg0NzM4LDAuMDU5MTIgMC4xMjc5MzcsMC4xMjc5MzYgMC4xOTkwNTYsMi4yOTY0ODEgMC4xNTgwNDMsNC44MTg5ODggLTAuMDYzMTksMy44ODY0MDUgLTAuMTM4NjcsNC41OTg2ODMgLTAuNDk0NTcyLDQuNjY3MDA5IC0wLjIzMTAwMywwLjA0NDM1IC0wLjUwNTU3OSwtMC4wMDQ5IC0wLjYxMDE3LC0wLjEwOTUzMyBsIDAsMCB6IgogICBpZD0icGF0aDM3NzAiCiAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PHBhdGgKICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtzdHJva2U6I2ZmZmZmZjtzdHJva2Utd2lkdGg6MC4yNzExODY0NCIKICAgZD0ibSAzMC40NDA0MzMsNTcuOTQ1MzE2IGMgLTMuMDY0MDUzLC0wLjQyMTEzIC02Ljc3NzIzLC0yLjQ3NDk1MyAtOC40NTc2MjEsLTQuNjc4MDYgLTIuMTU4OCwtMi44MzAzMzMgLTMuMTEzOTE4LC02LjczNzcxNiAtMi43Njk1OTIsLTExLjMzMDM4NSBsIDAuMTkzMTIxLC0yLjU3NTg3MiAyLjA3OTg4LDAuNzM1NjI4IGMgMy41MjcwMjYsMS4yNDc0NjYgNi4zMzc3MDEsMS43MTkwNjggMTAuMjE1NDc0LDEuNzE0MDUgNC4xNzE3NzEsLTAuMDA1NCA2LjY0Mjk4MSwtMC4zODg2OCAxMC4yNTgzNiwtMS41OTEwNTggMi4xNzg5NzMsLTAuNzI0NjY4IDIuNjkyMTkzLC0wLjgxNTg1NiAyLjgxMzQ0NCwtMC40OTk4ODMgMC4wODE1NywwLjIxMjU2IDAuMDg2NjQsMi4xMTk4NjQgMC4wMTEyNyw0LjIzODQ1MyAtMC4xMDYyMTcsMi45ODU4MSAtMC4yNjY1MzEsNC4yMTI5MzggLTAuNzEyOTM1LDUuNDU3MjA4IC0xLjQ1MDIxNyw0LjA0MjIwNiAtNC40MDExMTgsNi44NDQxNTYgLTguNDM3OTM4LDguMDEyMDE3IC0yLjMxNDc0NywwLjY2OTY2MSAtMy4zNDMxNCwwLjc3MjIxNSAtNS4xOTM0NjUsMC41MTc5MDIgeiIKICAgaWQ9InBhdGgzNzcyIgogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPjwvZz4KPHBhdGgKICAgc3R5bGU9ImZpbGw6IzY2Q0NGRjtzdHJva2U6IzY2Q0NGRjtzdHJva2Utd2lkdGg6MC4yNzExODY0Mzk5OTk5OTk5NyIKICAgZD0ibSAyOC43NDA1NTYsNDAuMDYzNjgyIGMgLTIuNDU3Nzk1LC0wLjI4NDk5NSAtNS4yOTE1MjIsLTAuOTc2ODgxIC03LjQ3OTUzOSwtMS44MjYyMTIgLTAuOTY5NDkyLC0wLjM3NjMzMiAtMS43OTI5MzksLTAuNzA0OTYxIC0xLjgyOTg4NCwtMC43MzAyODcgLTAuMTUyNTY0LC0wLjEwNDU4NCAwLjc2NjAxNiwtNi4yNDI1NDEgMS4xNjgwMSwtNy44MDQ2NTYgMS40MjExOTEsLTUuNTIyNjMxIDQuMzA0NDc3LC04LjA2MTg0OSA5LjE1NDI0MSwtOC4wNjE4NDkgbCAxLjU0MTUzMSwwIDAsMS42MjcxMTkgYyAwLDEuMjM3MTI1IC0wLjA5MzgxLDEuNjI3MTE4IC0wLjM5MTQwMiwxLjYyNzExOCAtMC4yMTUyNzEsMCAtMC41ODEzNzMsMC4yNzEyMjEgLTAuODEzNTU5LDAuNjAyNzE0IC0wLjM0NTg4OSwwLjQ5MzgyNiAtMC40MjIxNTcsMS41Mjc1MjQgLTAuNDIyMTU3LDUuNzIxNzA2IGwgMCw1LjExODk5MiAwLjgxMzU1OSwwLjc1OTk3OCBjIDAuNjc1ODQ2LDAuNjMxMzM1IDAuODEzNTU5LDAuOTcxMDgzIDAuODEzNTU5LDIuMDA3MTA4IDAsMC44MzU5MjEgLTAuMTExNzcxLDEuMjM1Mzc4IC0wLjMzODk4MywxLjIxMTQ4OSAtMC4xODY0NCwtMC4wMTk2IC0xLjE4MzM2LC0wLjEzMzU1MSAtMi4yMTUzNzYsLTAuMjUzMjIgbCAwLDAgeiIKICAgaWQ9InBhdGgzNzY2IgogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPjwvc3ZnPg==\">\r\n            </div>\r\n            <div class=\"row-word\">\u65CB\u8F6C</div>\r\n        </div>\r\n        <div class=\"tip-row\">\r\n            <div class=\"row-img\">\r\n                <img\r\n                    src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iTGF5ZXJfMSIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHdpZHRoPSI2NHB4IgogICBoZWlnaHQ9IjY0cHgiCiAgIHZpZXdCb3g9IjAgMCA2NCA2NCIKICAgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNjQgNjQiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDguNCByOTkzOSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iTW91c2VSaWdodC5zdmciPjxtZXRhZGF0YQogICBpZD0ibWV0YWRhdGEyMSI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgIHJkZjphYm91dD0iIj48ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD48ZGM6dHlwZQogICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjxkYzp0aXRsZSAvPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICBpZD0iZGVmczE5IiAvPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgZ3JpZHRvbGVyYW5jZT0iMTAiCiAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgIGlua3NjYXBlOnBhZ2VzaGFkb3c9IjIiCiAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTI4MiIKICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODg2IgogICBpZD0ibmFtZWR2aWV3MTciCiAgIHNob3dncmlkPSJmYWxzZSIKICAgaW5rc2NhcGU6em9vbT0iMy42ODc1IgogICBpbmtzY2FwZTpjeD0iMzIiCiAgIGlua3NjYXBlOmN5PSIzMiIKICAgaW5rc2NhcGU6d2luZG93LXg9IjMxIgogICBpbmtzY2FwZTp3aW5kb3cteT0iMTUiCiAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiCiAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImczIiAvPgo8ZwogICBpZD0iZzMiPgoJPGcKICAgaWQ9Imc1IgogICBzdHlsZT0ic3Ryb2tlOiM0ZDRkNGQ7ZmlsbDojNGQ0ZDRkIj4KCQk8cGF0aAogICBmaWxsPSIjMDIwMjAyIgogICBkPSJNMzIuODU0LDIwLjAyOGMtMC4wMTUtMS4yNzQsMC41NzYtMi4yNjksMS4xNTEtMy4yMzZjMC43NTgtMS4yNzgsMS41NDMtMi42LDAuOTk3LTQuNDE3ICAgIGMtMC41NTUtMS42NjctMS42MDctMi40ODUtMi41MzktMy4yMTJjLTEuMjU0LTAuOTczLTIuMTU5LTEuNjc2LTEuNjg3LTQuMzQzbDAuMDQxLTAuMjI5bC0xLjM1LTAuMjM4TDI5LjQyNyw0LjU4ICAgIGMtMC42MTUsMy40ODQsMC44NzgsNC42NDMsMi4xOTUsNS42NjZjMC44NSwwLjY2MywxLjY1MywxLjI4OCwyLjA3MiwyLjU0MmMwLjM2NiwxLjIyNC0wLjE4LDIuMTQzLTAuODY5LDMuMzA2ICAgIGMtMC42NDEsMS4wODEtMS4zNjYsMi4zLTEuMzQ5LDMuOTMzYy02LjgzNywwLjAwNy0xMy44MjMsMC4yOTEtMTMuODIzLDI0LjU5YzAsMTAuOTUxLDguNzk5LDE1LjAzMiwxNC4zNDcsMTUuMDMyICAgIGM1LjU0NSwwLDE0LjM0Ny00LjA4MSwxNC4zNDctMTUuMDMyQzQ2LjM0NywyMC4zNDcsMzkuMjI4LDIwLjA0OCwzMi44NTQsMjAuMDI4eiBNMzIuNjg1LDIxLjM5OSAgICBjNS42NDMsMC4wMTIsMTAuOTI3LDAuMjM2LDEyLjA2MywxNi4xNTNjLTMuODYsMS44MDUtNy45MTYsMi43NjUtMTIuMDYzLDIuODZ2LTIuOTY2YzAuODQ1LTAuMTYyLDEuNDgxLTAuOTA5LDEuNDgxLTEuNzgydi04Ljk1NiAgICBjMC0wLjg3Ni0wLjYzNy0xLjYyMS0xLjQ4MS0xLjc4NFYyMS4zOTl6IE0zMS42NTgsMjYuMjU0aDAuNjg1YzAuMjQ5LDAsMC40NTMsMC4yMDUsMC40NTMsMC40NTR2OC45NTYgICAgYzAsMC4yNDktMC4yMDQsMC40NDktMC40NTMsMC40NDloLTAuNjg1Yy0wLjI0OSwwLTAuNDUyLTAuMi0wLjQ1Mi0wLjQ0OXYtOC45NTZDMzEuMjA2LDI2LjQ1OSwzMS40MDksMjYuMjU0LDMxLjY1OCwyNi4yNTR6ICAgICBNMzEuMzEzLDIxLjM5OXYzLjUyNWMtMC44NDUsMC4xNjMtMS40NzksMC45MS0xLjQ3OSwxLjc4NHY4Ljk1NmMwLDAuODczLDAuNjM0LDEuNjIsMS40NzksMS43ODJ2Mi45NjYgICAgYy02LjMxMS0wLjE0OC0xMC45MDUtMi4yNTItMTIuMDYzLTIuODM5QzIwLjM4MSwyMS42MzMsMjUuNjY4LDIxLjQxMSwzMS4zMTMsMjEuMzk5eiBNMzIsNTguMjc0ICAgIGMtNS4wMTYsMC0xMi45NzYtMy43MDctMTIuOTc2LTEzLjY1OGMwLTEuOTgzLDAuMDQ1LTMuODUzLDAuMTM0LTUuNTYzYzIuMDAzLDAuOTI5LDYuNjk2LDIuNzQsMTIuODY4LDIuNzQgICAgYzQuMzk0LDAsOC43MDQtMC45MzQsMTIuODEzLTIuNzcxYzAuMDg5LDEuNzE4LDAuMTM1LDMuNiwwLjEzNSw1LjU5NUM0NC45NzQsNTQuNTY3LDM3LjAxNiw1OC4yNzQsMzIsNTguMjc0eiIKICAgaWQ9InBhdGg3IgogICBzdHlsZT0ic3Ryb2tlOiM0ZDRkNGQ7ZmlsbDojNGQ0ZDRkIiAvPgoJPC9nPgoJCgkKPHBhdGgKICAgc3R5bGU9ImZpbGw6IzY1RkQwMDtzdHJva2U6IzY1RkQwMDtzdHJva2Utd2lkdGg6MC4yNzExODY0Mzk5OTk5OTk5NyIKICAgZD0ibSAzMi45MjIwMzQsMzguOTUwNzkzIGMgMCwtMS4xMzU4MjUgMC4xMTQ5MTksLTEuNDU4MDQ1IDAuNjc3OTY2LC0xLjkwMDkzOCBsIDAuNjc3OTY2LC0wLjUzMzI4OCAwLC01LjI4MDc4IGMgMCwtNS4yNzEyNDkgLTAuMDAxMiwtNS4yODIwMDMgLTAuNjc3OTY2LC01Ljk1ODc0NSAtMC41NTc0MzksLTAuNTU3NDM5IC0wLjY3Nzk2NiwtMC45NDA5MzUgLTAuNjc3OTY2LC0yLjE1NzE2NSBsIDAsLTEuNDc5MTk5IDEuNTM1NDg3LDAgYyA1LjY1NzU1NCwwIDguNTg0MzM4LDMuNzI4NTI5IDkuNzE4NTUsMTIuMzgwNzkxIDAuNDk4NDM0LDMuODAyMjY1IDAuNTAzNDgsMy41MjU3MzEgLTAuMDY3NiwzLjcwNDU3MiAtMC4yNjEwMTcsMC4wODE3NCAtMS41Mjg2OTQsMC41MTIwMTYgLTIuODE3MDU5LDAuOTU2MTY3IC0yLjAzNzIwNiwwLjcwMjMwNiAtNC4wNDgwMzIsMS4xMTMwNDQgLTcuNDg4MDI2LDEuNTI5NTI4IGwgLTAuODgxMzU2LDAuMTA2NzA3IDAsLTEuMzY3NjUgeiIKICAgaWQ9InBhdGgzNzY4IgogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPjxwYXRoCiAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjAuMjcxMTg2NDQiCiAgIGQ9Im0gMzEuNDg1MDgxLDM1Ljg0MjE0MyBjIC0wLjEwNDU5MSwtMC4xMDQ1OTEgLTAuMTkwMTY2LC0yLjIzMTM0NyAtMC4xOTAxNjYsLTQuNzI2MTIzIDAsLTMuOTgzOTk0IDAuMDU1MDIsLTQuNTU3MDcxIDAuNDUyMTI3LC00LjcwOTQ1NiAwLjI0ODY3LC0wLjA5NTQyIDAuNTU2ODAyLC0wLjA2ODgyIDAuNjg0NzM4LDAuMDU5MTIgMC4xMjc5MzcsMC4xMjc5MzYgMC4xOTkwNTYsMi4yOTY0ODEgMC4xNTgwNDMsNC44MTg5ODggLTAuMDYzMTksMy44ODY0MDUgLTAuMTM4NjcsNC41OTg2ODMgLTAuNDk0NTcyLDQuNjY3MDA5IC0wLjIzMTAwMywwLjA0NDM1IC0wLjUwNTU3OSwtMC4wMDQ5IC0wLjYxMDE3LC0wLjEwOTUzMyBsIDAsMCB6IgogICBpZD0icGF0aDM3NzAiCiAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PHBhdGgKICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtzdHJva2U6I2ZmZmZmZjtzdHJva2Utd2lkdGg6MC4yNzExODY0NCIKICAgZD0ibSAzMC40NDA0MzMsNTcuOTQ1MzE2IGMgLTMuMDY0MDUzLC0wLjQyMTEzIC02Ljc3NzIzLC0yLjQ3NDk1MyAtOC40NTc2MjEsLTQuNjc4MDYgLTIuMTU4OCwtMi44MzAzMzMgLTMuMTEzOTE4LC02LjczNzcxNiAtMi43Njk1OTIsLTExLjMzMDM4NSBsIDAuMTkzMTIxLC0yLjU3NTg3MiAyLjA3OTg4LDAuNzM1NjI4IGMgMy41MjcwMjYsMS4yNDc0NjYgNi4zMzc3MDEsMS43MTkwNjggMTAuMjE1NDc0LDEuNzE0MDUgNC4xNzE3NzEsLTAuMDA1NCA2LjY0Mjk4MSwtMC4zODg2OCAxMC4yNTgzNiwtMS41OTEwNTggMi4xNzg5NzMsLTAuNzI0NjY4IDIuNjkyMTkzLC0wLjgxNTg1NiAyLjgxMzQ0NCwtMC40OTk4ODMgMC4wODE1NywwLjIxMjU2IDAuMDg2NjQsMi4xMTk4NjQgMC4wMTEyNyw0LjIzODQ1MyAtMC4xMDYyMTcsMi45ODU4MSAtMC4yNjY1MzEsNC4yMTI5MzggLTAuNzEyOTM1LDUuNDU3MjA4IC0xLjQ1MDIxNyw0LjA0MjIwNiAtNC40MDExMTgsNi44NDQxNTYgLTguNDM3OTM4LDguMDEyMDE3IC0yLjMxNDc0NywwLjY2OTY2MSAtMy4zNDMxNCwwLjc3MjIxNSAtNS4xOTM0NjUsMC41MTc5MDIgeiIKICAgaWQ9InBhdGgzNzcyIgogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPjxwYXRoCiAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjAuMjcxMTg2NDQiCiAgIGQ9Im0gMjguNzQwNTU2LDQwLjA2MzY4MiBjIC0yLjQ1Nzc5NSwtMC4yODQ5OTUgLTUuMjkxNTIyLC0wLjk3Njg4MSAtNy40Nzk1MzksLTEuODI2MjEyIC0wLjk2OTQ5MiwtMC4zNzYzMzIgLTEuNzkyOTM5LC0wLjcwNDk2MSAtMS44Mjk4ODQsLTAuNzMwMjg3IC0wLjE1MjU2NCwtMC4xMDQ1ODQgMC43NjYwMTYsLTYuMjQyNTQxIDEuMTY4MDEsLTcuODA0NjU2IDEuNDIxMTkxLC01LjUyMjYzMSA0LjMwNDQ3NywtOC4wNjE4NDkgOS4xNTQyNDEsLTguMDYxODQ5IGwgMS41NDE1MzEsMCAwLDEuNjI3MTE5IGMgMCwxLjIzNzEyNSAtMC4wOTM4MSwxLjYyNzExOCAtMC4zOTE0MDIsMS42MjcxMTggLTAuMjE1MjcxLDAgLTAuNTgxMzczLDAuMjcxMjIxIC0wLjgxMzU1OSwwLjYwMjcxNCAtMC4zNDU4ODksMC40OTM4MjYgLTAuNDIyMTU3LDEuNTI3NTI0IC0wLjQyMjE1Nyw1LjcyMTcwNiBsIDAsNS4xMTg5OTIgMC44MTM1NTksMC43NTk5NzggYyAwLjY3NTg0NiwwLjYzMTMzNSAwLjgxMzU1OSwwLjk3MTA4MyAwLjgxMzU1OSwyLjAwNzEwOCAwLDAuODM1OTIxIC0wLjExMTc3MSwxLjIzNTM3OCAtMC4zMzg5ODMsMS4yMTE0ODkgLTAuMTg2NDQsLTAuMDE5NiAtMS4xODMzNiwtMC4xMzM1NTEgLTIuMjE1Mzc2LC0wLjI1MzIyIGwgMCwwIHoiCiAgIGlkPSJwYXRoMzc3OCIKICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz48L2c+Cjwvc3ZnPg==\">\r\n            </div>\r\n            <div class=\"row-word\">\u5E73\u79FB</div>\r\n        </div>\r\n        <div class=\"tip-row\">\r\n            <div class=\"row-img\">\r\n                <img\r\n                    src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNS4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4KCjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICBpZD0iTGF5ZXJfMSIKICAgeD0iMHB4IgogICB5PSIwcHgiCiAgIHdpZHRoPSI2NHB4IgogICBoZWlnaHQ9IjY0cHgiCiAgIHZpZXdCb3g9IjAgMCA2NCA2NCIKICAgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNjQgNjQiCiAgIHhtbDpzcGFjZT0icHJlc2VydmUiCiAgIGlua3NjYXBlOnZlcnNpb249IjAuNDguNCByOTkzOSIKICAgc29kaXBvZGk6ZG9jbmFtZT0iTW91c2VNaWRkbGUuc3ZnIj48bWV0YWRhdGEKICAgaWQ9Im1ldGFkYXRhMjEiPjxyZGY6UkRGPjxjYzpXb3JrCiAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48ZGM6dGl0bGUgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgaWQ9ImRlZnMxOSIgLz48c29kaXBvZGk6bmFtZWR2aWV3CiAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgIG9iamVjdHRvbGVyYW5jZT0iMTAiCiAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwIgogICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjEyODIiCiAgIGlua3NjYXBlOndpbmRvdy1oZWlnaHQ9Ijg4NiIKICAgaWQ9Im5hbWVkdmlldzE3IgogICBzaG93Z3JpZD0iZmFsc2UiCiAgIGlua3NjYXBlOnpvb209IjMuNjg3NSIKICAgaW5rc2NhcGU6Y3g9Ii0xMC4zMDUwODUiCiAgIGlua3NjYXBlOmN5PSIzMiIKICAgaW5rc2NhcGU6d2luZG93LXg9IjMxIgogICBpbmtzY2FwZTp3aW5kb3cteT0iMTUiCiAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiCiAgIGlua3NjYXBlOmN1cnJlbnQtbGF5ZXI9ImczIiAvPgo8ZwogICBpZD0iZzMiPgoJPGcKICAgaWQ9Imc1IgogICBzdHlsZT0ic3Ryb2tlOiM0ZDRkNGQ7ZmlsbDojNGQ0ZDRkIj4KCQk8cGF0aAogICBmaWxsPSIjMDIwMjAyIgogICBkPSJNMzIuODU0LDIwLjAyOGMtMC4wMTUtMS4yNzQsMC41NzYtMi4yNjksMS4xNTEtMy4yMzZjMC43NTgtMS4yNzgsMS41NDMtMi42LDAuOTk3LTQuNDE3ICAgIGMtMC41NTUtMS42NjctMS42MDctMi40ODUtMi41MzktMy4yMTJjLTEuMjU0LTAuOTczLTIuMTU5LTEuNjc2LTEuNjg3LTQuMzQzbDAuMDQxLTAuMjI5bC0xLjM1LTAuMjM4TDI5LjQyNyw0LjU4ICAgIGMtMC42MTUsMy40ODQsMC44NzgsNC42NDMsMi4xOTUsNS42NjZjMC44NSwwLjY2MywxLjY1MywxLjI4OCwyLjA3MiwyLjU0MmMwLjM2NiwxLjIyNC0wLjE4LDIuMTQzLTAuODY5LDMuMzA2ICAgIGMtMC42NDEsMS4wODEtMS4zNjYsMi4zLTEuMzQ5LDMuOTMzYy02LjgzNywwLjAwNy0xMy44MjMsMC4yOTEtMTMuODIzLDI0LjU5YzAsMTAuOTUxLDguNzk5LDE1LjAzMiwxNC4zNDcsMTUuMDMyICAgIGM1LjU0NSwwLDE0LjM0Ny00LjA4MSwxNC4zNDctMTUuMDMyQzQ2LjM0NywyMC4zNDcsMzkuMjI4LDIwLjA0OCwzMi44NTQsMjAuMDI4eiBNMzIuNjg1LDIxLjM5OSAgICBjNS42NDMsMC4wMTIsMTAuOTI3LDAuMjM2LDEyLjA2MywxNi4xNTNjLTMuODYsMS44MDUtNy45MTYsMi43NjUtMTIuMDYzLDIuODZ2LTIuOTY2YzAuODQ1LTAuMTYyLDEuNDgxLTAuOTA5LDEuNDgxLTEuNzgydi04Ljk1NiAgICBjMC0wLjg3Ni0wLjYzNy0xLjYyMS0xLjQ4MS0xLjc4NFYyMS4zOTl6IE0zMS42NTgsMjYuMjU0aDAuNjg1YzAuMjQ5LDAsMC40NTMsMC4yMDUsMC40NTMsMC40NTR2OC45NTYgICAgYzAsMC4yNDktMC4yMDQsMC40NDktMC40NTMsMC40NDloLTAuNjg1Yy0wLjI0OSwwLTAuNDUyLTAuMi0wLjQ1Mi0wLjQ0OXYtOC45NTZDMzEuMjA2LDI2LjQ1OSwzMS40MDksMjYuMjU0LDMxLjY1OCwyNi4yNTR6ICAgICBNMzEuMzEzLDIxLjM5OXYzLjUyNWMtMC44NDUsMC4xNjMtMS40NzksMC45MS0xLjQ3OSwxLjc4NHY4Ljk1NmMwLDAuODczLDAuNjM0LDEuNjIsMS40NzksMS43ODJ2Mi45NjYgICAgYy02LjMxMS0wLjE0OC0xMC45MDUtMi4yNTItMTIuMDYzLTIuODM5QzIwLjM4MSwyMS42MzMsMjUuNjY4LDIxLjQxMSwzMS4zMTMsMjEuMzk5eiBNMzIsNTguMjc0ICAgIGMtNS4wMTYsMC0xMi45NzYtMy43MDctMTIuOTc2LTEzLjY1OGMwLTEuOTgzLDAuMDQ1LTMuODUzLDAuMTM0LTUuNTYzYzIuMDAzLDAuOTI5LDYuNjk2LDIuNzQsMTIuODY4LDIuNzQgICAgYzQuMzk0LDAsOC43MDQtMC45MzQsMTIuODEzLTIuNzcxYzAuMDg5LDEuNzE4LDAuMTM1LDMuNiwwLjEzNSw1LjU5NUM0NC45NzQsNTQuNTY3LDM3LjAxNiw1OC4yNzQsMzIsNTguMjc0eiIKICAgaWQ9InBhdGg3IgogICBzdHlsZT0ic3Ryb2tlOiM0ZDRkNGQ7ZmlsbDojNGQ0ZDRkIiAvPgoJPC9nPgoJCgkKPHBhdGgKICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtzdHJva2U6I2ZmZmZmZjtzdHJva2Utd2lkdGg6MC4yNzExODY0Mzk5OTk5OTk5NyIKICAgZD0ibSAzMi45MjIwMzQsMzguOTUwNzkzIGMgMCwtMS4xMzU4MjUgMC4xMTQ5MTksLTEuNDU4MDQ1IDAuNjc3OTY2LC0xLjkwMDkzOCBsIDAuNjc3OTY2LC0wLjUzMzI4OCAwLC01LjI4MDc4IGMgMCwtNS4yNzEyNDkgLTAuMDAxMiwtNS4yODIwMDMgLTAuNjc3OTY2LC01Ljk1ODc0NSAtMC41NTc0MzksLTAuNTU3NDM5IC0wLjY3Nzk2NiwtMC45NDA5MzUgLTAuNjc3OTY2LC0yLjE1NzE2NSBsIDAsLTEuNDc5MTk5IDEuNTM1NDg3LDAgYyA1LjY1NzU1NCwwIDguNTg0MzM4LDMuNzI4NTI5IDkuNzE4NTUsMTIuMzgwNzkxIDAuNDk4NDM0LDMuODAyMjY1IDAuNTAzNDgsMy41MjU3MzEgLTAuMDY3NiwzLjcwNDU3MiAtMC4yNjEwMTcsMC4wODE3NCAtMS41Mjg2OTQsMC41MTIwMTYgLTIuODE3MDU5LDAuOTU2MTY3IC0yLjAzNzIwNiwwLjcwMjMwNiAtNC4wNDgwMzIsMS4xMTMwNDQgLTcuNDg4MDI2LDEuNTI5NTI4IGwgLTAuODgxMzU2LDAuMTA2NzA3IDAsLTEuMzY3NjUgeiIKICAgaWQ9InBhdGgzNzY4IgogICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIiAvPjxwYXRoCiAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7c3Ryb2tlOiNmZmZmZmY7c3Ryb2tlLXdpZHRoOjAuMjcxMTg2NDQiCiAgIGQ9Im0gMzAuNDQwNDMzLDU3Ljk0NTMxNiBjIC0zLjA2NDA1MywtMC40MjExMyAtNi43NzcyMywtMi40NzQ5NTMgLTguNDU3NjIxLC00LjY3ODA2IC0yLjE1ODgsLTIuODMwMzMzIC0zLjExMzkxOCwtNi43Mzc3MTYgLTIuNzY5NTkyLC0xMS4zMzAzODUgbCAwLjE5MzEyMSwtMi41NzU4NzIgMi4wNzk4OCwwLjczNTYyOCBjIDMuNTI3MDI2LDEuMjQ3NDY2IDYuMzM3NzAxLDEuNzE5MDY4IDEwLjIxNTQ3NCwxLjcxNDA1IDQuMTcxNzcxLC0wLjAwNTQgNi42NDI5ODEsLTAuMzg4NjggMTAuMjU4MzYsLTEuNTkxMDU4IDIuMTc4OTczLC0wLjcyNDY2OCAyLjY5MjE5MywtMC44MTU4NTYgMi44MTM0NDQsLTAuNDk5ODgzIDAuMDgxNTcsMC4yMTI1NiAwLjA4NjY0LDIuMTE5ODY0IDAuMDExMjcsNC4yMzg0NTMgLTAuMTA2MjE3LDIuOTg1ODEgLTAuMjY2NTMxLDQuMjEyOTM4IC0wLjcxMjkzNSw1LjQ1NzIwOCAtMS40NTAyMTcsNC4wNDIyMDYgLTQuNDAxMTE4LDYuODQ0MTU2IC04LjQzNzkzOCw4LjAxMjAxNyAtMi4zMTQ3NDcsMC42Njk2NjEgLTMuMzQzMTQsMC43NzIyMTUgLTUuMTkzNDY1LDAuNTE3OTAyIHoiCiAgIGlkPSJwYXRoMzc3MiIKICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIgLz48cGF0aAogICBzdHlsZT0iZmlsbDojZmZmZmZmO3N0cm9rZTojZmZmZmZmO3N0cm9rZS13aWR0aDowLjI3MTE4NjQ0IgogICBkPSJtIDI4Ljc0MDU1Niw0MC4wNjM2ODIgYyAtMi40NTc3OTUsLTAuMjg0OTk1IC01LjI5MTUyMiwtMC45NzY4ODEgLTcuNDc5NTM5LC0xLjgyNjIxMiAtMC45Njk0OTIsLTAuMzc2MzMyIC0xLjc5MjkzOSwtMC43MDQ5NjEgLTEuODI5ODg0LC0wLjczMDI4NyAtMC4xNTI1NjQsLTAuMTA0NTg0IDAuNzY2MDE2LC02LjI0MjU0MSAxLjE2ODAxLC03LjgwNDY1NiAxLjQyMTE5MSwtNS41MjI2MzEgNC4zMDQ0NzcsLTguMDYxODQ5IDkuMTU0MjQxLC04LjA2MTg0OSBsIDEuNTQxNTMxLDAgMCwxLjYyNzExOSBjIDAsMS4yMzcxMjUgLTAuMDkzODEsMS42MjcxMTggLTAuMzkxNDAyLDEuNjI3MTE4IC0wLjIxNTI3MSwwIC0wLjU4MTM3MywwLjI3MTIyMSAtMC44MTM1NTksMC42MDI3MTQgLTAuMzQ1ODg5LDAuNDkzODI2IC0wLjQyMjE1NywxLjUyNzUyNCAtMC40MjIxNTcsNS43MjE3MDYgbCAwLDUuMTE4OTkyIDAuODEzNTU5LDAuNzU5OTc4IGMgMC42NzU4NDYsMC42MzEzMzUgMC44MTM1NTksMC45NzEwODMgMC44MTM1NTksMi4wMDcxMDggMCwwLjgzNTkyMSAtMC4xMTE3NzEsMS4yMzUzNzggLTAuMzM4OTgzLDEuMjExNDg5IC0wLjE4NjQ0LC0wLjAxOTYgLTEuMTgzMzYsLTAuMTMzNTUxIC0yLjIxNTM3NiwtMC4yNTMyMiBsIDAsMCB6IgogICBpZD0icGF0aDM3NzgiCiAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PHBhdGgKICAgc3R5bGU9ImZpbGw6I2ZmZDgwMDtzdHJva2U6I2ZmZDgwMDtzdHJva2Utd2lkdGg6MC4zMzg3MDk2NSIKICAgZD0ibSAzMS4zNTYyNDMsMzUuODA5MjY0IGMgLTAuMTY0MzE0LC0wLjEwMzg1NiAtMC4yOTg3NTMsLTIuMjE1NjgyIC0wLjI5ODc1MywtNC42OTI5NDUgMCwtMy45NTYwMjYgMC4wODY0NCwtNC41MjUwOCAwLjcxMDI5NiwtNC42NzYzOTUgMC4zOTA2NjMsLTAuMDk0NzUgMC44NzQ3NCwtMC4wNjgzNCAxLjA3NTcyOSwwLjA1ODcgMC4yMDA5OTEsMC4xMjcwMzggMC4zMTI3MTksMi4yODAzNiAwLjI0ODI4OCw0Ljc4NTE1OSAtMC4wOTkyNywzLjg1OTEyMiAtMC4yMTc4NTMsNC41NjY0MDEgLTAuNzc2OTc3LDQuNjM0MjQ3IC0wLjM2MjkwOSwwLjA0NDA0IC0wLjc5NDI3LC0wLjAwNDkgLTAuOTU4NTgzLC0wLjEwODc2NSBsIDAsMCB6IgogICBpZD0icGF0aDM3NzAiCiAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiIC8+PC9nPgo8L3N2Zz4=\">\r\n            </div>\r\n            <div class=\"row-word\">\u7F29\u653E</div>\r\n        </div>\r\n    </div>\r\n    <div id=\"control\"></div>\r\n</div>", styles: ["#objViewer{width:100%;height:100%;position:relative;overflow:hidden}#objViewer .loading{position:absolute;left:0;top:0;width:100%;height:100%}#objViewer .loading .nc-loading{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;background-color:#fff}#objViewer .loading .nc-loading .nc-loading-svg{width:80px;height:80px;animation:animation 5s infinite linear;--ov_logo_border_color: #000000}#objViewer .loading .nc-loading .ncTips{font-size:18px;margin-top:18px;letter-spacing:2px;color:#d4d4d4;mix-blend-mode:difference;display:flex;flex-direction:column;align-items:center;justify-content:center}@keyframes animation{to{transform:rotate(1turn)}}#objViewer #tips{position:absolute;left:10px;top:10px;border:1px solid #444;background-color:#262626bf;border-radius:10px;padding:0 20px 8px 10px}#objViewer #tips .tip-row{display:flex;align-items:flex-end;color:#fff}#objViewer #tips .tip-row .row-img{width:36px;height:36px}#objViewer #tips .tip-row .row-img img{width:100%;height:100%}#objViewer ::ng-deep #control{position:absolute;right:0;top:0}#objViewer ::ng-deep #control option{color:#000!important}#objViewer ::ng-deep #control .lil-gui.root>.children{max-height:600px}\n"], directives: [{ type: i2__namespace.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
    i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0__namespace, type: ObjViewerComponent, decorators: [{
                type: i0.Component,
                args: [{
                        selector: 'nc-obj-viewer',
                        templateUrl: './obj-viewer.component.html',
                        styleUrls: ['./obj-viewer.component.less']
                    }]
            }], ctorParameters: function () { return [{ type: i0__namespace.ElementRef }, { type: LocalService }]; }, propDecorators: { ncObjInfo: [{
                    type: i0.Input
                }], ncCameraPlacement: [{
                    type: i0.Input
                }], ncBg: [{
                    type: i0.Input
                }], ncBgColor: [{
                    type: i0.Input
                }], ncBgUrl: [{
                    type: i0.Input
                }], ncTips: [{
                    type: i0.Input
                }], ncControl: [{
                    type: i0.Input
                }], ncAlpha: [{
                    type: i0.Input
                }], ncAutoRotate: [{
                    type: i0.Input
                }], ncAutoRotateSpeed: [{
                    type: i0.Input
                }] } });

    var NcObjViewerModule = /** @class */ (function () {
        function NcObjViewerModule() {
        }
        return NcObjViewerModule;
    }());
    NcObjViewerModule.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0__namespace, type: NcObjViewerModule, deps: [], target: i0__namespace.ɵɵFactoryTarget.NgModule });
    NcObjViewerModule.ɵmod = i0__namespace.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0__namespace, type: NcObjViewerModule, declarations: [ObjViewerComponent], imports: [i2.CommonModule], exports: [ObjViewerComponent] });
    NcObjViewerModule.ɵinj = i0__namespace.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0__namespace, type: NcObjViewerModule, imports: [[
                i2.CommonModule
            ]] });
    i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0__namespace, type: NcObjViewerModule, decorators: [{
                type: i0.NgModule,
                args: [{
                        declarations: [
                            ObjViewerComponent
                        ],
                        imports: [
                            i2.CommonModule
                        ],
                        exports: [
                            ObjViewerComponent
                        ]
                    }]
            }] });

    /**
     * Generated bundle index. Do not edit.
     */

    exports.NcObjViewerModule = NcObjViewerModule;
    exports.ObjViewerComponent = ObjViewerComponent;

    Object.defineProperty(exports, '__esModule', { value: true });

}));
//# sourceMappingURL=ng-cw-v12-obj-viewer.umd.js.map